from django import forms
from django.contrib.auth import get_user_model
from .models import Morador
from django.contrib.auth.models import Group
import secrets
import string

class MoradorForm(forms.ModelForm):
    email = forms.EmailField()

    class Meta:
        model = Morador
        fields = [
            'nome_completo',
            'telefone',
            'tipo_unidade',
            'identificacao_unidade',
            'vinculo',
            'em_aluguel',
            'aluguel_por_app',
            'email',
        ]

    def __init__(self, *args, **kwargs):
        self.tenant = kwargs.pop('tenant', None)
        super().__init__(*args, **kwargs)

    def clean_email(self):
        email = self.cleaned_data.get('email')
        User = get_user_model()

        # Valida apenas dentro do tenant atual
        if self.tenant:
            if User.objects.filter(email=email, tenant=self.tenant).exists():
                raise forms.ValidationError("Já existe um morador com esse e-mail neste condomínio.")
        else:
            # fallback seguro
            if User.objects.filter(email=email).exists():
                raise forms.ValidationError("Já existe um morador com esse e-mail.")
        return email

    def gerar_senha_segura(self, tamanho=10):
        caracteres = string.ascii_letters + string.digits + string.punctuation
        return ''.join(secrets.choice(caracteres) for _ in range(tamanho))

    def gerar_usuario_unico(self, email):
        User = get_user_model()
        base_username = email.split('@')[0].lower()
        username = base_username
        contador = 1
        while User.objects.filter(username=username).exists():
            username = f"{base_username}{contador}"
            contador += 1
        return username

    def save(self, commit=True):
        User = get_user_model()
        email = self.cleaned_data['email']
        nome = self.cleaned_data['nome_completo']
        senha = self.gerar_senha_segura()
        username = self.gerar_usuario_unico(email)

        user = User.objects.create_user(
            username=username,
            email=email,
            password=senha,
            first_name=nome
        )

        # Define o tenant corretamente
        if self.tenant:
            user.tenant = self.tenant

        group, _ = Group.objects.get_or_create(name="Moradores")
        user.groups.add(group)

        morador = super().save(commit=False)
        morador.user = user
        self.gerada_senha = senha

        if commit:
            user.save()
            morador.save()

        return morador
