from django import forms
from apps.estoque.models import CategoriaInsumo, ItemEstoque, MovimentacaoEstoque

class CategoriaInsumoForm(forms.ModelForm):
    class Meta:
        model = CategoriaInsumo
        fields = ['nome', 'descricao']
        widgets = {
            'nome': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Nome da Categoria'}),
            'descricao': forms.Textarea(attrs={'class': 'form-control', 'rows': 3, 'placeholder': 'Descrição'}),
        }

class ItemEstoqueForm(forms.ModelForm):
    categoria = forms.ModelChoiceField(
        queryset=CategoriaInsumo.objects.all(),
        empty_label="Selecione a categoria",
        widget=forms.Select(attrs={'class': 'form-select', 'id': 'id_categoria'})
    )

    class Meta:
        model = ItemEstoque
        fields = [
            'codigo_item', 'nome_especie', 'nome', 'nome_cientifico', 'categoria', 'quantidade', 'tipo_bandeja',
            'unidade_medida', 'localizacao', 'data_recebimento', 'data_descarte_prevista',
            'data_validade', 'fornecedor', 'custo_unitario', 'notas', 'custo'
        ]
        widgets = {
            'codigo_item': forms.TextInput(attrs={'class': 'form-control', 'readonly': True, 'id': 'id_codigo_item'}),
            'nome_especie': forms.TextInput(attrs={'class': 'form-control', 'id': 'id_nome_especie'}),
            'nome': forms.TextInput(attrs={'class': 'form-control', 'id': 'id_nome'}),
            'nome_cientifico': forms.TextInput(attrs={'class': 'form-control', 'id': 'id_nome_cientifico', 'readonly': 'readonly'}),
            'quantidade': forms.NumberInput(attrs={'class': 'form-control', 'id': 'id_quantidade'}),
            'unidade_medida': forms.Select(attrs={'class': 'form-select', 'id': 'id_unidade_medida'}),
            'localizacao': forms.TextInput(attrs={'class': 'form-control', 'id': 'id_localizacao'}),
            'data_recebimento': forms.DateInput(attrs={'class': 'form-control', 'type': 'date', 'id': 'id_data_recebimento'}),
            'data_descarte_prevista': forms.DateInput(attrs={'class': 'form-control', 'type': 'date', 'id': 'id_data_descarte'}),
            'data_validade': forms.DateInput(attrs={'class': 'form-control', 'type': 'date', 'id': 'id_data_validade'}),
            'fornecedor': forms.Select(attrs={'class': 'form-select', 'id': 'id_fornecedor'}),
            'custo_unitario': forms.NumberInput(attrs={'class': 'form-control', 'id': 'id_custo_unitario'}),
            'notas': forms.Textarea(attrs={'class': 'form-control', 'id': 'id_notas', 'rows': 3}),
            'custo': forms.NumberInput(attrs={'class': 'form-control', 'id': 'id_custo'}),
            'tipo_bandeja': forms.Select(attrs={'class': 'form-select', 'id': 'id_tipo_bandeja'}),  # <-- NOVO WIDGET
        }

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

        # Campos que podem ser ocultados e devem ser opcionais
        self.fields['nome_especie'].required = False
        self.fields['nome_cientifico'].required = False
        self.fields['data_descarte_prevista'].required = False
        self.fields['data_validade'].required = False
        self.fields['data_recebimento'].required = False
        self.fields['fornecedor'].required = False
        self.fields['custo_unitario'].required = False
        self.fields['custo'].required = False
        self.fields['localizacao'].required = False
        self.fields['notas'].required = False


class MovimentacaoEstoqueForm(forms.ModelForm):
    class Meta:
        model = MovimentacaoEstoque
        fields = ['item', 'quantidade', 'tipo', 'observacoes']
        widgets = {
            'item': forms.Select(attrs={'class': 'form-select'}),
            'quantidade': forms.NumberInput(attrs={'class': 'form-control'}),
            'tipo': forms.Select(attrs={'class': 'form-select'}),
            'observacoes': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}),
        }

    def clean(self):
        cleaned_data = super().clean()
        item = cleaned_data.get('item')
        quantidade = cleaned_data.get('quantidade')
        tipo = cleaned_data.get('tipo')

        if tipo == 'saida' and item and quantidade:
            if item.quantidade < quantidade:
                raise forms.ValidationError("Quantidade insuficiente em estoque para saída.")
