from crispy_forms import helper
from crispy_forms import layout
from django import forms
from django.utils.translation import gettext_lazy as _

from . import models
from subjects import models as subject_models


class InvoiceItemForm(forms.ModelForm):
    class Meta:
        model = models.InvoiceItem
        fields = ["amount", "amount_unit", "description", "price_for_amount"]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = helper.FormHelper()
        self.helper.form_show_labels = False


InvoiceItemFormSet = forms.inlineformset_factory(
    models.Invoice, models.InvoiceItem, form=InvoiceItemForm,
    fields=["description", "amount", "amount_unit", "price_for_amount"],
    extra=3, can_delete=False, validate_min=True, min_num=1,
)


class CreateInvoiceForm(forms.ModelForm):
    class Meta:
        model = models.Invoice
        fields = ['customer', 'supplier', 'due_date']
        widgets = {
            'due_date': forms.DateInput(attrs={'type': 'date'}),
        }

    def __init__(self, *args, **kwargs):
        self._user = kwargs.pop('current_user', None)

        super().__init__(*args, **kwargs)

        if self._user.supplier:
            self.fields["supplier"].queryset = subject_models.Subject.objects.filter(
                id=self._user.supplier.id,
            )
        else:
            self.fields["supplier"].queryset = subject_models.Subject.objects.none()
        self.fields["customer"].queryset = self._user.customers

        self.helper = helper.FormHelper()
        self.helper.form_method = 'post'
        self.helper.add_input(layout.Submit('submit', _('Save')))

    def save(self, commit=True):
        invoice = super().save(commit=False)
        invoice.user = self._user
        invoice.customer_data = invoice.customer.get_latest_data()
        invoice.supplier_data = invoice.supplier.get_latest_data()
        if commit:
            invoice.save()
        return invoice