from rest_framework import viewsets, status
from rest_framework.decorators import action
from rest_framework.permissions import IsAuthenticated
from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.response import Response

from apps.calls.models import TonyCall
from apps.calls.serializers import TonyCallListSerializer, TonyCallDetailSerializer
from apps.calls.filters import TonyCallFilter
from utils.paginations import OurLimitOffsetPagination, LimitOffsetPagination
from apps.calls.repositories import TonyCallRepository
from apps.calls.services import TonyCallService
import logging
from apps.permissions.permissions import CompanyPermission

logger = logging.getLogger(__name__)

class TonyCallViewSet(viewsets.ReadOnlyModelViewSet):
    """
    Read-only endpoint for TonyCall with filtering, searching, ordering and pagination.
    - list: paginated list
    - retrieve: detail
    - summary: basic aggregated stats of the filtered set
    """
    queryset = TonyCallRepository.base_queryset()
    serializer_class = TonyCallListSerializer
    permission_classes = [CompanyPermission]
    pagination_class = LimitOffsetPagination

    filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
    filterset_class = TonyCallFilter
    search_fields = ["transcript", "call_id", "called_number", "called_to", "intention"]
    ordering_fields = ["call_date_time", "created_at", "booking_datetime"]
    ordering = ["-call_date_time"]

    def get_permissions(self):
        return [CompanyPermission('view_tony_calls')]

    def get_serializer_class(self):
        if self.action == "list":
            return TonyCallListSerializer
        return TonyCallDetailSerializer

    def get_queryset(self):
        repo_qs = TonyCallRepository.base_queryset()
        service = TonyCallService(user=self.request.user)
        qs = service.scope_queryset_to_user(repo_qs)

        return qs

    @action(detail=False, methods=["get"], url_path="summary")
    def summary(self, request):
        """
        Return aggregated counts for filtered dataset.
        Supports the same filters as list (applies filter_queryset).
        """
        filtered_qs = self.filter_queryset(self.get_queryset())
        service = TonyCallService(user=request.user)
        data = service.summarize(filtered_qs)
        return Response(data, status=status.HTTP_200_OK)
