import django_filters
from apps.calls.models import Call
from apps.companies.models import CallCatchPhrase
from .notification_filter import NumberInFilter
from django.db.models import Q


class CatchPhraseReportFilter(django_filters.FilterSet):
    phrase = django_filters.CharFilter(method="filter_by_phrase")
    start_date = django_filters.DateTimeFilter(
        field_name="created_at", lookup_expr="gte"
    )
    end_date = django_filters.DateTimeFilter(
        field_name="created_at", lookup_expr="lte"
    )
    advisor_ids = NumberInFilter(field_name='transfer_user__id', lookup_expr='in')

    def filter_by_phrase(self, queryset, name, value):
        phrases = [p.strip() for p in value.split(",") if p.strip()]

        if not phrases:
            return queryset

        q = Q()
        for phrase in phrases:
            q |= Q(phrase__phrase__icontains=phrase)

        call_ids = (
            CallCatchPhrase.objects
            .filter(
                q,
                call_id__in=queryset.values("id"),
            )
            .values_list("call_id", flat=True)
            .distinct()
        )

        return queryset.filter(id__in=call_ids)

    class Meta:
        model = Call
        fields = ["start_date", "end_date", 'advisor_ids',]
