from celery import shared_task
from utils.celery.celery_base_task import *
from django.conf import settings
from django.core.mail import EmailMultiAlternatives, get_connection
from django.template.loader import render_to_string
import logging, os
from pathlib import Path
from openpyxl import Workbook
from openpyxl.styles import Font
from django.core.cache import cache
from .models import ContactUs
from datetime import datetime
from django.utils import timezone
from django.utils.timezone import localtime
from utils.email_templates import contact_us_sender_copy, contact_us_receiver_copy

logging.basicConfig(
    level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s"
)

BASE_DIR = Path(__file__).resolve().parent
BASE_REPORTS_DIRECTORY = f"{BASE_DIR}/reports"


def apply_download_filters_of_inquiries(filters_dict):
    start_date = filters_dict.get("start_date", None)  # YYYY-MM-DD format
    end_date = filters_dict.get("end_date", None)
    inquiry_status = filters_dict.get("status", None)

    queryset = ContactUs.objects.order_by("-created_at")

    if start_date:
        start_date = datetime.strptime(start_date, "%Y-%m-%d")
        queryset = queryset.filter(created_at__gte=start_date)

    if end_date:
        end_date = datetime.strptime(end_date, "%Y-%m-%d")
        queryset = queryset.filter(created_at__lte=end_date)

    if inquiry_status:
        queryset = queryset.filter(status__iexact=end_date)

    return queryset


@shared_task
def download_report_of_general_inquiries(filters_dict=None):
    if not os.path.isdir(BASE_REPORTS_DIRECTORY):
        os.makedirs(BASE_REPORTS_DIRECTORY)
    else:
        files = os.listdir(BASE_REPORTS_DIRECTORY)

        for f in files:
            try:
                file_path = f"{BASE_REPORTS_DIRECTORY}/{f}"
                if os.path.isfile(file_path):
                    os.remove(file_path)
            except PermissionError:
                error_message = (
                    "Close any related files or previous file before downloading."
                )
                cache.set("general_inquiry_download_status", "error", timeout=300)
                cache.set("general_inquiry_download_errors", error_message, timeout=300)
                return

    cache.set("general_inquiry_download_status", "downloading", timeout=300)

    try:
        general_inquiries = apply_download_filters_of_inquiries(
            filters_dict=filters_dict
        )

        wb = Workbook()
        ws = wb.active
        ws.title = "General Inquiries"

        bold_font = Font(bold=True)

        ws.append(
            [
                "Date Inquired",
                "Inquirer",
                "Email",
                "Contact Number",
                "Inquiry",
                "Status",
            ]
        )

        for cell in ws[1]:  # make headers bold
            cell.font = bold_font

        for i in general_inquiries:
            local_created_at = localtime(i.created_at)
            formatted_date = local_created_at.strftime("%B %-d, %Y %-I:%M%p")
            full_name = f"{i.first_name} {i.last_name}"

            ws.append(
                [
                    formatted_date,
                    full_name,
                    i.email,
                    i.contact_number,
                    i.inquiry,
                    i.status.upper(),
                ]
            )

        time_now = timezone.localtime().strftime("%m%d%Y%H%M%S")
        file_name = f"{time_now}_generalinquiries.xlsx"
        file_path = f"{BASE_REPORTS_DIRECTORY}/{file_name}"

        wb.save(file_path)
        cache.set("general_inquiry_download_status", "finished", timeout=300)
        cache.set("general_inquiry_download_path", file_path, timeout=300)
    except Exception as e:
        cache.set("general_inquiry_download_status", "error", timeout=300)
        cache.set("general_inquiry_download_errors", str(e), timeout=300)


@shared_task
def send_contact_us_inquiry_emails(details: dict):  # pragma: no cover
    # Send copy to sender
    is_temp_email_service = bool(os.environ.get("IS_TEMP_EMAIL_SERVICE", False))

    if is_temp_email_service:
        contact_us_sender_copy(details=details)
        contact_us_receiver_copy(details=details)
        return

    logging.info(f"Sending copy of contact us inquiry to sender {details["email"]}")

    context = {
        "name": f"{details["first_name"]} {details["last_name"]}",
        "inquiry": details["inquiry"],
    }

    email_connection = get_connection(
        username=settings.EMAIL_HOST_USER,
        password=settings.EMAIL_HOST_PASSWORD,
    )

    email_html_message = render_to_string("email/contact_us_sender.html", context)
    email = EmailMultiAlternatives(
        subject="Thank you for your Inquiry - Caracole Philippines",
        body="An email for dexterton appointment",
        from_email=settings.EMAIL_HOST_USER,
        to=[details["email"]],
        connection=email_connection,
    )
    email.attach_alternative(email_html_message, "text/html")
    email.send()

    # Send appointment copy to receiver
    logging.info(f"Sending copy of appointment to receiver {settings.INQUIRY_RECEIVER}")
    context = {
        "name": f"{details["first_name"]} {details["last_name"]}",
        "email": details["email"],
        "contact_number": details["contact_number"],
        "inquiry": details["inquiry"],
    }
    email_html_message = render_to_string("email/contact_us_receiver.html", context)
    email = EmailMultiAlternatives(
        subject="New Inquiry Received via Contact Us Form",
        body="An email for dexterton appointment",
        from_email=details["email"],
        to=settings.INQUIRY_RECEIVER,
        cc=[settings.EMAIL_WEBDEV],
        connection=email_connection,
    )
    email.attach_alternative(email_html_message, "text/html")
    email.send()
