"""
Formulários — App Finance
============================
PaymentForm para registar pagamentos contra faturas.
"""

from django import forms
from django.utils.translation import gettext_lazy as _

from .models import Payment


class PaymentForm(forms.ModelForm):
    """Formulário para registar um pagamento."""

    class Meta:
        model = Payment
        fields = ["monto", "metodo", "referencia"]
        widgets = {
            "monto": forms.NumberInput(attrs={
                "class": "w-full px-4 py-3 border border-gray-200 rounded-xl focus:ring-2 focus:ring-rosa/30 focus:border-rosa outline-none transition",
                "placeholder": "0.00",
                "step": "0.01",
                "min": "0.01",
            }),
            "metodo": forms.Select(attrs={
                "class": "w-full px-4 py-3 border border-gray-200 rounded-xl focus:ring-2 focus:ring-rosa/30 focus:border-rosa outline-none transition",
            }),
            "referencia": forms.TextInput(attrs={
                "class": "w-full px-4 py-3 border border-gray-200 rounded-xl focus:ring-2 focus:ring-rosa/30 focus:border-rosa outline-none transition",
                "placeholder": "Nro. transferência ou referência Multicaixa",
            }),
        }

    def __init__(self, *args, invoice=None, **kwargs):
        super().__init__(*args, **kwargs)
        self._invoice = invoice
        if invoice:
            self.fields["monto"].widget.attrs["max"] = str(invoice.saldo_pendiente)

    def clean_monto(self):
        monto = self.cleaned_data["monto"]
        if self._invoice and monto > self._invoice.saldo_pendiente:
            raise forms.ValidationError(
                _("O montante não pode exceder o saldo pendente de %(saldo)s Kz."),
                params={"saldo": f"{self._invoice.saldo_pendiente:,.2f}"},
            )
        return monto


class DateRangeForm(forms.Form):
    """Filtro por intervalo de datas para o dashboard financeiro."""

    fecha_inicio = forms.DateField(
        required=False,
        widget=forms.DateInput(attrs={
            "type": "date",
            "class": "px-4 py-2.5 border border-gray-200 rounded-xl focus:ring-2 focus:ring-rosa/30 focus:border-rosa outline-none transition text-sm",
        }),
    )
    fecha_fin = forms.DateField(
        required=False,
        widget=forms.DateInput(attrs={
            "type": "date",
            "class": "px-4 py-2.5 border border-gray-200 rounded-xl focus:ring-2 focus:ring-rosa/30 focus:border-rosa outline-none transition text-sm",
        }),
    )
