import uuid
from pathlib import Path

from fastapi import UploadFile

from app.database import BASE_DIR

UPLOAD_ROOT = BASE_DIR / "app" / "static" / "uploads"

EXTENSIONS_AUTORISEES = {".pdf", ".jpg", ".jpeg", ".png", ".webp"}
TAILLE_MAX_OCTETS = 10 * 1024 * 1024  # 10 Mo


async def enregistrer_fichier(fichier: UploadFile, sous_dossier: str) -> str:
    """Sauvegarde un UploadFile sous static/uploads/<sous_dossier>/ et renvoie
    le chemin relatif (utilisable dans un <a href="/static/..."> ou <img src=...>)."""
    extension = Path(fichier.filename or "").suffix.lower()
    if extension not in EXTENSIONS_AUTORISEES:
        raise ValueError(
            f"Type de fichier non autorisé ({extension or 'inconnu'}). "
            f"Formats acceptés : {', '.join(sorted(EXTENSIONS_AUTORISEES))}"
        )

    contenu = await fichier.read()
    if len(contenu) > TAILLE_MAX_OCTETS:
        raise ValueError("Fichier trop volumineux (maximum 10 Mo).")

    dossier = UPLOAD_ROOT / sous_dossier
    dossier.mkdir(parents=True, exist_ok=True)

    nom_fichier = f"{uuid.uuid4().hex}{extension}"
    chemin_disque = dossier / nom_fichier
    chemin_disque.write_bytes(contenu)

    return f"uploads/{sous_dossier}/{nom_fichier}"


def supprimer_fichier(chemin_relatif: str | None) -> None:
    if not chemin_relatif:
        return
    chemin_disque = BASE_DIR / "app" / "static" / chemin_relatif
    try:
        chemin_disque.unlink(missing_ok=True)
    except OSError:
        pass
