from datetime import timezone
from django.utils.timezone import make_aware
from django_filters import rest_framework as filters
from .models import Appointment
from apps.calls.filters import NumberInFilter


class AppointmentFilter(filters.FilterSet):
    start_date = filters.DateTimeFilter(method='filter_start')
    end_date = filters.DateTimeFilter(method='filter_end')
    start_scheduled_date = filters.DateTimeFilter(method='filter_start')
    end_scheduled_date = filters.DateTimeFilter(method='filter_end')
    company_ids = filters.BaseInFilter(field_name='company', lookup_expr='in')
    name = filters.CharFilter(field_name='name', lookup_expr='icontains')
    offtime = NumberInFilter(field_name='offtime')

    def make_aware_if_needed(self, dt):
        """Convert naïve → aware AND normalize to UTC."""
        if dt.tzinfo is None:
            dt = make_aware(dt)
        return dt.astimezone(timezone.utc)

    def filter_start(self, queryset, name, value):
        value = self.make_aware_if_needed(value)
        return queryset.filter(created_at__gte=value)
    
    def filter_end(self, queryset, name, value):
        value = self.make_aware_if_needed(value)
        return queryset.filter(created_at__lte=value)

    def filter_scheduled_start(self, queryset, name, value):
        value = self.make_aware_if_needed(value)
        return queryset.filter(scheduled_date__gte=value)
    
    def filter_scheduled_end(self, queryset, name, value):
        value = self.make_aware_if_needed(value)
        return queryset.filter(scheduled_date__lte=value)

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

    class Meta:
        model = Appointment
        fields = [
            'start_date',
            'end_date',
            'start_scheduled_date',
            'end_scheduled_date',
            'company_ids',
            'offtime',
            'name',
        ]
