import logging
import phonenumbers
from phonenumbers import PhoneNumberFormat
from utils.timezone_utils import format_datetime, to_pacific

logger = logging.getLogger(__name__)


class AppointmentNotificationContext:
    @staticmethod
    def build(appointment, extra):
        company_name = appointment.company.name or 'Dealership'

        try:
            pacific_dt = to_pacific(appointment.scheduled_date)
            formatted = format_datetime(pacific_dt)
            if not formatted:
                date_str, time_str = None, None
            else:
                date_str, time_str = formatted
        except Exception as e:
            logger.warning(f"unable to parse in ctx {e}")
            date_str = appointment.scheduled_date
            time_str = 'N/A'
            pass

        return {
            "customer_name": appointment.name or 'Unknown',
            "caller_id": format_phone(appointment.appointment_phone),
            "customer_number": extra.get(format_phone("customer_number"), 'N/A'),
            "company": company_name,
            "bdc_number": appointment.company.bdc_number or 'N/A',
            "date": date_str,
            "time": time_str,
            "booking_type": format_booking_type(appointment.booking_type),
            "dealership_name": company_name,
            "make": extra.get("make", 'N/A'),
            "model": extra.get("model", 'N/A'),
            "year": extra.get("year", 'N/A'),
        }


def format_phone(number: str, region="US"):
    if not number:
        return None

    try:
        phone = phonenumbers.parse(number, region)
        if not phonenumbers.is_valid_number(phone):
            return number  # fallback
        return phonenumbers.format_number(
            phone,
            PhoneNumberFormat.NATIONAL
        ).replace(" ", "")
    except Exception as exc:
        logger.warning(f'unbale to format phone number {exc}')
        return number


def format_booking_type(value: str) -> str:
    """
    Capitalizes the first letter of each word safely.
    Example:
        "oil change" -> "Oil Change"
        "  tire   rotation " -> "Tire Rotation"
    """
    if not value:
        return "N/A"

    try:
        # Normalize spaces and casing
        cleaned = " ".join(value.strip().split())
        return cleaned.title()
    except Exception as exc:
        logger.warning(f"Unable to format booking type: {exc}")
        return value
