"""Correspondence filters."""

from __future__ import annotations

import django_filters

from simorgh.apps.correspondence.models import (
    Category,
    Letter,
    LetterheadTemplate,
    LetterTemplate,
    NumberingTemplate,
)


class LetterFilter(django_filters.FilterSet):
    letter_type = django_filters.ChoiceFilter(choices=Letter.letter_type.field.choices)
    status = django_filters.ChoiceFilter(choices=Letter.status.field.choices)
    priority = django_filters.ChoiceFilter(choices=Letter.priority.field.choices)
    security = django_filters.ChoiceFilter(choices=Letter.security.field.choices)
    category_id = django_filters.NumberFilter()
    sender_id = django_filters.NumberFilter()
    registration_date_from = django_filters.DateFilter(
        field_name="registration_date", lookup_expr="gte"
    )
    registration_date_to = django_filters.DateFilter(
        field_name="registration_date", lookup_expr="lte"
    )
    q = django_filters.CharFilter(method="filter_search")

    class Meta:
        model = Letter
        fields = [
            "letter_type", "status", "priority", "security",
            "category_id", "sender_id",
        ]

    def filter_search(self, queryset, name, value):
        from django.db.models import Q
        return queryset.filter(
            Q(subject__icontains=value)
            | Q(body__icontains=value)
            | Q(registration_number__icontains=value)
            | Q(sender_external__icontains=value)
            | Q(external_reference__icontains=value)
        )


class CategoryFilter(django_filters.FilterSet):
    category_type = django_filters.ChoiceFilter(choices=Category.category_type.field.choices)
    parent_id = django_filters.NumberFilter()
    is_active = django_filters.BooleanFilter()

    class Meta:
        model = Category
        fields = ["category_type", "parent_id", "is_active"]


class LetterTemplateFilter(django_filters.FilterSet):
    letter_type = django_filters.ChoiceFilter(choices=LetterTemplate.letter_type.field.choices)
    is_active = django_filters.BooleanFilter()

    class Meta:
        model = LetterTemplate
        fields = ["letter_type", "is_active"]


class NumberingTemplateFilter(django_filters.FilterSet):
    letter_type = django_filters.ChoiceFilter(choices=NumberingTemplate.letter_type.field.choices)

    class Meta:
        model = NumberingTemplate
        fields = ["letter_type"]


class LetterheadTemplateFilter(django_filters.FilterSet):
    is_active = django_filters.BooleanFilter()

    class Meta:
        model = LetterheadTemplate
        fields = ["is_active"]
