import logging
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import viewsets
from rest_framework.permissions import IsAuthenticated

from apps.calls.mixins import CallSearchMixin
from apps.companies.models import Company
from apps.calls.constants import BotType
from apps.calls.filters import CallFilter, CallOrderingFilter
from apps.calls.models import Call
from apps.calls.pagination import CallLimitOffsetPagination
from apps.calls.serializers import CallDetailSerializer


logger = logging.getLogger(__name__)


class AdvisorCallViewSet(
    CallSearchMixin,
    viewsets.ReadOnlyModelViewSet
):
    serializer_class = CallDetailSerializer
    queryset = Call.objects.all()
    permission_classes = [IsAuthenticated]
    pagination_class = CallLimitOffsetPagination
    filter_backends = [DjangoFilterBackend, CallOrderingFilter]
    filterset_class = CallFilter

    ordering_fields = ['created_at', 'duration', 'cost']
    ordering = ['-created_at']

    def get_queryset(self):
        if hasattr(self, '_cached_qs'):
            return self._cached_qs
        
        user = self.request.user
        if not user.active_company:
            self._cached_qs = Call.objects.none()
            return self._cached_qs
        
        company = Company.objects.filter(phone=user.active_company.phone).first()
        if not company:
            self._cached_qs = Call.objects.none()
            return self._cached_qs

        qs = Call.objects.filter(
            company=company,
            transfer_user=user,
            bot_type=BotType.SERVICE_BOT.value
        ).order_by('-created_at')

        qs = self.with_sort_name(qs)
        qs = self.apply_call_search(qs)

        self._cached_qs = qs

        return self._cached_qs
