import os
import uuid

def get_upload_path(prefix, filename, instance_slug=None):
    """
    Génère un chemin unique : prefix/slug_ou_uuid/filename_uuid.ext
    Garantit qu'aucun fichier n'est écrasé et garde le dossier media propre.
    """
    ext = filename.split('.')[-1].lower()
    # On génère un nom de fichier aléatoire court pour éviter les conflits
    new_filename = f"{uuid.uuid4().hex[:10]}.{ext}"
    
    if instance_slug:
        # Si l'objet a un slug, on crée un sous-dossier propre
        return os.path.join(prefix, instance_slug, new_filename)
    
    # Sinon, on met directement dans le dossier prefix
    return os.path.join(prefix, new_filename)

# --- Wrappers spécifiques pour chaque application ---
# Ces fonctions seront appelées par upload_to=... dans models.py

def upload_to_identity(instance, filename):
    """Pour la photo de profil et le CV"""
    return get_upload_path('identity', filename)

def upload_to_skills(instance, filename):
    """Pour les icones/logos des compétences"""
    return get_upload_path('skills', filename)

def upload_to_projects(instance, filename):
    """Pour l'image de couverture du projet"""
    # On utilise getattr pour éviter un crash si le slug n'est pas encore généré
    slug = getattr(instance, 'slug', 'temp') 
    return get_upload_path('projects', filename, slug)

def upload_to_project_gallery(instance, filename):
    """
    Pour la galerie d'images.
    Note: instance est ici un ProjectImage, qui a une FK vers Project.
    """
    slug = getattr(instance.project, 'slug', 'temp')
    return get_upload_path('projects', filename, slug)

def upload_to_services(instance, filename):
    """Pour les images des services"""
    slug = getattr(instance, 'slug', 'temp')
    return get_upload_path('services', filename, slug)


def upload_to_favicon(instance, filename):
    """Pour le favicon du site (stocké dans core/)"""
    return get_upload_path('core', filename)