import logging
from django.contrib.auth import get_user_model

from apps.appointments.services.notification_context import AppointmentNotificationContext
from apps.appointments.templates.notification_templates import booking_email_context
from apps.companies.models import Company
from apps.companies.services import CompanyContextService
from apps.calls.tasks.email_task import send_email_task
from apps.userprofile.models import UserProfile
from apps.userprofile.services import ProfileServices


User = get_user_model()
logger = logging.getLogger(__name__)


class EmailService:

    @staticmethod
    def send_email(
            subject,
            html_content,
            recipient_list,
            key=None,
            files=None,
    ):
        key = key or {}
        key.update(CompanyContextService.get_context())

        send_email_task.delay(
            subject=subject,
            html_content=html_content,
            recipient_list=recipient_list,
            key=key,
            files=files,
        )

    @staticmethod
    def send_booking_email(
            bdc_number,
            customer_name,
            booking_datetime,
            service,
            customer_phone,
    ):

        company = Company.objects.filter(bdc_number=bdc_number).first()
        if not company:
            return

        recipient_profile = UserProfile.objects.filter(
            phone_number=bdc_number
        ).first()

        if not recipient_profile:
            logger.warning(f"recipient not found for BDC Number {bdc_number}")
            return

        belongs = recipient_profile.user.belongs_to_company(company)

        if not belongs:
            logger.warning(
                f"recipient not belongs to "
                f"{company.name} against BDC Number {bdc_number}")
            return

        ctx = AppointmentNotificationContext.build(
            bdc_number=bdc_number,
            customer_name=customer_name,
            booking_datetime=booking_datetime,
            service=service,
            customer_phone=customer_phone,
            dt_to_pacific=False,
            company=company,
        )

        email = recipient_profile.user.email
        full_name = ProfileServices.resolve_display_name(profile=recipient_profile)

        EmailService.send_email(
            subject="New Appointment Booking",
            html_content="appointment/appointment_booking.html",
            recipient_list=[email],
            key=booking_email_context(ctx, full_name),
        )
