"""
Views for Sales call APIs (SALES_BOT) that includes off time from appointments.
"""

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

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

logger = logging.getLogger(__name__)


class SalesCallViewSet(
    CallSearchMixin,
    viewsets.ModelViewSet
):
    """View for managing Sales call APIs (SALES_BOT) with off time from appointments."""
    serializer_class = CallDetailSerializer
    queryset = Call.objects.all()
    permission_classes = [IsAuthenticated]
    pagination_class = OurLimitOffsetPagination
    filter_backends = [DjangoFilterBackend, CallOrderingFilter]
    filterset_class = CallFilter

    ordering_fields = [
        'created_at',
        'caller_name',
        'from_number',
        'call_time_category',
        'sentiment',
        'duration',
        'cost'
    ]
    ordering = ['-created_at']

    def get_queryset(self):
        user = self.request.user

        qs = Call.objects.filter(bot_type=BotType.SALES_BOT.value)

        if user.is_superuser:
            pass
        if user.active_company:
            try:
                company_info = Company.objects.get(phone=user.active_company.phone)
                qs = qs.filter(company=company_info)
            except Company.DoesNotExist:
                return Call.objects.none()
        else:
            return self.queryset.none()

        qs = self.with_sort_name(qs)
        qs = self.apply_call_search(qs)
        return qs.order_by('-created_at')

    def get_serializer_class(self):
        """Return the serializer class for request."""
        if self.action in ['list', 'retrieve']:
            return SalesCallSerializer
        return self.serializer_class

    def list(self, request, *args, **kwargs):
        """Custom list method to include off time from appointments."""
        queryset = self.get_queryset()
        queryset = self.filter_queryset(queryset)
        queryset = queryset.prefetch_related('appointment_set')
        
        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = SalesCallSerializer(page, many=True, context={'request': request})
            return self.get_paginated_response(serializer.data)
        
        serializer = SalesCallSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, *args, **kwargs):
        """Custom retrieve method to include off time from appointments."""
        instance = self.get_object() 
        queryset = self.get_queryset().filter(pk=instance.pk).prefetch_related('appointment_set')
        instance = queryset.first()
        serializer = SalesCallSerializer(instance, context={'request': request})
        return Response(serializer.data)
