"""Validators personnalisés pour la validation des données."""

import re
from typing import Optional


def validate_email_format(email: str) -> bool:
    """Valide le format d'une adresse email.
    
    Args:
        email: Adresse email à valider.
    
    Returns:
        True si l'email est valide, False sinon.
    """
    pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
    return bool(re.match(pattern, email))


def validate_username_format(username: str) -> bool:
    """Valide le format d'un nom d'utilisateur.
    
    Le username doit:
    - Contenir entre 3 et 50 caractères
    - Contenir uniquement des lettres, chiffres, underscores et tirets
    - Commencer par une lettre
    
    Args:
        username: Nom d'utilisateur à valider.
    
    Returns:
        True si le username est valide, False sinon.
    """
    if len(username) < 3 or len(username) > 50:
        return False
    
    pattern = r'^[a-zA-Z][a-zA-Z0-9_-]*$'
    return bool(re.match(pattern, username))


def validate_password_strength(password: str) -> tuple[bool, Optional[str]]:
    """Valide la force d'un mot de passe.
    
    Le mot de passe doit:
    - Contenir au moins 8 caractères
    - Contenir au moins une lettre majuscule
    - Contenir au moins une lettre minuscule
    - Contenir au moins un chiffre
    
    Args:
        password: Mot de passe à valider.
    
    Returns:
        Tuple (is_valid, error_message).
    """
    if len(password) < 8:
        return False, "Le mot de passe doit contenir au moins 8 caractères"
    
    if not re.search(r'[A-Z]', password):
        return False, "Le mot de passe doit contenir au moins une majuscule"
    
    if not re.search(r'[a-z]', password):
        return False, "Le mot de passe doit contenir au moins une minuscule"
    
    if not re.search(r'[0-9]', password):
        return False, "Le mot de passe doit contenir au moins un chiffre"
    
    return True, None

