"""
Formulários de autenticação — App Users
==========================================
Registo, login, recuperação de palavra-passe.
"""

from django import forms
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import (
    PasswordResetForm,
    SetPasswordForm,
)
from django.contrib.auth.password_validation import validate_password
from django.utils.translation import gettext_lazy as _

User = get_user_model()


class RegistroForm(forms.ModelForm):
    """Formulário de registo com confirmação de palavra-passe."""

    password1 = forms.CharField(
        label=_("Palavra-passe"),
        widget=forms.PasswordInput(attrs={
            "class": "w-full px-4 py-3 border border-gray-200 rounded-xl focus:ring-2 focus:ring-rosa/20 focus:border-rosa outline-none transition-all duration-300",
            "placeholder": "Mínimo 8 caracteres",
            "autocomplete": "new-password",
        }),
    )
    password2 = forms.CharField(
        label=_("Confirmar palavra-passe"),
        widget=forms.PasswordInput(attrs={
            "class": "w-full px-4 py-3 border border-gray-200 rounded-xl focus:ring-2 focus:ring-rosa/20 focus:border-rosa outline-none transition-all duration-300",
            "placeholder": "Repetir palavra-passe",
            "autocomplete": "new-password",
        }),
    )

    class Meta:
        model = User
        fields = ("email", "nombre", "apellido", "telefono", "foto_perfil")
        widgets = {
            "email": forms.EmailInput(attrs={
                "class": "w-full px-4 py-3 border border-gray-200 rounded-xl focus:ring-2 focus:ring-rosa/20 focus:border-rosa outline-none transition-all duration-300",
                "placeholder": "seu@email.com",
                "autocomplete": "email",
            }),
            "nombre": forms.TextInput(attrs={
                "class": "w-full px-4 py-3 border border-gray-200 rounded-xl focus:ring-2 focus:ring-rosa/20 focus:border-rosa outline-none transition-all duration-300",
                "placeholder": "O seu nome",
                "autocomplete": "given-name",
            }),
            "apellido": forms.TextInput(attrs={
                "class": "w-full px-4 py-3 border border-gray-200 rounded-xl focus:ring-2 focus:ring-rosa/20 focus:border-rosa outline-none transition-all duration-300",
                "placeholder": "O seu apelido",
                "autocomplete": "family-name",
            }),
            "telefono": forms.TextInput(attrs={
                "class": "w-full px-4 py-3 border border-gray-200 rounded-xl focus:ring-2 focus:ring-rosa/20 focus:border-rosa outline-none transition-all duration-300",
                "placeholder": "+244 9XX XXX XXX",
                "autocomplete": "tel",
            }),
        }

    def clean_email(self):
        email = self.cleaned_data.get("email", "").lower().strip()
        if User.objects.filter(email=email).exists():
            raise forms.ValidationError(_("Já existe uma conta com este email."))
        return email

    def clean_password1(self):
        password = self.cleaned_data.get("password1")
        validate_password(password)
        return password

    def clean(self):
        cleaned_data = super().clean()
        p1 = cleaned_data.get("password1")
        p2 = cleaned_data.get("password2")
        if p1 and p2 and p1 != p2:
            self.add_error("password2", _("As palavras-passe não coincidem."))
        return cleaned_data

    def save(self, commit=True):
        user = super().save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        user.is_verified = False
        if commit:
            user.save()
        return user


class EditarPerfilForm(forms.ModelForm):
    """Formulário de edição de perfil do paciente."""

    class Meta:
        model = User
        fields = ("nombre", "apellido", "telefono", "foto_perfil")
        widgets = {
            "nombre": forms.TextInput(attrs={
                "class": "w-full px-4 py-3 border border-gray-200 rounded-xl focus:ring-2 focus:ring-rosa/20 focus:border-rosa outline-none transition-all duration-300",
                "placeholder": "O seu nome",
            }),
            "apellido": forms.TextInput(attrs={
                "class": "w-full px-4 py-3 border border-gray-200 rounded-xl focus:ring-2 focus:ring-rosa/20 focus:border-rosa outline-none transition-all duration-300",
                "placeholder": "O seu apelido",
            }),
            "telefono": forms.TextInput(attrs={
                "class": "w-full px-4 py-3 border border-gray-200 rounded-xl focus:ring-2 focus:ring-rosa/20 focus:border-rosa outline-none transition-all duration-300",
                "placeholder": "+244 9XX XXX XXX",
            }),
        }


class LoginForm(forms.Form):
    """Formulário de login com email e palavra-passe."""

    email = forms.EmailField(
        label=_("Email"),
        widget=forms.EmailInput(attrs={
            "class": "w-full px-4 py-3 border border-gray-200 rounded-xl focus:ring-2 focus:ring-rosa/20 focus:border-rosa outline-none transition-all duration-300",
            "placeholder": "seu@email.com",
            "autocomplete": "off",
        }),
    )
    password = forms.CharField(
        label=_("Palavra-passe"),
        widget=forms.PasswordInput(attrs={
            "class": "w-full px-4 py-3 border border-gray-200 rounded-xl focus:ring-2 focus:ring-rosa/20 focus:border-rosa outline-none transition-all duration-300",
            "placeholder": "A sua palavra-passe",
            "autocomplete": "off",
        }),
    )


class CustomPasswordResetForm(PasswordResetForm):
    """Formulário de solicitação de reset de palavra-passe com estilo."""

    email = forms.EmailField(
        label=_("Email"),
        max_length=254,
        widget=forms.EmailInput(attrs={
            "class": "w-full px-4 py-3 border border-gray-200 rounded-xl focus:ring-2 focus:ring-rosa/20 focus:border-rosa outline-none transition-all duration-300",
            "placeholder": "seu@email.com",
            "autocomplete": "email",
        }),
    )


class CustomSetPasswordForm(SetPasswordForm):
    """Formulário de nova palavra-passe com estilo."""

    new_password1 = forms.CharField(
        label=_("Nova palavra-passe"),
        widget=forms.PasswordInput(attrs={
            "class": "w-full px-4 py-3 border border-gray-200 rounded-xl focus:ring-2 focus:ring-rosa/20 focus:border-rosa outline-none transition-all duration-300",
            "placeholder": "Mínimo 8 caracteres",
            "autocomplete": "new-password",
        }),
    )
    new_password2 = forms.CharField(
        label=_("Confirmar nova palavra-passe"),
        widget=forms.PasswordInput(attrs={
            "class": "w-full px-4 py-3 border border-gray-200 rounded-xl focus:ring-2 focus:ring-rosa/20 focus:border-rosa outline-none transition-all duration-300",
            "placeholder": "Repetir palavra-passe",
            "autocomplete": "new-password",
        }),
    )
