"""
budget/filters.py
=================
FilterSets for Budget Management list views.
"""

import django_filters
from django import forms

from horilla.filters import HorillaFilterSet

from .models import BudgetAllocation, BudgetHead, BudgetItem, BudgetSubHead


def _widget_attrs(widget_cls):
    if issubclass(widget_cls, (forms.NumberInput, forms.TextInput, forms.EmailInput)):
        return {"class": "oh-input w-100"}
    if issubclass(widget_cls, forms.Select):
        return {"class": "oh-select oh-select-2"}
    return {}


class BudgetHeadFilter(HorillaFilterSet):
    name = django_filters.CharFilter(
        lookup_expr="icontains",
        widget=forms.TextInput(attrs={"class": "oh-input w-100"}),
    )
    code = django_filters.CharFilter(
        lookup_expr="icontains",
        widget=forms.TextInput(attrs={"class": "oh-input w-100"}),
    )

    class Meta:
        model = BudgetHead
        fields = ["name", "code", "is_active"]


class BudgetSubHeadFilter(HorillaFilterSet):
    name = django_filters.CharFilter(
        lookup_expr="icontains",
        widget=forms.TextInput(attrs={"class": "oh-input w-100"}),
    )
    head = django_filters.ModelChoiceFilter(
        queryset=BudgetHead.objects.filter(is_active=True),
        widget=forms.Select(attrs={"class": "oh-select oh-select-2"}),
    )

    class Meta:
        model = BudgetSubHead
        fields = ["name", "head", "is_active"]


class BudgetItemFilter(HorillaFilterSet):
    name = django_filters.CharFilter(
        lookup_expr="icontains",
        widget=forms.TextInput(attrs={"class": "oh-input w-100"}),
    )
    sub_head = django_filters.ModelChoiceFilter(
        queryset=BudgetSubHead.objects.filter(is_active=True),
        widget=forms.Select(attrs={"class": "oh-select oh-select-2"}),
    )
    code = django_filters.CharFilter(
        lookup_expr="icontains",
        widget=forms.TextInput(attrs={"class": "oh-input w-100"}),
    )

    class Meta:
        model = BudgetItem
        fields = ["name", "sub_head", "code", "is_active"]


class BudgetAllocationFilter(HorillaFilterSet):
    item = django_filters.ModelChoiceFilter(
        queryset=BudgetItem.objects.filter(is_active=True),
        widget=forms.Select(attrs={"class": "oh-select oh-select-2"}),
    )
    fiscal_year = django_filters.NumberFilter(
        widget=forms.NumberInput(attrs={"class": "oh-input w-100"}),
    )
    period_type = django_filters.ChoiceFilter(
        choices=[("", "---------")] + [
            ("annual", "Annual"),
            ("quarterly", "Quarterly"),
            ("monthly", "Monthly"),
            ("weekly", "Weekly"),
        ],
        widget=forms.Select(attrs={"class": "oh-select oh-select-2"}),
    )

    class Meta:
        model = BudgetAllocation
        fields = ["item", "fiscal_year", "period_type"]
