"""
Phone lookup services for customer phone number validation and information.
"""

import logging
from typing import Optional, Dict
import phonenumbers
from phonenumbers import geocoder, carrier
from phonenumbers.phonenumberutil import NumberParseException

logger = logging.getLogger(__name__)


def lookup_phone_number(phone: str) -> Dict:
    """
    Lookup phone number information including validation, formatting, and carrier details.
    
    Args:
        phone: Phone number string (can be in various formats)
        
    Returns:
        Dictionary containing phone number information
    """
    try:
        # Try to parse the phone number without a region first (for international format)
        try:
            parsed_number = phonenumbers.parse(phone, None)
        except NumberParseException:
            # If that fails, try with US as default region for numbers without country code
            parsed_number = phonenumbers.parse(phone, "US")
        
        # Validate the phone number
        is_valid = phonenumbers.is_valid_number(parsed_number)
        
        # Get country code
        country_code = phonenumbers.region_code_for_number(parsed_number)
        
        # Format number in national format
        national_format = phonenumbers.format_number(
            parsed_number, 
            phonenumbers.PhoneNumberFormat.NATIONAL
        )
        
        # Remove leading "1" if present (for US/Canada numbers)
        if national_format.startswith("1"):
            national_format = national_format[1:].lstrip()
        
        # Get location information (city/state)
        location = geocoder.description_for_number(parsed_number, "en")
        
        # Split location into city and state if possible
        city = ""
        state = ""
        if location:
            parts = location.split(", ")
            if len(parts) == 2:
                city = parts[0]
                state = parts[1]
            elif len(parts) == 1:
                state = parts[0]
        
        # Get carrier information
        carrier_name = carrier.name_for_number(parsed_number, "en")
        
        return {
            "country_code": country_code or "",
            "national_format": national_format,
            "city": city,
            "state": state,
            "altspid_carrier_name": "",
            "carrier": carrier_name if carrier_name else None,
            "valid_number": is_valid
        }
        
    except (NumberParseException, Exception) as e:
        logger.error(f"Error processing phone number {phone}: {e}")
        return {
            "country_code": "",
            "national_format": phone,
            "city": "",
            "state": "",
            "altspid_carrier_name": "",
            "carrier": None,
            "valid_number": False
        }
