#!/usr/bin/env python3
"""CLI entry point for CVOT-MACEAdjudicate-Kor.

Usage:
    python3 main.py --demo
    python3 main.py --packets data/synthetic_packets.csv \
                    --troponin data/synthetic_troponin.csv \
                    --adjudications data/synthetic_adjudications.csv \
                    --charter data/charter_example.yaml \
                    --out reports/run.docx

For research / synthetic data only. Not for clinical decision making.
"""

from __future__ import annotations

# argparse is in the stdlib — imported at top so --help works even without
# the heavy optional dependencies installed.
import argparse
import os
import sys
import textwrap

DISCLAIMER = (
    "[CVOT-MACEAdjudicate-Kor] 참고용·연구용 도구입니다 — "
    "임상 의사결정용이 아닙니다 (Not for clinical decision)."
)


def _build_parser() -> argparse.ArgumentParser:
    p = argparse.ArgumentParser(
        prog="cvot-mace-adjudicate-kor",
        description=(
            "T2DM CVOT MACE event adjudication assistant. "
            "Charter-driven UDM2018 MI / AHA stroke / ESC HF / CV death classification, "
            "2-reader paired blinded CEC workflow, drift dashboard, and sensitivity report."
        ),
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog=textwrap.dedent("""
            Examples:
              python3 main.py --demo
              python3 main.py --packets data/synthetic_packets.csv --out reports/run.docx

            For research / synthetic data only. Not for clinical decision making.
        """).strip(),
    )
    p.add_argument("--demo", action="store_true",
                   help="Run the end-to-end demo with the bundled synthetic data.")
    p.add_argument("--packets", default="data/synthetic_packets.csv",
                   help="Path to event packets CSV.")
    p.add_argument("--troponin", default="data/synthetic_troponin.csv",
                   help="Path to troponin time-series CSV.")
    p.add_argument("--adjudications", default="data/synthetic_adjudications.csv",
                   help="Path to adjudicator judgements CSV.")
    p.add_argument("--charter", default="data/charter_example.yaml",
                   help="Path to CEC charter YAML.")
    p.add_argument("--out", default="reports/run.docx",
                   help="Path to write the CSR/DSMB supplementary report.")
    p.add_argument("--include-type2-mi", action="store_true",
                   help="Override charter to include Type 2 MI in MACE.")
    return p


def _missing_deps_message(err: ImportError) -> str:
    return textwrap.dedent(f"""
        [CVOT-MACEAdjudicate-Kor] 의존성 누락: {err}

        의존성 설치 후 다시 시도하세요:

            python3 -m venv .venv
            source .venv/bin/activate
            pip install -r requirements.txt
            python3 main.py --demo

        argparse만으로 --help 출력은 가능합니다.
    """).strip()


def main(argv=None) -> int:
    args = _build_parser().parse_args(argv)

    # Defer heavy imports to here so --help works without the deps installed.
    try:
        from modules import ingest, classify, adjudicate, sensitivity
    except ImportError as e:  # pragma: no cover
        print(DISCLAIMER)
        print(_missing_deps_message(e))
        return 0  # not a hard error — we surface a friendly message

    print(DISCLAIMER)
    here = os.path.dirname(os.path.abspath(__file__))

    def _resolve(p: str) -> str:
        return p if os.path.isabs(p) else os.path.join(here, p)

    packets_path = _resolve(args.packets)
    troponin_path = _resolve(args.troponin)
    adj_path = _resolve(args.adjudications)
    charter_path = _resolve(args.charter)
    out_path = _resolve(args.out)

    if not os.path.exists(packets_path):
        print(f"[!] packets CSV not found: {packets_path}", file=sys.stderr)
        return 2

    # 1) Load + de-identify
    raw_packets = ingest.load_packets_csv(packets_path, troponin_path)
    packets = ingest.deidentify_all(raw_packets)
    charter = ingest.load_charter(charter_path)
    include_type2 = args.include_type2_mi or bool(charter.get("include_type2_mi", False))

    print(f"[ingest] packets loaded: {len(packets)}  (charter: {charter.get('trial_id')})")
    print(f"[ingest] include_type2_mi: {include_type2}")

    # 2) Classify
    results = classify.classify_all(packets, include_type2_mi=include_type2)
    print(f"[classify] results: {len(results)}")
    by_domain = {}
    for r in results:
        by_domain.setdefault(r.domain, []).append(r.label)
    for d, labs in by_domain.items():
        from collections import Counter
        print(f"  {d}: {dict(Counter(labs))}")

    # 3) Adjudication summary
    adj_summary = {}
    if os.path.exists(adj_path):
        jdgs = adjudicate.load_judgements_csv(adj_path)
        adj_summary = adjudicate.summarize(jdgs)
        print(f"[adjudicate] paired events: {adj_summary['n_events_paired']}, "
              f"discordance rate: {adj_summary['discordance_rate']}, "
              f"kappa: {adj_summary['overall_kappa']}")
    else:
        print(f"[adjudicate] judgements CSV not found at {adj_path}; skipping")

    # 4) Sensitivity grid
    packet_arms = {p.event_id: p.treatment_arm for p in raw_packets}
    cls_dicts = [r.to_dict() for r in results]
    grid = sensitivity.run_sensitivity_grid(cls_dicts, packet_arms)
    print("[sensitivity]")
    for s in grid:
        print(f"  {s.name}: N={s.n_total} comp={s.by_component} arm={s.by_arm}")

    # 5) DSMB summary + DOCX
    dsmb = sensitivity.dsmb_interim_summary(grid, adj_summary)
    report_path = sensitivity.export_csr_docx(out_path, grid, adj_summary, charter)
    print(f"[report] written to {report_path}")
    print(f"[dsmb] primary: {dsmb['primary_endpoint']}")

    return 0


if __name__ == "__main__":
    sys.exit(main())
