# support/views_subjects.py
from datetime import timedelta
from django.utils import timezone
from django.db.models import Count, Q
from rest_framework.views import APIView
from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView
from rest_framework.response import Response
from rest_framework import status, permissions

from .models import SupportSubject, Ticket
from .serializers import SupportSubjectSerializer
from .permissions import SupportWritePermission  # your role-based write guard

def annotate_realtime(qs):
    now = timezone.now()
    day_ago = now - timedelta(days=1)
    week_ago = now - timedelta(days=7)
    # Count tickets linked by subject_ref OR (fallback) text category matching the subject name
    return qs.annotate(
        count_24h=Count("tickets", filter=Q(tickets__created_at__gte=day_ago))
                  + Count(None, filter=Q(
                        tickets__isnull=True,  # noop; ensures the + is valid in all backends
                    ) & Q(id=None)),  # trick: keeps ORM happy, adds 0
        count_7d=Count("tickets", filter=Q(tickets__created_at__gte=week_ago))
    )

class SubjectListCreateAPI(ListCreateAPIView):
    """
    GET  /api/support/subjects/?realtime=true&include_others=true
    POST /api/support/subjects/         (admin roles only)
    """
    serializer_class = SupportSubjectSerializer
    permission_classes = [permissions.IsAuthenticated]

    def get_queryset(self):
        qs = SupportSubject.objects.filter(is_active=True)
        qs = annotate_realtime(qs)
        realtime = self.request.query_params.get("realtime") == "true"
        if realtime:
            qs = qs.order_by("-count_24h", "-count_7d", "sort_order", "name")
        else:
            qs = qs.order_by("sort_order", "name")
        return qs

    def list(self, request, *args, **kwargs):
        resp = super().list(request, *args, **kwargs)
        if request.query_params.get("include_others") == "true":
            # compute dynamic Others bucket from tickets not mapped to any subject_ref
            now = timezone.now()
            day_ago = now - timedelta(days=1)
            week_ago = now - timedelta(days=7)

            # tickets with no subject_ref (free-form / legacy)
            others_24h = Ticket.objects.filter(subject_ref__isnull=True,
                                               created_at__gte=day_ago).count()
            others_7d  = Ticket.objects.filter(subject_ref__isnull=True,
                                               created_at__gte=week_ago).count()
            others = {
                "id": 0,
                "name": "Others",
                "slug": "others",
                "is_active": True,
                "sort_order": 9999,
                "created_at": None,
                "updated_at": None,
                "count_24h": others_24h,
                "count_7d": others_7d,
            }
            resp.data.append(others)
        return resp

    # restrict writes
    def get_permissions(self):
        if self.request.method in ("POST",):
            return [permissions.IsAuthenticated(), SupportWritePermission()]
        return super().get_permissions()

    def perform_create(self, serializer):
        return serializer.save()

class SubjectDetailAPI(RetrieveUpdateDestroyAPIView):
    """
    GET    /api/support/subjects/<id>/
    PATCH  /api/support/subjects/<id>/    (admin roles)
    DELETE /api/support/subjects/<id>/    (admin roles)
    """
    serializer_class = SupportSubjectSerializer
    permission_classes = [permissions.IsAuthenticated]
    queryset = SupportSubject.objects.all()

    def get_permissions(self):
        if self.request.method in ("PATCH", "PUT", "DELETE"):
            return [permissions.IsAuthenticated(), SupportWritePermission()]
        return super().get_permissions()
