import pytz
from datetime import timezone
from django.db.models import Q
from django_filters import rest_framework as filters
import django_filters
from apps.calls.models import TonyCall, UserMessage, Notification

from apps.calls.models import Call


class CallFilter(filters.FilterSet):
    start_date = filters.DateTimeFilter(method='filter_start_date_with_timezone')
    end_date = filters.DateTimeFilter(method='filter_end_date_with_timezone')
    sentiment = filters.BaseInFilter(field_name='sentiment', lookup_expr='in')
    transfer_status = filters.BaseInFilter(field_name='transfer_status', lookup_expr='in')
    advisor_ids = filters.BaseInFilter(field_name='transfer_user', lookup_expr='in')
    call_id_search = filters.CharFilter(method='filter_call_id')
    company_ids = filters.BaseInFilter(field_name='company', lookup_expr='in')

    def filter_start_date_with_timezone(self, queryset, name, value):
        if not value:
            return queryset
        return queryset.filter(created_at__gte=value.astimezone(timezone.utc))

    def filter_end_date_with_timezone(self, queryset, name, value):
        if not value:
            return queryset
        return queryset.filter(created_at__lte=value.astimezone(timezone.utc))

    def filter_call_id(self, queryset, name, value):
        value = value.strip()

        q = Q(call_id__icontains=value) | Q(twilio_call_sid__icontains=value)
        if value.isdigit():
            q = Q(id=int(value))

        return queryset.filter(q)

    class Meta:
        model = Call
        fields = [
            'start_date',
            'end_date',
            'sentiment',
            'advisor_ids',
            'transfer_status',
            'company_ids'
        ]

class DailyCallsFilter(CallFilter):
    class Meta(CallFilter.Meta):
        fields = ['start_date', 'end_date']

class BookingIntentFilter(CallFilter):
    booking_intent = filters.BaseInFilter(field_name='booking_intent', lookup_expr='in')
    class Meta(CallFilter.Meta):
        fields = ['booking_intent']



class TonyCallFilter(django_filters.FilterSet):
    start_date = django_filters.DateTimeFilter(field_name="call_date_time", lookup_expr="gte")
    end_date = django_filters.DateTimeFilter(field_name="call_date_time", lookup_expr="lte")

    intention = django_filters.CharFilter(field_name="intention", lookup_expr="icontains")
    status = django_filters.CharFilter(field_name="status", lookup_expr="iexact")
    called_number = django_filters.CharFilter(field_name="called_number", lookup_expr="icontains")
    called_to = django_filters.CharFilter(field_name="called_to", lookup_expr="icontains")
    company_id = django_filters.NumberFilter(field_name="company__id")
    call_id_search = django_filters.CharFilter(method='filter_call_id')

    def filter_call_id(self, queryset, name, value):
        value = value.strip()

        q = Q(call_id__icontains=value)
        if value.isdigit():
            q = Q(id=int(value))

        return queryset.filter(q)

    class Meta:
        model = TonyCall
        fields = []
