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

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


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 = []
    pagination_class = LimitOffsetPagination

    filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
    filterset_class = TonyCallFilter
    search_fields = [
        "call_id",
        # "called_to",
        "called_number",
    ]
    ordering_fields = [
        "call_date_time",
        'called_number',
        'called_to',
        'rescheduled',
        "booking_datetime",
        'status',
        "created_at",
        "call_id",
    ]
    ordering = ["-call_date_time", "-call_id",]

    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):
        service = TonyCallService(user=self.request.user)
        qs = service.scope_queryset_to_user(self.queryset)

        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).
        """

        service = TonyCallService(user=request.user)
        data = service.summarize(self.filter_queryset(self.get_queryset()))
        return Response(data, status=status.HTTP_200_OK)
