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

logger = logging.getLogger(__name__)


class AppointmentNotificationContext:
    @staticmethod
    def build(
            appointment=None,
            bdc_number=None,
            customer_name=None,
            booking_datetime=None,
            service=None,
            customer_phone=None,
            dt_to_pacific=True,
            company=None,
    ):
        if appointment:
            customer_name = appointment.name or 'Unknown'
            customer_phone = appointment.appointment_phone
            booking_datetime = appointment.scheduled_date
            company = appointment.company.name if appointment.company else 'Dealership'
            bdc_number = appointment.company.bdc_number if appointment.company else None
            service = (
                appointment.booking_type
                if appointment.booking_type
                else (service or "N/A")
            )

        # if dt_to_pacific:
        #     pacific_dt = to_pacific(booking_datetime)
        #     date_str, time_str = format_datetime(pacific_dt)
        # else:
        #     date_str = booking_datetime
        #     time_str = 'N/A'

        try:
            pacific_dt = (
                to_pacific(booking_datetime)
                if dt_to_pacific
                else str_to_dt(booking_datetime)
            )
            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 = booking_datetime
            time_str = 'N/A'
            pass

        formatted_customer_phone = format_phone(customer_phone)

        return {
            "customer_name": customer_name,
            "customer_number": formatted_customer_phone,
            "company": company,
            "bdc_number": bdc_number,
            "date": date_str,
            "time": time_str,
            "booking_type": service,
            "dealership_name": company if company else 'Dealership',
        }


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
