#!/usr/bin/env python3
from __future__ import annotations

import argparse
import json
import sys
from pathlib import Path

ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT))

from external import artificialisation, geo_api, georisques, insee_melodi, sitadel  # noqa: E402
from external.config import agency_epci_codes  # noqa: E402


def dump(obj: object) -> None:
    print(json.dumps(obj, ensure_ascii=False, indent=2))


def main() -> int:
    parser = argparse.ArgumentParser(description="Rafraîchit les caches open data du prototype Foncier narratif.")
    parser.add_argument("--source", choices=["all", "geo", "artificialisation", "sitadel", "georisques", "insee"], default="all")
    parser.add_argument("--force", action="store_true", help="Ignore le cache existant.")
    parser.add_argument("--level", choices=["epci", "commune"], default="epci", help="Niveau pour artificialisation.")
    parser.add_argument("--sitadel-kind", choices=["logements", "locaux", "amenager", "demolir"], default="logements")
    parser.add_argument("--code", help="Code INSEE commune ou SIREN EPCI à rafraîchir pour Cerema/artificialisation.")
    parser.add_argument("--download-csv", action="store_true", help="Télécharger et filtrer le CSV national data.gouv en plus du connecteur Cerema live/cache.")
    args = parser.parse_args()

    results: dict[str, object] = {}

    if args.source in {"all", "geo"}:
        results["geo"] = geo_api.build_agency_communes(force=args.force)

    if args.source in {"all", "artificialisation"}:
        results["artificialisation_metadata"] = artificialisation.metadata(force=args.force)
        try:
            results["cerema_layer"] = artificialisation.cerema_layer_info(force=args.force)
        except Exception as exc:  # noqa: BLE001
            results["cerema_layer_error"] = str(exc)
        if args.source == "artificialisation":
            if args.code:
                results["cerema_summary"] = artificialisation.consumption_summary_for_territory(
                    args.code,
                    args.level,
                    force=args.force,
                    enforce_agency_scope=True,
                )
            elif args.level == "epci":
                results["cerema_summaries"] = {
                    code: artificialisation.consumption_summary_for_territory(code, "epci", force=args.force, enforce_agency_scope=True)
                    for code in agency_epci_codes()
                }
            else:
                results["message"] = "Pour les communes, indiquer --code <code_insee> ou utiliser le cache CSV filtré."
            if args.download_csv:
                results["artificialisation_filter"] = artificialisation.refresh_filtered_cache(level=args.level, force=args.force)
            else:
                results["csv_filter_skipped"] = "CSV national non téléchargé. Ajouter --download-csv pour créer artificialisation_<niveau>_aula.csv."

    if args.source in {"all", "sitadel"}:
        results["sitadel_metadata"] = sitadel.metadata(force=args.force)
        if args.source == "sitadel":
            results["sitadel_filter"] = sitadel.refresh_filtered_cache(kind=args.sitadel_kind, force=args.force)

    if args.source in {"all", "georisques"}:
        scope = geo_api.agency_scope(live=True, force=args.force)
        codes = [str(c.get("code")) for c in scope.get("communes", []) if c.get("code")]
        # Limite volontaire si source=all pour éviter de marteler l'API.
        sample = codes if args.source == "georisques" else codes[:10]
        results["georisques"] = georisques.risks_for_communes(sample, force=args.force)

    if args.source in {"all", "insee"}:
        # On prépare le catalogue et un test de population sur les EPCI du périmètre.
        results["insee_catalog_sample"] = insee_melodi.catalog(force=args.force)[:5]
        if args.source == "insee":
            results["insee_population_reference"] = {
                code: insee_melodi.population_reference_for_epci(code, force=args.force)
                for code in agency_epci_codes()
            }

    dump(results)
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
