from collections import OrderedDict

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

from utils.paginations import OurLimitOffsetPagination
from apps.calls.serializers import BDCProgressSerializer
from apps.calls.services import BDCProgressService
from apps.calls.filters import BookingIntentFilter
from apps.permissions.permissions import CompanyPermission


class BDCProgressViewSet(viewsets.GenericViewSet):
    pagination_class = OurLimitOffsetPagination

    filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
    filterset_class = BookingIntentFilter
    search_fields = [
        'from_number',
        'customer_name',
    ]
    ordering_fields = [
        'created_at',
        'customer_name',
        'from_number',
        "transfer_number",
        'booking_intent',
        'booking_datetime',
        'sentiment',
        'duration',
        'cost'
    ]
    ordering = ['-created_at']

    def get_permissions(self):
        return [CompanyPermission('view_bdc_progress')]

    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
                )

        company = user.active_company

        queryset = BDCProgressService.fetch_calls(request, company)
        queryset = self.filter_queryset(queryset)

        stats = BDCProgressService.get_stats(queryset)

        page = self.paginate_queryset(queryset)
        serializer = BDCProgressSerializer(page, many=True)

        paginated = self.get_paginated_response(serializer.data)

        ordered_response = OrderedDict([
            ('count', paginated.data['count']),
            ('next', paginated.data['next']),
            ('previous', paginated.data['previous']),

            ('total_calls', stats['total_calls']),
            ('recieved_calls', stats['received_calls']),
            ('calls_missed', stats['calls_missed']),
            ('scheduled', stats['scheduled']),
            ('not_scheduled', stats['not_scheduled']),
            ('percentage', stats['percentage']),

            ('results', paginated.data['results']),
        ])

        return Response(ordered_response)
