from django.db.models import Count, Q, Avg
from django.db.models.functions import Round
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework import status

from apps.calls.constants import TRANSFER_STATUS
from apps.calls.models import Call
from apps.companies.constants import CompanyType


class CallSummaryMixin:
    """
    Provides aggregated call summary statistics.
    Uses DRF filters + queryset scoping safely.
    """

    @action(detail=False, methods=["get"], url_path="summary")
    def summary(self, request):
        qs = self.get_queryset()

        if request.user.active_company.company_type == CompanyType.DEALERSHIP:
            qs = Call.objects.filter(
                dealership=request.user.active_company
            )

        calls_qs = self.filter_queryset(qs)

        summary = calls_qs.aggregate(
            total_calls=Count("id"),
            total_missed_calls=Count(
                "id",
                filter=Q(transfer_status=TRANSFER_STATUS.FAILED.value),
            ),
            total_attended_calls=Count(
                "id",
                filter=Q(transfer_status=TRANSFER_STATUS.SUCCESSFUL.value),
            ),
            average_call_time=Round(Avg("duration"), 2),
            unique_callers=Count("from_number", distinct=True),
        )

        total_calls = summary["total_calls"] or 0
        unique_callers = summary["unique_callers"] or 0

        report_data = {
            "total_calls": total_calls,
            "total_missed_calls": summary["total_missed_calls"] or 0,
            "total_attended_calls": summary["total_attended_calls"] or 0,
            "average_call_time_seconds": summary["average_call_time"] or 0,
            "unique_callers": unique_callers,
            "repeated_callers": max(total_calls - unique_callers, 0),
        }

        return Response(report_data, status=status.HTTP_200_OK)
