"""revenue/forms.py"""

from django import forms
from django.utils.translation import gettext_lazy as _

from base.forms import ModelForm
from base.methods import reload_queryset
from base.models import Department
from budget.models import BudgetItem

from .models import RevenueHead, RevenueItem, RevenueRecord, RevenueSubHead


class RevenueHeadForm(ModelForm):
    class Meta:
        model = RevenueHead
        fields = ["name", "description", "allowed_recorder_group", "is_active"]
        widgets = {
            "name": forms.TextInput(attrs={"class": "oh-input w-100"}),
            "description": forms.Textarea(attrs={"class": "oh-input w-100", "rows": 3}),
            "allowed_recorder_group": forms.Select(attrs={"class": "oh-select oh-select-2"}),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        reload_queryset(self.fields)


class RevenueSubHeadForm(ModelForm):
    class Meta:
        model = RevenueSubHead
        fields = ["head", "name", "description", "is_active"]
        widgets = {
            "head": forms.Select(attrs={"class": "oh-select oh-select-2"}),
            "name": forms.TextInput(attrs={"class": "oh-input w-100"}),
            "description": forms.Textarea(attrs={"class": "oh-input w-100", "rows": 3}),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        reload_queryset(self.fields)
        self.fields["head"].queryset = RevenueHead.objects.filter(is_active=True)


class RevenueItemForm(ModelForm):
    class Meta:
        model = RevenueItem
        fields = ["sub_head", "name", "description", "budget_item", "is_active"]
        widgets = {
            "sub_head": forms.Select(attrs={"class": "oh-select oh-select-2"}),
            "name": forms.TextInput(attrs={"class": "oh-input w-100"}),
            "description": forms.Textarea(attrs={"class": "oh-input w-100", "rows": 3}),
            "budget_item": forms.Select(attrs={"class": "oh-select oh-select-2"}),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        reload_queryset(self.fields)
        self.fields["sub_head"].queryset = RevenueSubHead.objects.filter(is_active=True)
        self.fields["budget_item"].queryset = BudgetItem.objects.filter(is_active=True).select_related(
            "sub_head__head"
        )
        self.fields["budget_item"].required = False
        self.fields["budget_item"].label = _("Linked Budget Item (optional)")


class RevenueRecordForm(ModelForm):
    class Meta:
        model = RevenueRecord
        fields = ["item", "department", "amount", "transaction_date", "description"]
        widgets = {
            "item": forms.Select(attrs={"class": "oh-select oh-select-2"}),
            "department": forms.Select(attrs={"class": "oh-select oh-select-2"}),
            "amount": forms.NumberInput(attrs={"class": "oh-input w-100", "step": "0.01", "min": "0.01"}),
            "transaction_date": forms.DateInput(attrs={"class": "oh-input w-100", "type": "date"}),
            "description": forms.Textarea(attrs={"class": "oh-input w-100", "rows": 3}),
        }

    def __init__(self, *args, **kwargs):
        self.request_user = kwargs.pop("request_user", None)
        super().__init__(*args, **kwargs)
        reload_queryset(self.fields)

        # Filter items to those the user's group is allowed to record
        if self.request_user and not self.request_user.is_superuser:
            user_group_ids = self.request_user.groups.values_list("id", flat=True)
            # Items where head has no restriction OR head's allowed_group matches user
            from django.db.models import Q
            allowed_items = RevenueItem.objects.filter(
                is_active=True
            ).filter(
                Q(sub_head__head__allowed_recorder_group__isnull=True)
                | Q(sub_head__head__allowed_recorder_group_id__in=user_group_ids)
            ).select_related("sub_head__head")
            self.fields["item"].queryset = allowed_items
        else:
            self.fields["item"].queryset = RevenueItem.objects.filter(is_active=True).select_related(
                "sub_head__head"
            )

        self.fields["department"].queryset = Department.objects.filter(is_active=True)


# ---------------------------------------------------------------------------
# Report filter form (not a ModelForm)
# ---------------------------------------------------------------------------

class RevenueReportFilterForm(forms.Form):
    date_from = forms.DateField(
        required=False,
        widget=forms.DateInput(attrs={"class": "oh-input w-100", "type": "date"}),
        label=_("Date From"),
    )
    date_to = forms.DateField(
        required=False,
        widget=forms.DateInput(attrs={"class": "oh-input w-100", "type": "date"}),
        label=_("Date To"),
    )
    department = forms.ModelChoiceField(
        queryset=Department.objects.filter(is_active=True),
        required=False,
        widget=forms.Select(attrs={"class": "oh-select oh-select-2"}),
        label=_("Department"),
    )
    revenue_head = forms.ModelChoiceField(
        queryset=RevenueHead.objects.filter(is_active=True),
        required=False,
        widget=forms.Select(attrs={"class": "oh-select oh-select-2"}),
        label=_("Revenue Head"),
    )
