from django.db.models import Q
from rest_framework import permissions, status
from rest_framework.response import Response
from rest_framework.views import APIView

from apps.leads.models import LeadSubmission


class AdminLeadSubmissionListView(APIView):
    permission_classes = [permissions.IsAdminUser]

    def get(self, request):
        page_raw = request.query_params.get("page", "1")
        page_size_raw = request.query_params.get("page_size", "20")
        status_filter = (request.query_params.get("status") or "").strip().lower()
        lead_type_filter = (request.query_params.get("lead_type") or "").strip().lower()
        search_term = (request.query_params.get("q") or "").strip()

        try:
            page = max(1, int(page_raw))
        except Exception:
            page = 1

        try:
            page_size = max(1, min(100, int(page_size_raw)))
        except Exception:
            page_size = 20

        qs = LeadSubmission.objects.all().order_by("-created_at")

        if status_filter:
            qs = qs.filter(status=status_filter)

        if lead_type_filter:
            qs = qs.filter(lead_type=lead_type_filter)

        if search_term:
            qs = qs.filter(
                Q(full_name__icontains=search_term)
                | Q(email__icontains=search_term)
                | Q(mobile_number__icontains=search_term)
                | Q(subject__icontains=search_term)
                | Q(message__icontains=search_term)
                | Q(source_page_url__icontains=search_term)
                | Q(source_page_name__icontains=search_term)
            )

        start = (page - 1) * page_size
        end = start + page_size
        page_qs = qs[start:end]

        results = [
            {
                "id": str(lead.id),
                "lead_type": lead.lead_type,
                "status": lead.status,
                "full_name": lead.full_name,
                "email": lead.email,
                "mobile_number": lead.mobile_number,
                "subject": lead.subject,
                "source_page_url": lead.source_page_url,
                "source_page_name": lead.source_page_name,
                "source_page_type": lead.source_page_type,
                "is_spam": lead.is_spam,
                "created_at": lead.created_at,
                "updated_at": lead.updated_at,
            }
            for lead in page_qs
        ]

        return Response(
            {
                "results": results,
                "count": qs.count(),
                "page": page,
                "page_size": page_size,
            },
            status=status.HTTP_200_OK,
        )


class AdminLeadSubmissionDetailView(APIView):
    permission_classes = [permissions.IsAdminUser]

    def get(self, request, lead_id):
        lead = LeadSubmission.objects.filter(id=lead_id).first()
        if not lead:
            return Response({"detail": "Not found"}, status=status.HTTP_404_NOT_FOUND)

        return Response(
            {
                "id": str(lead.id),
                "lead_type": lead.lead_type,
                "status": lead.status,
                "full_name": lead.full_name,
                "email": lead.email,
                "mobile_number": lead.mobile_number,
                "city": lead.city,
                "interested_category": lead.interested_category,
                "subject": lead.subject,
                "message": lead.message,
                "notes": lead.notes,
                "source_page_url": lead.source_page_url,
                "source_page_name": lead.source_page_name,
                "source_page_type": lead.source_page_type,
                "campaign_source": lead.campaign_source,
                "referral_source": lead.referral_source,
                "user_agent": lead.user_agent,
                "device_info": lead.device_info,
                "ip_address": lead.ip_address,
                "is_spam": lead.is_spam,
                "payload": lead.payload,
                "assigned_to": str(lead.assigned_to_id) if lead.assigned_to_id else None,
                "assigned_to_name": lead.assigned_to.get_full_name() if lead.assigned_to_id else "",
                "created_at": lead.created_at,
                "updated_at": lead.updated_at,
            },
            status=status.HTTP_200_OK,
        )


class AdminLeadSubmissionStatusUpdateView(APIView):
    permission_classes = [permissions.IsAdminUser]

    def post(self, request, lead_id):
        lead = LeadSubmission.objects.filter(id=lead_id).first()
        if not lead:
            return Response({"detail": "Not found"}, status=status.HTTP_404_NOT_FOUND)

        next_status = (request.data.get("status") or "").strip().lower()
        valid_statuses = {choice[0] for choice in LeadSubmission.STATUS_CHOICES}
        if next_status not in valid_statuses:
            return Response({"detail": "invalid status."}, status=status.HTTP_400_BAD_REQUEST)

        lead.status = next_status

        if next_status == LeadSubmission.STATUS_SPAM:
            lead.is_spam = True

        notes = request.data.get("notes")
        if notes is not None:
            lead.notes = str(notes or "").strip()

        lead.save(update_fields=["status", "is_spam", "notes", "updated_at"])

        return Response(
            {
                "success": True,
                "data": {
                    "id": str(lead.id),
                    "status": lead.status,
                    "is_spam": lead.is_spam,
                    "notes": lead.notes,
                    "updated_at": lead.updated_at,
                },
            },
            status=status.HTTP_200_OK,
        )