"""
purge_demo_data.py — supprime les données de démo des anciennes installations.

Les versions précédentes créaient au premier démarrage une école fictive (184 élèves,
~165 familles, ~100 commandes) et 5 codes de démonstration (LMR-4827, EMM-2931,
LEA-5502, TOM-7183, DEMO). La version actuelle ne crée plus rien de tel, mais une
base existante les conserve. Ce script les retire.

  python scripts/purge_demo_data.py            # simulation : affiche ce qui serait supprimé
  python scripts/purge_demo_data.py --apply    # supprime (après une copie de sauvegarde de la base)

Sont considérés comme données de démo :
  - les 5 codes famille fixes ci-dessus ;
  - les familles dont l'e-mail suit le motif généré « famille.<nom><n>@email.fr » ;
  - les commandes de ces familles, leurs élèves, leurs dossiers de photos et aperçus.
Les vraies familles (importées par CSV) ne sont jamais touchées.
"""
import argparse
import shutil
import sys
from pathlib import Path

sys.path.insert(0, str(Path(__file__).resolve().parent.parent))

from core import config  # noqa: E402
from core.db import get_db  # noqa: E402

FIXED_CODES = ("LMR-4827", "EMM-2931", "LEA-5502", "TOM-7183", "DEMO")


def main() -> int:
    ap = argparse.ArgumentParser()
    ap.add_argument("--apply", action="store_true", help="exécute réellement la suppression")
    args = ap.parse_args()

    conn = get_db()

    codes = {r["code"] for r in conn.execute(
        "SELECT code FROM families WHERE code IN (%s) OR email LIKE 'famille.%%@email.fr'" % ",".join("?" * len(FIXED_CODES)),
        FIXED_CODES)}
    codes |= {c for c in FIXED_CODES}  # dossiers de photos des codes fixes, même sans ligne en base
    marks = ",".join("?" * len(codes))
    n_fam = conn.execute(f"SELECT COUNT(*) AS n FROM families WHERE code IN ({marks})", tuple(codes)).fetchone()["n"]
    n_stu = conn.execute(f"SELECT COUNT(*) AS n FROM students WHERE family_code IN ({marks})", tuple(codes)).fetchone()["n"]
    n_ord = conn.execute(f"SELECT COUNT(*) AS n FROM orders WHERE family_code IN ({marks})", tuple(codes)).fetchone()["n"]
    n_paid = conn.execute(f"SELECT COUNT(*) AS n FROM orders WHERE family_code IN ({marks}) AND payment_status='paid'",
                          tuple(codes)).fetchone()["n"]
    dirs = [d for c in codes for d in (config.PHOTOS_DIR / c, config.THUMBS_DIR / c) if d.exists()]

    print(f"Familles de démo : {n_fam} | élèves : {n_stu} | commandes : {n_ord} (dont {n_paid} PAYÉES) | dossiers : {len(dirs)}")
    if n_paid:
        print("⚠️  Des commandes payées sont rattachées à ces familles : vérifiez qu'il s'agit bien de démo avant d'appliquer.")
    if not args.apply:
        print("Simulation seulement. Relancez avec --apply pour supprimer.")
        return 0

    from services import backup_service
    print(f"Sauvegarde : {backup_service._backup_once()}")
    with conn:
        conn.execute(f"DELETE FROM orders WHERE family_code IN ({marks})", tuple(codes))
        conn.execute(f"DELETE FROM students WHERE family_code IN ({marks})", tuple(codes))
        conn.execute(f"DELETE FROM families WHERE code IN ({marks})", tuple(codes))
    for d in dirs:
        shutil.rmtree(d, ignore_errors=True)
    print("Données de démo supprimées.")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
