from rest_framework import viewsets, status
from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.response import Response
from django.db.models import OuterRef, Subquery, Value, CharField

from apps.calls.pagination import CallBDCLimitOffsetPagination
from apps.calls.serializers import DateRangeSerializer, BDCCallSerializer
from apps.calls.services import BDCCallsService
from apps.companies.models import Company
from apps.calls.filters import BookingIntentFilter
from apps.customers.models import Customer


class BDCCallsViewSet(viewsets.GenericViewSet):
    pagination_class = CallBDCLimitOffsetPagination

    filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
    filterset_class = BookingIntentFilter
    search_fields = ['from_number', 'to_number', 'transcript', 'summary']
    ordering_fields = ['created_at', 'duration', 'cost']
    ordering = ['-created_at']

    def list(self, request):
        user = request.user

        if user.is_superuser:
            bdc_number = request.query_params.get('bdc_number', None)
            if not bdc_number:
                return Response(
                    {'detail': 'Please provide bdc_number parameter.'},
                    status=status.HTTP_400_BAD_REQUEST
                )
        else:
            if not user.active_company:
                return Response(
                    {'detail': 'User must have an active company.'},
                    status=status.HTTP_400_BAD_REQUEST
                )
            
            bdc_number = user.active_company.bdc_number
            if not bdc_number:
                return Response(
                    {'detail': 'Your company does not have a BDC number configured.'},
                    status=status.HTTP_400_BAD_REQUEST
                )

        date_serializer = DateRangeSerializer(data=request.query_params)
        date_serializer.is_valid(raise_exception=True)

        start_date = date_serializer.validated_data.get('start_date')
        end_date = date_serializer.validated_data.get('end_date')

        calls_queryset = BDCCallsService.fetch_calls(
            company=user.active_company,
            start_date=start_date,
            end_date=end_date
        )

        customer_subquery = Customer.objects.filter(
            company_id=OuterRef('company_id'),
            phone=OuterRef('from_number')
        ).values('name')[:1]

        calls_queryset = calls_queryset.annotate(
            customer_name=Subquery(customer_subquery, output_field=CharField())
        )

        calls_queryset = self.filter_queryset(calls_queryset)


        page = self.paginate_queryset(calls_queryset)
        serializer = BDCCallSerializer(page, many=True)

        return self.get_paginated_response(serializer.data)
