from django import forms
from django.contrib.auth.models import User, Group
from .models import Funcionario

class UserRegistrationForm(forms.ModelForm):
    # ... (os campos password, password_confirm e groups permanecem iguais) ...
    password = forms.CharField(
        label='Senha', 
        widget=forms.PasswordInput(attrs={'placeholder': '••••••••'})
    )
    password_confirm = forms.CharField(
        label='Confirmar Senha', 
        widget=forms.PasswordInput(attrs={'placeholder': '••••••••'})
    )
    groups = forms.ModelMultipleChoiceField(
        queryset=Group.objects.all(),
        required=False,
        widget=forms.CheckboxSelectMultiple,
        label="Grupos de Permissão (Segurança)"
    )

    def __init__(self, *args, **kwargs):
        super(UserRegistrationForm, self).__init__(*args, **kwargs)
        
        # Define as classes CSS padrão para os campos de input
        default_attrs = {'class': 'w-full border border-gray-300 rounded-md px-3 py-2 text-gray-900 focus:outline-none focus:ring-2 focus:ring-blue-500'}
        
        # Aplica as classes aos campos
        self.fields['username'].widget.attrs.update(default_attrs)
        self.fields['first_name'].widget.attrs.update(default_attrs)
        self.fields['last_name'].widget.attrs.update(default_attrs)
        self.fields['email'].widget.attrs.update(default_attrs)
        
        # Aplica ao campo de senha, mantendo o placeholder
        password_attrs = default_attrs.copy()
        password_attrs.update(self.fields['password'].widget.attrs)
        self.fields['password'].widget.attrs.update(password_attrs)
        
        # Aplica ao campo de confirmação de senha
        password_confirm_attrs = default_attrs.copy()
        password_confirm_attrs.update(self.fields['password_confirm'].widget.attrs)
        self.fields['password_confirm'].widget.attrs.update(password_confirm_attrs)

    class Meta:
        # ... (o Meta permanece o mesmo) ...
        model = User
        fields = ['username', 'first_name', 'last_name', 'email', 'groups']
        labels = {
            'username': 'Nome de Usuário (para login)',
            'first_name': 'Nome',
            'last_name': 'Sobrenome',
            'email': 'E-mail Empresarial',
            'groups': 'Grupos de Permissão (Segurança)'
        }

    # ... (os métodos clean_password_confirm e save permanecem os mesmos) ...
    def clean_password_confirm(self):
        password = self.cleaned_data.get('password')
        password_confirm = self.cleaned_data.get('password_confirm')
        if password and password_confirm and password != password_confirm:
            raise forms.ValidationError("As senhas não coincidem.")
        return password_confirm
    
    def save(self, commit=True):
        user = super().save(commit=False)
        user.set_password(self.cleaned_data['password'])
        if commit:
            user.save()
            self.save_m2m()
        return user


class FuncionarioProfileForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(FuncionarioProfileForm, self).__init__(*args, **kwargs)
        
        # Define as classes CSS padrão
        default_attrs = {'class': 'w-full border border-gray-300 rounded-md px-3 py-2 text-gray-900 focus:outline-none focus:ring-2 focus:ring-blue-500'}
        # Classes para campos de upload de ficheiro
        file_attrs = {'class': 'w-full text-sm text-gray-900 border border-gray-300 rounded-md cursor-pointer bg-gray-50 focus:outline-none'}

        # Itera por todos os campos do formulário
        for field_name, field in self.fields.items():
            if field_name == 'imagem_perfil':
                # Aplica o estilo de ficheiro
                field.widget.attrs.update(file_attrs)
            elif isinstance(field.widget, forms.Select):
                # Aplica o estilo padrão (para 'idioma', 'perfil_padrao', 'empresa')
                field.widget.attrs.update(default_attrs)
            elif isinstance(field.widget, forms.TextInput) or isinstance(field.widget, forms.EmailInput):
                # Aplica aos campos de texto
                field.widget.attrs.update(default_attrs)
            elif isinstance(field.widget, forms.DateInput):
                # Junta as classes padrão com o 'type: date' existente
                date_attrs = default_attrs.copy()
                date_attrs.update(field.widget.attrs)
                field.widget.attrs.update(date_attrs)

    class Meta:
        model = Funcionario
        exclude = ['user'] 
        widgets = {
            # O widget 'type: date' é mantido e as classes são adicionadas pelo __init__
            'data_admissao': forms.DateInput(attrs={'type': 'date'}),
        }

class UserEditForm(forms.ModelForm):
    """
    Formulário para EDITAR dados da conta (sem senha).
    """
    groups = forms.ModelMultipleChoiceField(
        queryset=Group.objects.all(),
        required=False,
        widget=forms.CheckboxSelectMultiple,
        label="Grupos de Permissão (Segurança)"
    )

    def __init__(self, *args, **kwargs):
        super(UserEditForm, self).__init__(*args, **kwargs)
        
        # Reutiliza o estilo visual do cadastro
        default_attrs = {'class': 'w-full border border-gray-300 rounded-md px-3 py-2 text-gray-900 focus:outline-none focus:ring-2 focus:ring-blue-500'}
        
        self.fields['username'].widget.attrs.update(default_attrs)
        self.fields['first_name'].widget.attrs.update(default_attrs)
        self.fields['last_name'].widget.attrs.update(default_attrs)
        self.fields['email'].widget.attrs.update(default_attrs)

    class Meta:
        model = User
        # Removemos password e password_confirm
        fields = ['username', 'first_name', 'last_name', 'email', 'groups']
        labels = {
            'username': 'Nome de Usuário (Login)',
            'first_name': 'Nome',
            'last_name': 'Sobrenome',
            'email': 'E-mail',
            'groups': 'Grupos de Permissão'
        }
    
    def save(self, commit=True):
        # Sobrescrevemos o save apenas para garantir que os grupos (M2M) sejam salvos
        user = super().save(commit=False)
        if commit:
            user.save()
            self.save_m2m()
        return user