from django import forms
from apps.protocolos.models import Protocolo, ProtocoloSemeadura
from apps.clientes.models import ClientesModels, EmpresasModels
from apps.lotes.models import Semeadura
from django.forms import inlineformset_factory

# forms.py
class ProtocoloSemeaduraForm(forms.ModelForm):
    class Meta:
        model = ProtocoloSemeadura
        fields = ['semeadura', 'categoria', 'qtd_especie', 'valor_unit', 'valor_total', 'data_venda']
        widgets = {
            'semeadura': forms.Select(attrs={'class': 'form-select', 'id': 'semeadura'}),
            'categoria': forms.Select(
                choices=(
                    ('Identificada', 'Identificada'),
                    ('Selecionada', 'Selecionada'),
                    ('Qualificada', 'Qualificada'),
                    ('Testada', 'Testada')
                ),
                attrs={'class': 'form-select', 'id': 'categoria'}
            ),
            'qtd_especie': forms.NumberInput(attrs={'class': 'form-control', 'id': 'qtd_especie'}),
            'valor_unit': forms.NumberInput(attrs={'class': 'form-control', 'id': 'valor_unit'}),
            'valor_total': forms.NumberInput(attrs={'class': 'form-control', 'id': 'valor_total', 'readonly': 'readonly'}),
            'data_venda': forms.DateInput(attrs={'type': 'date', 'class': 'form-control', 'id': 'data_venda'}),
        }

    def set_semeadura_choices(self, choices):
        self.fields['semeadura'].queryset = choices
        self.fields['semeadura'].label_from_instance = lambda obj: f'{obj.numero_muda} - {obj.lote.especie.nome_popular}'

    def save(self, commit=True):
        instance = super().save(commit=False)
        instance.valor_total = instance.qtd_especie * instance.valor_unit
        if commit:
            instance.save()
        return instance


ProtocoloSemeaduraFormSet = inlineformset_factory(Protocolo, ProtocoloSemeadura, form=ProtocoloSemeaduraForm, extra=1, can_delete=True)

class ProtocoloForm(forms.ModelForm):
    semeaduras = forms.ModelMultipleChoiceField(
        queryset=Semeadura.objects.none(),
        required=True,
        widget=forms.SelectMultiple(attrs={'class': 'form-select', 'id': 'semeaduras'}),
        label='Número de Muda',
    )

    class Meta:
        model = Protocolo
        fields = [
            'tipo_cliente', 'cliente_fisico', 'cliente_empresa', 'num_protocolo', 'referente_nf', 'tipo_pagamento', 'num_pedido',
            'destino_muda', 'placa_veiculo', 'resp_recebimento', 'inscricao_estadual', 'produtor', 'renasem_produtor',
            'resp_tecnico', 'renasem_tecnico', 'categoria', 'qtd_especie', 'valor_unit', 'valor_total', 'data_saida_protocolo'
        ]
    
    tipo_cliente = forms.ChoiceField(
        label='Tipo de Cliente',
        choices=[('', 'Selecione um tipo de cliente')] + list(Protocolo.TIPOS_CLIENTE),
        widget=forms.Select(attrs={'class': 'form-select', 'id': 'tipo_cliente'})
    )
    cliente_fisico = forms.ModelChoiceField(
        queryset=ClientesModels.objects.all(),
        required=False,
        widget=forms.Select(attrs={'class': 'form-select', 'id': 'cliente_fisico'})
    )
    cliente_empresa = forms.ModelChoiceField(
        queryset=EmpresasModels.objects.all(),
        required=False,
        widget=forms.Select(attrs={'class': 'form-select', 'id': 'cliente_empresa'})
    )

    num_protocolo = forms.CharField(
        required=False,
        widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'num_protocolo'})
    )
    referente_nf = forms.CharField(
        required=False,
        widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'referente_nf'})
    )
    tipo_pagamento = forms.ChoiceField(
        required=False,
        choices=Protocolo.TIPOS_PAGAMENTO,
        widget=forms.Select(attrs={'class': 'form-select', 'id': 'tipo_pagamento'})
    )
    num_pedido = forms.CharField(
        required=False,
        widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'num_pedido'})
    )
    destino_muda = forms.CharField(
        required=False,
        widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'destino_muda'})
    )
    placa_veiculo = forms.CharField(
        required=False,
        widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'placa_veiculo'})
    )
    resp_recebimento = forms.CharField(
        required=False,
        widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'resp_recebimento'})
    )
    inscricao_estadual = forms.CharField(
        required=False,
        widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'inscricao_estadual'})
    )
    produtor = forms.CharField(
        required=False,
        widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'produtor'})
    )
    renasem_produtor = forms.CharField(
        required=False,
        widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'renasem_produtor'})
    )
    resp_tecnico = forms.CharField(
        required=False,
        widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'resp_tecnico'})
    )
    renasem_tecnico = forms.CharField(
        required=False,
        widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'renasem_tecnico'})
    )

    # Ajuste do campo 'categoria'
    categoria = forms.CharField(
        required=False,
        widget=forms.Select(
            choices=(
                ('Identificada', 'Identificada'),
                ('Selecionada', 'Selecionada'),
                ('Qualificada', 'Qualificada'),
                ('Testada', 'Testada')
            ),
            attrs={'class': 'form-control', 'id': 'categoria'}
        )
    )
    qtd_especie = forms.IntegerField(
        required=False,
        widget=forms.NumberInput(attrs={'class': 'form-control', 'id': 'qtd_especie'})
    )
    valor_unit = forms.DecimalField(
        required=False,
        max_digits=10,
        decimal_places=2,
        widget=forms.NumberInput(attrs={'class': 'form-control', 'id': 'valor_unit'})
    )
    valor_total = forms.DecimalField(
        required=False,
        max_digits=10,
        decimal_places=2,
        widget=forms.NumberInput(attrs={'class': 'form-control', 'id': 'valor_total'})
    )
    data_venda = forms.DateField(
        required=False,
        widget=forms.DateInput(attrs={'class': 'form-control', 'id': 'data_venda'})
    )
    data_saida_protocolo = forms.DateField(
        required=False,
        widget=forms.DateInput(attrs={'type': 'date', 'class': 'form-control', 'id': 'data_saida_protocolo'})
    )


    def __init__(self, *args, **kwargs):
        super(ProtocoloForm, self).__init__(*args, **kwargs)
        self.fields['semeaduras'].queryset = Semeadura.objects.none()
        self.fields['semeaduras'].label_from_instance = lambda obj: f'{obj.id} - {obj.numero_muda}'
        self.fields['cliente_fisico'].widget.attrs['readonly'] = True
        self.fields['cliente_empresa'].widget.attrs['readonly'] = True

    def set_semeadura_choices(self, semeaduras):
        self.fields['semeaduras'].queryset = semeaduras

class ProtocoloInfoForm(forms.ModelForm):
    data_saida_protocolo = forms.DateField(
        required=False,
        widget=forms.DateInput(
            format='%Y-%m-%d',
            attrs={
                'class': 'form-control',
                'id': 'data_saida_protocolo',
                'type': 'date',
            }
        ),
        input_formats=['%Y-%m-%d', '%d/%m/%Y'],
    )

    class Meta:
        model = Protocolo
        fields = [
            'referente_nf', 'tipo_pagamento', 'num_pedido', 'destino_muda',
            'placa_veiculo', 'resp_recebimento', 'inscricao_estadual', 'produtor',
            'renasem_produtor', 'resp_tecnico', 'renasem_tecnico', 'data_saida_protocolo', 'observacao',
        ]
        widgets = {
            'referente_nf': forms.TextInput(attrs={'class': 'form-control', 'id': 'referente_nf'}),
            'tipo_pagamento': forms.Select(attrs={'class': 'form-select', 'id': 'tipo_pagamento'}),
            'num_pedido': forms.TextInput(attrs={'class': 'form-control', 'id': 'num_pedido'}),
            'destino_muda': forms.TextInput(attrs={'class': 'form-control', 'id': 'destino_muda'}),
            'placa_veiculo': forms.TextInput(attrs={'class': 'form-control', 'id': 'placa_veiculo'}),
            'resp_recebimento': forms.TextInput(attrs={'class': 'form-control', 'id': 'resp_recebimento'}),
            'inscricao_estadual': forms.TextInput(attrs={'class': 'form-control', 'id': 'inscricao_estadual'}),
            'produtor': forms.TextInput(attrs={'class': 'form-control', 'id': 'produtor'}),
            'renasem_produtor': forms.TextInput(attrs={'class': 'form-control', 'id': 'renasem_produtor'}),
            'resp_tecnico': forms.TextInput(attrs={'class': 'form-control', 'id': 'resp_tecnico'}),
            'renasem_tecnico': forms.TextInput(attrs={'class': 'form-control', 'id': 'renasem_tecnico'}),
            'observacao': forms.Textarea(attrs={'class': 'form-control', 'id': 'observacao', 'rows': 4}),
        }
