from __future__ import annotations

import argparse
import json
import logging
import os
from pathlib import Path

from src.errors import UserError
from src.reporting.report import export_audit
from src.logging_setup import log_event

logger = logging.getLogger(__name__)

OUTPUT_ROOT_ENV_VAR = "OUTPUT_ROOT"


def register(sub: argparse._SubParsersAction) -> None:
    report = sub.add_parser("report", help="Export audit artifacts (CSV/JSON) from the latest run.")
    report.add_argument("--out", help=f"Output root folder path (or env {OUTPUT_ROOT_ENV_VAR}).")
    report.add_argument("--run-id", help="Run id to export (default: latest in out/audit/*).")
    report.add_argument(
        "--dry-run", action="store_true", help="Do not write files; print JSON to stdout."
    )
    report.set_defaults(_handler=_run)


def _run(args: argparse.Namespace) -> int:
    log_event(logger, "command.start", command="report")
    out_dir = _load_out_dir(args.out)
    records = export_audit(
        out_dir=out_dir,
        run_id=(str(args.run_id).strip() if args.run_id else None),
        dry_run=bool(args.dry_run),
    )
    if args.dry_run:
        print(json.dumps(records, indent=2, sort_keys=True, ensure_ascii=True))
    log_event(logger, "command.complete", command="report")
    return 0


def _load_out_dir(raw: str | None) -> Path:
    value = (raw or "").strip() or os.environ.get(OUTPUT_ROOT_ENV_VAR, "").strip()
    if not value:
        raise UserError(f"Missing output root. Pass --out or set {OUTPUT_ROOT_ENV_VAR}.")
    return Path(value)
