# utils/validators.py
# Fonctions utilitaires de validation centralisées

import re
import secrets
import string


def validate_email_format(email):
    """Valide le format d'une adresse email."""
    pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
    return re.match(pattern, email) is not None


def escape_like_pattern(search_term):
    """Échappe les caractères spéciaux pour les requêtes LIKE/ILIKE."""
    if not search_term:
        return search_term
    return search_term.replace('\\', '\\\\').replace('%', r'\%').replace('_', r'\_')


def validate_pdf_content(file_stream):
    """
    Vérifie que le contenu du fichier est réellement un PDF (Magic Bytes).
    Les PDF commencent par '%PDF-' (hex: 25 50 44 46 2D)
    Certains PDF peuvent avoir des espaces blancs avant le header.
    """
    file_stream.seek(0)
    header = file_stream.read(1024)
    file_stream.seek(0)
    return b'%PDF-' in header[:1024]


def validate_image_content(file_stream):
    """
    Vérifie les magic bytes des images (PNG et JPEG).
    """
    file_stream.seek(0)
    header = file_stream.read(12)
    file_stream.seek(0)
    
    return (
        header[:4] == b'\x89PNG' or      # PNG
        header[:3] == b'\xff\xd8\xff'    # JPEG
    )


def generate_random_password(length=32):
    """Génère un mot de passe aléatoire sécurisé avec tous les types de caractères."""
    if length < 8:
        length = 8
    
    alphabet = string.ascii_letters + string.digits + "!@#$%^&*"
    
    while True:
        password = ''.join(secrets.choice(alphabet) for _ in range(length))
        # Vérifier qu'on a au moins un de chaque type
        if (any(c.isupper() for c in password) and
            any(c.islower() for c in password) and
            any(c.isdigit() for c in password) and
            any(c in "!@#$%^&*" for c in password)):
            return password