from django import forms
from django.contrib.auth.models import User

class ValidatePDFForm(forms.Form):
    pdf = forms.FileField(
        label="Documento PDF firmado",
        help_text="Sube un PDF con firma electrónica avanzada para validar.",
    )

    def clean_pdf(self):
        f = self.cleaned_data["pdf"]
        if not f.name.lower().endswith(".pdf"):
            raise forms.ValidationError("El archivo debe ser PDF.")
        if f.size > 15 * 1024 * 1024:
            raise forms.ValidationError("Máximo 15MB.")
        return f


class DemoRequestForm(forms.Form):
    name = forms.CharField(label="Nombre", max_length=120)
    email = forms.EmailField(label="Email")
    company = forms.CharField(label="Empresa", max_length=160, required=False)
    message = forms.CharField(label="Mensaje", widget=forms.Textarea, required=False)

class AdminUserCreateForm(forms.ModelForm):
    password = forms.CharField(
        label="Contraseña",
        widget=forms.PasswordInput,
        min_length=8
    )

    class Meta:
        model = User
        fields = ["username", "first_name", "last_name", "email", "is_staff", "is_active"]

    def save(self, commit=True):
        user = super().save(commit=False)
        user.set_password(self.cleaned_data["password"])
        if commit:
            user.save()
        return user


class AdminUserEditForm(forms.ModelForm):
    new_password = forms.CharField(
        label="Nueva contraseña",
        widget=forms.PasswordInput,
        required=False,
        min_length=8
    )

    class Meta:
        model = User
        fields = ["username", "first_name", "last_name", "email", "is_staff", "is_active"]

    def save(self, commit=True):
        user = super().save(commit=False)
        new_password = self.cleaned_data.get("new_password")
        if new_password:
            user.set_password(new_password)
        if commit:
            user.save()
        return user

class RegisterUserForm(forms.ModelForm):
    email = forms.EmailField(
        label="Email",
        required=True,
        error_messages={
            "required": "El email es obligatorio.",
            "invalid": "Ingresa un email válido.",
        }
    )

    password = forms.CharField(
        label="Contraseña",
        widget=forms.PasswordInput,
        min_length=8
    )

    password_confirm = forms.CharField(
        label="Confirmar contraseña",
        widget=forms.PasswordInput,
        min_length=8
    )

    class Meta:
        model = User
        fields = ["username", "first_name", "last_name", "email"]

    def clean_email(self):
        email = self.cleaned_data.get("email", "").strip().lower()

        if User.objects.filter(email__iexact=email).exists():
            raise forms.ValidationError("Este email ya está registrado.")

        return email

    def clean_username(self):
        username = self.cleaned_data.get("username", "").strip()

        if User.objects.filter(username__iexact=username).exists():
            raise forms.ValidationError("Este nombre de usuario ya existe.")

        return username

    def clean(self):
        cleaned_data = super().clean()
        password = cleaned_data.get("password")
        password_confirm = cleaned_data.get("password_confirm")

        if password and password_confirm and password != password_confirm:
            raise forms.ValidationError("Las contraseñas no coinciden.")

        return cleaned_data

    def save(self, commit=True):
        user = super().save(commit=False)
        user.email = self.cleaned_data["email"].lower()
        user.set_password(self.cleaned_data["password"])
        user.is_active = True
        user.is_staff = False

        if commit:
            user.save()

        return user