from django.core.management.base import BaseCommand
from django.core.mail import EmailMessage
from django.utils import timezone
from datetime import timedelta
from users.models import ClientVisa, EmailSetup
import logging
import os

# Optional: log file for debugging
log_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'visa_report.log')
logging.basicConfig(filename=log_file, level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')


class Command(BaseCommand):
    help = "Send visa expiry report emails for next week"

    def handle(self, *args, **kwargs):
        try:
            today = timezone.localdate()

            # Current Saturday
            saturday = today + timedelta((5 - today.weekday()) % 7)  # Saturday = 5
            # Next Monday
            monday = saturday + timedelta(days=(7 - saturday.weekday()))  # Monday = 0
            # Next Sunday
            sunday = monday + timedelta(days=6)

            # Fetch visa records expiring next week
            visas = ClientVisa.objects.filter(
                ref_client__client_status=1,
                visa_to_date__gte=monday,
                visa_to_date__lte=sunday,
            ).select_related("ref_client", "ref_visa_country")

            if not visas.exists():
                logging.info("No visa expiries found for next week.")
                return

            report_duration = f"Upcoming Visa Expiry (From {monday.strftime('%d-%m-%Y')} to {sunday.strftime('%d-%m-%Y')})"

            # Build email content as HTML table
            email_content = f"<h2>MyValueTrip</h2><p>{report_duration}</p>"
            email_content += "<table border='1' cellpadding='5' cellspacing='0'>"
            email_content += "<tr><th>Sr. No.</th><th>Client Name</th><th>Visa Country</th><th>Visa Expiry Date</th></tr>"

            for idx, v in enumerate(visas, start=1):
                client = v.ref_client
                client_name = f"{client.client_salutation or ''} {client.client_first_name or ''} {client.client_middle_name or ''} {client.client_last_name or ''}".strip()
                country_name = v.ref_visa_country.name if v.ref_visa_country else "-"
                expiry_formatted = v.visa_to_date.strftime("%d-%m-%Y")
                email_content += f"<tr><td>{idx}</td><td>{client_name}</td><td>{country_name}</td><td>{expiry_formatted}</td></tr>"

            email_content += "</table>"

            # Fetch recipients from EmailSetup model
            recipients = EmailSetup.objects.filter(
                report_type="Visa Expiry"
            ).values_list("email", flat=True)

            if not recipients:
                logging.warning("No recipient configured for Visa Expiry.")
                return

            # Send email
            email = EmailMessage(
                subject="Upcoming Visa Expiry Report",
                body=email_content,
                to=list(recipients),
            )
            email.content_subtype = "html"
            email.send()

            logging.info(f"Visa expiry report sent to: {', '.join(recipients)}")

        except Exception as e:
            logging.error(f"Failed to send visa expiry email: {e}")
