"""Export UPP programme CSV data to JSON (verify before DB import).

Usage (project root):
    python app/programme/scripts/export_programme_json.py
    python app/programme/scripts/export_programme_json.py --out app/programme/programme_json
"""
from __future__ import annotations

import argparse
import json
import sys
from pathlib import Path

sys.path.insert(0, str(Path(__file__).resolve().parents[3]))

from app.programme.models_programme import CSV_LEVEL_SLUGS, programme_level_payload_from_csv


def main() -> None:
    parser = argparse.ArgumentParser(description="Export programme hierarchy from UPP CSVs to JSON")
    parser.add_argument(
        "--out",
        type=Path,
        default=Path("app/programme/programme_json"),
        help="Output directory (default: app/programme/programme_json)",
    )
    args = parser.parse_args()
    out_dir: Path = args.out
    out_dir.mkdir(parents=True, exist_ok=True)

    summary: list[dict] = []
    for slug in CSV_LEVEL_SLUGS:
        payload = programme_level_payload_from_csv(slug)
        out_path = out_dir / f"{slug}.json"
        if payload is None:
            print(f"{slug}: CSV NOT FOUND")
            summary.append({"slug": slug, "status": "missing"})
            continue

        out_path.write_text(json.dumps(payload, indent=2, ensure_ascii=False) + "\n", encoding="utf-8")
        n_mod = len(payload["modules"])
        n_weeks = sum(len(m["weeks"]) for m in payload["modules"])
        n_sess = sum(len(w["sessions"]) for m in payload["modules"] for w in m["weeks"])
        n_assess = sum(
            len(s["assessments"])
            for m in payload["modules"]
            for w in m["weeks"]
            for s in w["sessions"]
        )
        print(
            f"{slug}: {out_path} — modules={n_mod}, weeks={n_weeks}, "
            f"sessions={n_sess}, assessments={n_assess} (from {payload['source_csv']})"
        )
        summary.append(
            {
                "slug": slug,
                "display_name": payload["level"]["display_name"],
                "file": str(out_path),
                "modules": n_mod,
                "weeks": n_weeks,
                "sessions": n_sess,
                "assessments": n_assess,
            }
        )

    (out_dir / "_summary.json").write_text(json.dumps(summary, indent=2) + "\n", encoding="utf-8")
    print(f"\nSummary: {out_dir / '_summary.json'}")


if __name__ == "__main__":
    main()
