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

import logging
from datetime import datetime, timedelta
from django.db.models import Count, Sum, Max, Avg, Q
from django.utils import timezone
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import viewsets, status
from rest_framework.decorators import action
from rest_framework.filters import SearchFilter, OrderingFilter
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response

from apps.companies.models import Company
from apps.calls.models import Call
from apps.appointments.models import Appointment
from apps.calls.constants import TRANSFER_STATUS, BotType
from apps.calls.filters import CallFilter
from apps.calls.serializers import CallDetailSerializer, SalesCallSerializer
from utils.paginations.pagination import OurLimitOffsetPagination


logger = logging.getLogger(__name__)


class SalesCallViewSet(viewsets.ModelViewSet):
    """View for managing Sales call APIs (SALES_BOT) with offtime from appointments."""
    serializer_class = CallDetailSerializer
    queryset = Call.objects.all()
    permission_classes = [IsAuthenticated]
    pagination_class = OurLimitOffsetPagination
    filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
    filterset_class = CallFilter
    search_fields = ['from_number', 'to_number', 'transcript', 'summary']
    ordering_fields = ['created_at', 'duration', 'cost']
    ordering = ['-created_at']

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

        if user.is_superuser:
            return self.queryset.filter(bot_type=BotType.SALES_BOT.value).order_by('-id')

        if user.active_company:
            try:
                company_info = Company.objects.get(phone=user.active_company.phone)
                return self.queryset.filter(company=company_info, bot_type=BotType.SALES_BOT.value).order_by('-id')
            except Company.DoesNotExist:
                return self.queryset.none()

        return self.queryset.none()

    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 offtime 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 offtime 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)