from xml.dom import VALIDATION_ERR

from django import forms
from django.contrib.auth.management.commands.changepassword import UserModel
from django.core.exceptions import ValidationError


class formConnexion(forms.Form):
    username = forms.CharField(max_length=50, label="Nom d'utilisateur")
    password = forms.CharField(widget=forms.PasswordInput, label="Mot de passe")

class formSignup(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput, label="Mot de passe")

    class Meta:
        model = UserModel
        fields = ['username', 'email']

    def clean_password(self):
        """
        Vérifie que le mot de passe respecte les critères de complexité:
        - Au moins 8 caractères
        - Au moins un chiffre
        - Au moins une lettre majuscule
        - Au moins une lettre minuscule
        - Au moins un symbole (caractère spécial)
        """
        password = self.cleaned_data.get('password')
        
        # Vérification de la longueur minimale
        if len(password) < 8:
            raise ValidationError("Le mot de passe doit contenir au moins 8 caractères.")
        
        # Vérification de la présence d'au moins un chiffre
        if not any(char.isdigit() for char in password):
            raise ValidationError("Le mot de passe doit contenir au moins un chiffre.")
        
        # Vérification de la présence d'au moins une lettre majuscule
        if not any(char.isupper() for char in password):
            raise ValidationError("Le mot de passe doit contenir au moins une lettre majuscule.")
        
        # Vérification de la présence d'au moins une lettre minuscule
        if not any(char.islower() for char in password):
            raise ValidationError("Le mot de passe doit contenir au moins une lettre minuscule.")
        
        # Vérification de la présence d'au moins un caractère spécial
        import string
        special_chars = set(string.punctuation)
        if not any(char in special_chars for char in password):
            raise ValidationError("Le mot de passe doit contenir au moins un caractère spécial (!, @, #, etc.).")
        
        return password

    def cleanPwdConfirm(self):
        password = self.cleaned_data.get('password')
        return password

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

# forms.py
from django import forms
from .models import ProtectedFile, UserFile
from django.contrib.auth.models import User

class ProtectedFileForm(forms.ModelForm):
    allowed_users = forms.ModelMultipleChoiceField(
        queryset=User.objects.all(),
        required=False,
        widget=forms.CheckboxSelectMultiple
    )
    
    class Meta:
        model = ProtectedFile
        fields = ['title', 'file', 'allowed_users']

class FileUploadForm(forms.Form):
    """
    Formulaire simple pour l'upload de fichiers
    """
    file = forms.FileField(
        label='Sélectionner un fichier',
        help_text='Taille max: 50MB',
        widget=forms.ClearableFileInput(attrs={'class': 'upload-input'})
    )
    
    def clean_file(self):
        file = self.cleaned_data.get('file')
        if file:
            if file.size > 50 * 1024 * 1024:  # 50MB limite
                raise ValidationError("Le fichier est trop volumineux. Taille maximum: 50MB.")
        return file

class FileEditForm(forms.Form):
    """
    Formulaire pour modifier le propriétaire et la visibilité d'un fichier
    """
    VISIBILITY_CHOICES = [
        ('private', 'Privé'),
        ('public', 'Public')
    ]
    
    user = forms.ModelChoiceField(
        queryset=User.objects.all().order_by('username'),
        required=False,
        label='Propriétaire',
        empty_label='Public (aucun propriétaire)',
        widget=forms.Select(attrs={'class': 'form-control'})
    )
    
    visibility = forms.ChoiceField(
        choices=VISIBILITY_CHOICES,
        label='Visibilité',
        widget=forms.RadioSelect(attrs={'class': 'visibility-radio'})
    )

class PasswordResetForm(forms.Form):
    """
    Formulaire pour demander une réinitialisation de mot de passe
    """
    email = forms.EmailField(
        label="Email",
        max_length=254,
        widget=forms.EmailInput(attrs={'placeholder': 'Adresse e-mail'})
    )
    
    def clean_email(self):
        email = self.cleaned_data.get('email')
        # Vérifie si l'email existe dans la base de données
        if not User.objects.filter(email=email).exists():
            raise ValidationError("Aucun compte n'est associé à cette adresse e-mail.")
        return email

class SetPasswordForm(forms.Form):
    """
    Formulaire pour définir un nouveau mot de passe
    """
    new_password1 = forms.CharField(
        label="Nouveau mot de passe",
        widget=forms.PasswordInput(attrs={'placeholder': 'Nouveau mot de passe'})
    )
    new_password2 = forms.CharField(
        label="Confirmation du mot de passe",
        widget=forms.PasswordInput(attrs={'placeholder': 'Confirmez le mot de passe'})
    )
    
    def clean_new_password1(self):
        """
        Vérifie que le mot de passe respecte les critères de complexité:
        - Au moins 8 caractères
        - Au moins un chiffre
        - Au moins une lettre majuscule
        - Au moins une lettre minuscule
        - Au moins un symbole (caractère spécial)
        """
        password = self.cleaned_data.get('new_password1')
        
        # Vérification de la longueur minimale
        if len(password) < 8:
            raise ValidationError("Le mot de passe doit contenir au moins 8 caractères.")
        
        # Vérification de la présence d'au moins un chiffre
        if not any(char.isdigit() for char in password):
            raise ValidationError("Le mot de passe doit contenir au moins un chiffre.")
        
        # Vérification de la présence d'au moins une lettre majuscule
        if not any(char.isupper() for char in password):
            raise ValidationError("Le mot de passe doit contenir au moins une lettre majuscule.")
        
        # Vérification de la présence d'au moins une lettre minuscule
        if not any(char.islower() for char in password):
            raise ValidationError("Le mot de passe doit contenir au moins une lettre minuscule.")
        
        # Vérification de la présence d'au moins un caractère spécial
        import string
        special_chars = set(string.punctuation)
        if not any(char in special_chars for char in password):
            raise ValidationError("Le mot de passe doit contenir au moins un caractère spécial (!, @, #, etc.).")
        
        return password
    
    def clean_new_password2(self):
        password1 = self.cleaned_data.get('new_password1')
        password2 = self.cleaned_data.get('new_password2')
        if password1 and password2 and password1 != password2:
            raise ValidationError("Les mots de passe ne correspondent pas.")
        return password2

class UserEditForm(forms.Form):
    """
    Formulaire pour modifier les droits d'un utilisateur
    """
    is_staff = forms.BooleanField(
        required=False,
        label='Administrateur',
        help_text='Cochez pour donner les droits administrateur à cet utilisateur'
    )
    
    is_active = forms.BooleanField(
        required=False,
        label='Compte actif',
        help_text='Décochez pour désactiver le compte sans le supprimer'
    )
    
    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)
        super(UserEditForm, self).__init__(*args, **kwargs)
        
        if user:
            self.fields['is_staff'].initial = user.is_staff
            self.fields['is_active'].initial = user.is_active

class NoteForm(forms.Form):
    """
    Formulaire pour les notes d'utilisateur
    """
    content = forms.CharField(
        widget=forms.Textarea(attrs={'id': 'noteContent', 'placeholder': 'Écrivez votre note ici...'}),
        required=False,
        label=''
    )
