from django.core.management.base import BaseCommand
from django.utils import timezone
from django.conf import settings
from django.core.cache import cache
from django.core.mail import send_mail
import datetime

from website.models import SupportTicket, CareRequest
from website.views import send_whatsapp_text

class Command(BaseCommand):
    help = "Check SLA breaches and send email/WhatsApp alerts to admin (throttled)."

    def handle(self, *args, **options):
        now = timezone.now()
        breaches = []

        support = SupportTicket.objects.filter(
            status__in=["open","pending"],
            due_at__isnull=False,
            first_response_at__isnull=True,
            due_at__lt=now
        )[:500]
        for t in support:
            key = f"sla_notified_support_{t.id}"
            if cache.get(key): 
                continue
            breaches.append(("Support Ticket", f"#{t.public_id} {t.subject}", t.assigned_to.username if t.assigned_to else "Unassigned", t.due_at))
            cache.set(key, True, 60*60*6)

        # Care (best-effort)
        sla_care_mins = int(getattr(settings, "SLA_CARE_MINS", 120))
        care = CareRequest.objects.filter(status__in=["new","in_progress"]).order_by("-created_at")[:500]
        for r in care:
            due = getattr(r, "due_at", None)
            if due is None:
                due = r.created_at + datetime.timedelta(minutes=sla_care_mins)
            if due < now:
                key = f"sla_notified_care_{r.id}"
                if cache.get(key): 
                    continue
                breaches.append(("Care Request", f"#{r.id} {r.full_name} ({r.request_type})", r.assigned_to.username if r.assigned_to else "Unassigned", due))
                cache.set(key, True, 60*60*6)

        if not breaches:
            self.stdout.write(self.style.SUCCESS("No SLA breaches."))
            return

        subject = f"SLA Breach Alert ({len(breaches)})"
        lines = ["SLA breach detected:"]
        for kind, ref, assigned, due in breaches[:50]:
            lines.append(f"- {kind}: {ref} • Assigned: {assigned} • Due: {due}")
        msg = "\n".join(lines)

        admin_email = getattr(settings, "ADMIN_NOTIFY_EMAIL", "") or getattr(settings, "DEFAULT_FROM_EMAIL", "")
        if admin_email:
            send_mail(subject, msg, getattr(settings, "DEFAULT_FROM_EMAIL", admin_email), [admin_email], fail_silently=True)

        wa_to = getattr(settings, "ADMIN_WHATSAPP_NUMBER", "")
        if wa_to:
            try:
                send_whatsapp_text(wa_to, msg[:1500])
            except Exception:
                pass

        self.stdout.write(self.style.SUCCESS(f"Sent alerts for {len(breaches)} breaches."))
