from django import forms
from django.contrib.auth import password_validation
from django.contrib.auth.forms import AuthenticationForm, PasswordChangeForm, PasswordResetForm, SetPasswordForm

from apps.core.forms import StyledFormMixin

from .models import User


class LoginForm(StyledFormMixin, AuthenticationForm):
    remember = forms.BooleanField(label="Se souvenir de moi", required=False)

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["username"].label = "Adresse email"
        self.fields["username"].widget.attrs.update({"autocomplete": "email", "placeholder": "vous@exemple.com"})


class StyledPasswordResetForm(StyledFormMixin, PasswordResetForm):
    pass


class StyledSetPasswordForm(StyledFormMixin, SetPasswordForm):
    pass


class StyledPasswordChangeForm(StyledFormMixin, PasswordChangeForm):
    pass


class UserForm(StyledFormMixin, forms.ModelForm):
    password1 = forms.CharField(label="Mot de passe", widget=forms.PasswordInput(attrs={"autocomplete": "new-password"}), required=False)
    password2 = forms.CharField(label="Confirmation", widget=forms.PasswordInput(attrs={"autocomplete": "new-password"}), required=False)

    class Meta:
        model = User
        fields = ["name", "email", "role", "fonction", "bio", "is_active"]
        widgets = {"bio": forms.Textarea(attrs={"rows": 3})}
        help_texts = {
            "role": "Administrateur : tout · Éditeur : tout le contenu · Rédacteur : ses brouillons, soumis en relecture · Lecteur : aucun accès au back-office.",
            "is_active": "Décocher pour bloquer l'accès sans supprimer le compte ni ses articles.",
        }

    def __init__(self, *args, current_user=None, **kwargs):
        super().__init__(*args, **kwargs)
        self.current_user = current_user
        creating = not self.instance.pk
        self.fields["password1"].required = creating
        self.fields["password2"].required = creating
        if not creating:
            self.fields["password1"].help_text = "Laisser vide pour conserver le mot de passe actuel."
        if current_user and self.instance.pk == current_user.pk:
            # On ne peut pas se retirer soi-même les droits d'administration.
            self.fields["role"].disabled = True
            self.fields["is_active"].disabled = True

    def clean(self):
        data = super().clean()
        p1, p2 = data.get("password1"), data.get("password2")
        if p1 or p2:
            if p1 != p2:
                self.add_error("password2", "Les mots de passe ne correspondent pas.")
            else:
                try:
                    password_validation.validate_password(p1, self.instance)
                except forms.ValidationError as e:
                    self.add_error("password1", e)
        return data

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


class ProfileForm(StyledFormMixin, forms.ModelForm):
    class Meta:
        model = User
        fields = ["name", "email", "fonction", "bio"]
        widgets = {"bio": forms.Textarea(attrs={"rows": 4})}


