"""
expense/forms.py
================
Forms for expense request submission and workflow configuration.
"""

from django import forms
from django.contrib.auth.models import Group
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 BudgetHead, BudgetItem, BudgetSubHead
from employee.models import Employee

from .models import (
    ExpenseApprovalStage,
    ExpenseApprovalWorkflow,
    ExpenseDocument,
    ExpenseRequest,
    KIVRecord,
)


class ExpenseRequestForm(ModelForm):
    """Form for submitting a new expense request."""

    # Virtual fields for cascading selects — not model fields
    budget_head = forms.ModelChoiceField(
        queryset=BudgetHead.objects.filter(is_active=True),
        label=_("Budget Head"),
        widget=forms.Select(attrs={
            "class": "oh-select oh-select-2",
            "hx-get": "/expense/ajax/sub-heads/",
            "hx-target": "#id_budget_sub_head",
            "hx-trigger": "change",
            "hx-include": "[name='budget_head']",
        }),
    )
    budget_sub_head = forms.ModelChoiceField(
        queryset=BudgetSubHead.objects.none(),
        label=_("Budget Sub-Head"),
        required=False,
        widget=forms.Select(attrs={
            "class": "oh-select oh-select-2",
            "hx-get": "/expense/ajax/items/",
            "hx-target": "#id_budget_item",
            "hx-trigger": "change",
            "hx-include": "[name='budget_sub_head']",
        }),
    )

    class Meta:
        model = ExpenseRequest
        fields = [
            "title",
            "amount",
            "justification",
            "budget_item",
        ]
        widgets = {
            "title": forms.TextInput(attrs={"class": "oh-input w-100"}),
            "amount": forms.NumberInput(attrs={"class": "oh-input w-100", "step": "0.01", "min": "0.01"}),
            "justification": forms.Textarea(attrs={"class": "oh-input w-100", "rows": 4}),
            "budget_item": forms.Select(attrs={"class": "oh-select oh-select-2"}),
        }

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

        instance = kwargs.get("instance")
        if instance and instance.budget_item_id:
            item = instance.budget_item
            self.fields["budget_head"].initial = item.sub_head.head
            self.fields["budget_sub_head"].queryset = BudgetSubHead.objects.filter(
                head=item.sub_head.head, is_active=True
            )
            self.fields["budget_sub_head"].initial = item.sub_head
            self.fields["budget_item"].queryset = BudgetItem.objects.filter(
                sub_head=item.sub_head, is_active=True
            )
        else:
            self.fields["budget_item"].queryset = BudgetItem.objects.filter(is_active=True)


class ExpenseDocumentForm(forms.ModelForm):
    """Inline form for uploading supporting documents."""

    class Meta:
        model = ExpenseDocument
        fields = ["file"]
        widgets = {
            "file": forms.FileInput(attrs={
                "class": "oh-input w-100",
                "accept": ".pdf,.jpg,.jpeg,.png,.doc,.docx",
            }),
        }


ExpenseDocumentFormSet = forms.inlineformset_factory(
    ExpenseRequest,
    ExpenseDocument,
    form=ExpenseDocumentForm,
    extra=1,
    max_num=5,
    can_delete=True,
)


class ApproveForm(forms.Form):
    """Comment form shown in the approve modal."""
    comment = forms.CharField(
        required=False,
        widget=forms.Textarea(attrs={"class": "oh-input w-100", "rows": 3}),
        label=_("Comment (optional)"),
    )


class RejectForm(forms.Form):
    reason = forms.CharField(
        widget=forms.Textarea(attrs={"class": "oh-input w-100", "rows": 3}),
        label=_("Rejection Reason"),
    )


class KIVForm(forms.ModelForm):
    class Meta:
        model = KIVRecord
        fields = ["reason", "revisit_date"]
        widgets = {
            "reason": forms.Textarea(attrs={"class": "oh-input w-100", "rows": 3}),
            "revisit_date": forms.DateInput(attrs={"class": "oh-input w-100", "type": "date"}),
        }

    def clean_revisit_date(self):
        from datetime import date
        rd = self.cleaned_data["revisit_date"]
        if rd <= date.today():
            raise forms.ValidationError(_("Revisit date must be in the future."))
        return rd


class ResubmitForm(forms.Form):
    note = forms.CharField(
        required=False,
        widget=forms.Textarea(attrs={"class": "oh-input w-100", "rows": 3}),
        label=_("Resubmission Note (optional)"),
    )


# ---------------------------------------------------------------------------
# Workflow configuration forms (admin)
# ---------------------------------------------------------------------------


class ExpenseApprovalWorkflowForm(ModelForm):
    class Meta:
        model = ExpenseApprovalWorkflow
        fields = ["name", "description", "is_active"]
        widgets = {
            "name": forms.TextInput(attrs={"class": "oh-input w-100"}),
            "description": forms.Textarea(attrs={"class": "oh-input w-100", "rows": 3}),
        }


class ExpenseApprovalStageForm(ModelForm):
    class Meta:
        model = ExpenseApprovalStage
        fields = ["workflow", "name", "group", "order", "is_disbursement_stage", "is_active"]
        widgets = {
            "workflow": forms.Select(attrs={"class": "oh-select oh-select-2"}),
            "name": forms.TextInput(attrs={"class": "oh-input w-100"}),
            "group": forms.Select(attrs={"class": "oh-select oh-select-2"}),
            "order": forms.NumberInput(attrs={"class": "oh-input w-100", "min": "1"}),
        }

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