#!/usr/bin/env python3
"""
Lit le questionnaire Excel rempli et produit un JSON exploitable.

Usage :
    python tools/parse_questionnaire_reponses.py docs/Questionnaire-import-copro.xlsx
    python tools/parse_questionnaire_reponses.py reponses-papa.xlsx -o data/import-config.json
"""
from __future__ import annotations

import argparse
import json
import sys
from datetime import datetime, timezone
from pathlib import Path


def _require_openpyxl():
    try:
        import openpyxl
    except ImportError:
        print("openpyxl requis : pip install openpyxl", file=sys.stderr)
        sys.exit(1)
    return openpyxl


def parse_questionnaire(path: Path) -> dict:
    openpyxl = _require_openpyxl()
    wb = openpyxl.load_workbook(path, read_only=True, data_only=True)

    if "Réponses" not in wb.sheetnames:
        print("Onglet « Réponses » introuvable.", file=sys.stderr)
        sys.exit(1)

    ws = wb["Réponses"]
    rows = list(ws.iter_rows(min_row=2, values_only=True))
    wb.close()

    reponses: dict[str, dict] = {}
    non_repondu: list[str] = []

    for row in rows:
        if not row or not row[0]:
            continue
        qid = str(row[0]).strip()
        section = (row[1] or "").strip() if len(row) > 1 else ""
        question = (row[2] or "").strip() if len(row) > 2 else ""
        qtype = (row[3] or "").strip() if len(row) > 3 else ""
        valeur = row[4] if len(row) > 4 else None
        commentaire = row[5] if len(row) > 5 else None

        if valeur is None or str(valeur).strip() == "":
            non_repondu.append(qid)
            valeur_str = ""
        else:
            valeur_str = str(valeur).strip()

        comm_str = "" if commentaire is None else str(commentaire).strip()

        reponses[qid] = {
            "section": section,
            "question": question,
            "type": qtype,
            "valeur": valeur_str,
            "commentaire": comm_str,
        }

    return {
        "meta": {
            "source": str(path.resolve()),
            "exporte_le": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
            "nb_questions": len(reponses),
            "nb_non_repondu": len(non_repondu),
        },
        "non_repondu": non_repondu,
        "reponses": reponses,
    }


def main() -> None:
    parser = argparse.ArgumentParser(description="Exporte les réponses du questionnaire en JSON")
    parser.add_argument("fichier", type=Path, help="Excel rempli (.xlsx)")
    parser.add_argument(
        "-o",
        "--output",
        type=Path,
        default=Path("data/import-config.json"),
        help="Fichier JSON de sortie",
    )
    parser.add_argument("--stdout", action="store_true", help="Afficher sur la sortie standard")
    args = parser.parse_args()

    if not args.fichier.is_file():
        print(f"Fichier introuvable : {args.fichier}", file=sys.stderr)
        sys.exit(1)

    data = parse_questionnaire(args.fichier)

    if args.stdout:
        print(json.dumps(data, ensure_ascii=False, indent=2))
    else:
        args.output.parent.mkdir(parents=True, exist_ok=True)
        args.output.write_text(
            json.dumps(data, ensure_ascii=False, indent=2) + "\n",
            encoding="utf-8",
        )
        print(f"Config exportée : {args.output}")
        print(
            f"  {data['meta']['nb_questions']} réponses, "
            f"{data['meta']['nb_non_repondu']} sans réponse"
        )
        if data["non_repondu"]:
            print("  Non répondu :", ", ".join(data["non_repondu"][:8]), end="")
            if len(data["non_repondu"]) > 8:
                print(f"… (+{len(data['non_repondu']) - 8})")
            else:
                print()


if __name__ == "__main__":
    main()
