from django import forms
from django.core.exceptions import ValidationError
import re
from apps.funcionario.models import Funcionario

class FuncionarioForm(forms.ModelForm):
    foto = forms.ImageField(required=False)

    cpf = forms.CharField(
        max_length=14,
        widget=forms.TextInput(attrs={
            'class': 'form-control',
            'placeholder': '000.000.000-00',
            'data-mask': '000.000.000-00'
        }),
        label='CPF'
    )

    cep = forms.CharField(
        max_length=9,
        required=False,
        widget=forms.TextInput(attrs={
            'class': 'form-control',
            'placeholder': '00000-000',
            'data-mask': '00000-000'
        }),
        label='CEP'
    )

    telefone = forms.CharField(
        max_length=14,
        required=False,
        widget=forms.TextInput(attrs={
            'class': 'form-control',
            'placeholder': '(00) 0000-0000',
            'data-mask': '(00) 0000-0000'
        }),
        label='Telefone'
    )

    celular = forms.CharField(
        max_length=15,
        required=False,
        widget=forms.TextInput(attrs={
            'class': 'form-control',
            'placeholder': '(00) 00000-0000',
            'data-mask': '(00) 00000-0000'
        }),
        label='Celular'
    )

    class Meta:
        model = Funcionario
        exclude = ['cargo']  # Excluímos cargo aqui porque vamos tratar manualmente

        widgets = {
            'nome_completo': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Nome Completo'}),
            'data_nascimento': forms.DateInput(format='%Y-%m-%d', attrs={'class': 'form-control', 'type': 'date'}),
            'rg': forms.TextInput(attrs={'class': 'form-control', 'placeholder': '00.000.000-0', 'data-mask': '00.000.000-0'}),
            'genero': forms.Select(attrs={'class': 'form-select'}),
            'estado_civil': forms.Select(attrs={'class': 'form-select'}),
            'endereco': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Endereço'}),
            'bairro': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Bairro'}),
            'cidade': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Cidade'}),
            'estado': forms.Select(attrs={'class': 'form-select'}),
            'email': forms.EmailInput(attrs={'class': 'form-control', 'placeholder': 'email@exemplo.com'}),
            'departamento': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Departamento'}),
            'data_admissao': forms.DateInput(format='%Y-%m-%d', attrs={'class': 'form-control', 'type': 'date'}),
            'salario': forms.NumberInput(attrs={'class': 'form-control', 'placeholder': 'Salário'}),
            'tipo_contrato': forms.Select(attrs={'class': 'form-select'}),
        }

    def clean_cpf(self):
        cpf = self.cleaned_data.get('cpf')
        cpf = re.sub(r'[^0-9]', '', cpf)
        if len(cpf) != 11:
            raise ValidationError('CPF inválido. Deve conter 11 dígitos.')
        if not self.validar_cpf(cpf):
            raise ValidationError('CPF inválido.')
        return cpf

    def clean_cep(self):
        cep = self.cleaned_data.get('cep')
        if cep:
            cep = re.sub(r'[^0-9]', '', cep)
            if len(cep) != 8:
                raise ValidationError('CEP inválido. Deve conter 8 dígitos.')
        return cep

    def clean_rg(self):
        rg = self.cleaned_data.get('rg')
        if rg:
            rg = re.sub(r'[^0-9]', '', rg)
            if len(rg) > 20:
                raise ValidationError('RG inválido.')
        return rg

    def clean_telefone(self):
        telefone = self.cleaned_data.get('telefone')
        if telefone:
            telefone = re.sub(r'[^0-9]', '', telefone)
            if len(telefone) != 10:
                raise ValidationError('Telefone inválido. Deve conter 10 dígitos.')
        return telefone

    def clean_celular(self):
        celular = self.cleaned_data.get('celular')
        if celular:
            celular = re.sub(r'[^0-9]', '', celular)
            if len(celular) != 11:
                raise ValidationError('Celular inválido. Deve conter 11 dígitos.')
        return celular

    #def clean_email(self):
        #email = self.cleaned_data.get('email')
        #if self.instance.pk:
         #   if Funcionario.objects.filter(email=email).exclude(pk=self.instance.pk).exists():
           #     raise ValidationError('Este e-mail já está em uso.')
        #else:
          #  if Funcionario.objects.filter(email=email).exists():
           #     raise ValidationError('Este e-mail já está em uso.')
        #return email

    def validar_cpf(self, cpf):
        if len(cpf) != 11 or cpf == cpf[0] * 11:
            return False
        for i in range(9, 11):
            soma = sum(int(cpf[j]) * ((i + 1) - j) for j in range(i))
            digito = ((soma * 10) % 11) % 10
            if digito != int(cpf[i]):
                return False
        return True