from django import forms
from django.contrib.auth.models import User
from extra_views import InlineFormSetFactory

from financial import crispy_layouts
from financial.consts import TransactionPaymentType
from financial.models import Transaction, Cashier, AccountingHeadings, CostCenter, ExchangeRate
from utils.date_utils.form_fields import DateTimePickerField
from utils.form_fields import RestrictedFormFileField
from utils.forms import GenericBaseInlineFormSet
from utils.select2_form_fields import ModelSelect2Widget, Select2Widget


class TransactionCreateForm(forms.ModelForm):
    is_multipart = True

    class Meta:
        model = User
        fields = ()

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = crispy_layouts.TransactionCreateFormHelper()


class TransactionCreateInlineForm(forms.ModelForm):
    add_button_title = 'ردیف'

    transaction_date = DateTimePickerField(default_persian=True, required=True)
    payment = forms.IntegerField(max_value=100000000000, label='پرداخت', required=False)
    receipt = forms.IntegerField(max_value=100000000000, label='دریافت', required=False)
    beneficiary = forms.CharField(label='ذینفع', required=True)
    # payment_type = forms.ChoiceField(choices=TransactionPaymentType, widget=Select2Widget, required=False)
    cashier = forms.ModelChoiceField(
        label='صندوق',
        queryset=Cashier.objects.all(),
        # choices=Cashier.objects.all().values_list('id', 'name'),
        widget=ModelSelect2Widget(
            {'data-minimum-input-length': 0},
            search_fields=['name__icontains', ],

        ),
        required=True,
    )
    description = forms.CharField(label='توضیحات')
    accounting_headings = forms.ModelChoiceField(
        label='سرفصل حسابداری',
        queryset=AccountingHeadings.objects.all(),
        # choices=AccountingHeadings.objects.all().values_list('id', 'name'),
        widget=ModelSelect2Widget(
            {'data-minimum-input-length': 0},
            search_fields=['name__icontains', ],

        ),
        required=True,
    )
    cost_center = forms.ModelChoiceField(
        label='مرکز هزینه',
        queryset=CostCenter.objects.all(),
        # choices=CostCenter.objects.all().values_list('id', 'name'),
        widget=ModelSelect2Widget(
            {'data-minimum-input-length': 0},
            search_fields=['name__icontains', ],

        ),
        required=True,
    )
    factor_image = RestrictedFormFileField(
        content_types=['application/pdf', 'video/mp4', 'audio/mpeg', 'image/jpeg', 'image/png'],
        max_upload_size=5242880,
        required=True,
    )

    class Meta:
        model = Transaction
        fields = ['transaction_date', 'description', 'payment_type', 'cashier', 'beneficiary', 'payment', 'receipt',
                  'accounting_headings', 'cost_center', 'factor_image']

    def clean(self):
        cleaned_data = super().clean()
        payment = cleaned_data.get('payment') or 0
        receipt = cleaned_data.get('receipt') or 0
        if not payment and not receipt:
            self.add_error('payment', 'حداقل یکی از دو قسمت پرداخت یا دریافت را پر کنید')
        return cleaned_data

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        user = self.initial['request'].user
        self.helper = crispy_layouts.TransactionCreateInlineFormHelper()
        self.header_row_helper = crispy_layouts.TransactionCreateInlineFormHeaderHelper()
        for field_name in self.fields:
            # if self.fields[field_name].label:
            #     self.fields[field_name].widget.attrs.setdefault('placeholder', self.fields[field_name].label)
            self.fields[field_name].label = ''

    def save(self, commit=True):
        self.instance.creator = self.initial['request'].user
        last_usdt_rate = ExchangeRate.objects.filter(name='usdt-rls').last()
        if self.instance.payment and last_usdt_rate:
            self.instance.usdt_payment = (self.instance.payment / (float(last_usdt_rate.latest) / 10))
        if self.instance.receipt and last_usdt_rate:
            self.instance.usdt_receipt = (self.instance.receipt / (float(last_usdt_rate.latest) / 10))
        return super().save(commit=commit)


class TransactionCreateFormsetFactory(InlineFormSetFactory):
    model = Transaction
    form_class = TransactionCreateInlineForm
    formset_class = GenericBaseInlineFormSet
    factory_kwargs = {
        'extra': 1,
        'max_num': 50,
        'can_order': False,
    }
    prefix = 'transaction'

    def get_formset_kwargs(self):
        kwargs = super().get_formset_kwargs()
        kwargs['form_kwargs'] = {
            'initial': {
                'request': self.request,
            },
        }
        return kwargs
