import zipfile
from datetime import datetime
from pathlib import Path

from app.config import obtenir_dossier_sauvegarde
from app.database import BASE_DIR, DB_PATH
from app.google_drive import ErreurGoogleDrive, compte_connecte, televerser_fichier

STATIC_DIR = BASE_DIR / "app" / "static"
UPLOADS_DIR = STATIC_DIR / "uploads"

NOM_PREFIXE = "elfirma_sauvegarde_"


def creer_sauvegarde() -> tuple[Path, str | None]:
    """Crée une archive zip horodatée (base de données + fichiers uploadés) dans le dossier
    de sauvegarde configuré, et la téléverse en plus vers Google Drive si un compte est
    connecté. Renvoie (chemin_zip, message_erreur_drive_ou_None)."""
    dossier = obtenir_dossier_sauvegarde()
    dossier.mkdir(parents=True, exist_ok=True)

    horodatage = datetime.now().strftime("%Y-%m-%d_%H%M%S")
    nom_fichier = f"{NOM_PREFIXE}{horodatage}.zip"
    chemin_zip = dossier / nom_fichier

    with zipfile.ZipFile(chemin_zip, "w", zipfile.ZIP_DEFLATED) as archive:
        if DB_PATH.exists():
            archive.write(DB_PATH, arcname="elfirma.db")
        if UPLOADS_DIR.exists():
            for fichier in UPLOADS_DIR.rglob("*"):
                if fichier.is_file():
                    archive.write(fichier, arcname=str(fichier.relative_to(STATIC_DIR)))

    erreur_drive = None
    if compte_connecte():
        try:
            televerser_fichier(chemin_zip, nom_fichier)
        except ErreurGoogleDrive as exc:
            erreur_drive = str(exc)

    return chemin_zip, erreur_drive


def lister_sauvegardes() -> list[Path]:
    dossier = obtenir_dossier_sauvegarde()
    if not dossier.exists():
        return []
    return sorted(dossier.glob(f"{NOM_PREFIXE}*.zip"), reverse=True)
