from __future__ import annotations

import argparse
import logging
import os
from pathlib import Path

from src.errors import UserError
from src.reporting.audit import run_audit
from src.logging_setup import log_event

logger = logging.getLogger(__name__)

INBOX_PATH_ENV_VAR = "INBOX_PATH"
OUTPUT_ROOT_ENV_VAR = "OUTPUT_ROOT"


def register(sub: argparse._SubParsersAction) -> None:
    run = sub.add_parser("run", help="Run an audit snapshot with a summary and structured logs.")
    run.add_argument("--inbox", help=f"Inbox folder path (or env {INBOX_PATH_ENV_VAR}).")
    run.add_argument("--out", help=f"Output root folder path (or env {OUTPUT_ROOT_ENV_VAR}).")
    run.add_argument("--run-id", help="Optional run id (default: UTC timestamp).")
    run.add_argument(
        "--no-match", action="store_true", help="Skip matching deals (no Pipedrive needed)."
    )
    run.add_argument("--dry-run", action="store_true", help="Do not write audit artifacts.")
    run.set_defaults(_handler=_run)


def _run(args: argparse.Namespace) -> int:
    log_event(logger, "command.start", command="run")
    inbox = _load_path(args.inbox, env_var=INBOX_PATH_ENV_VAR, label="inbox")
    out_dir = _load_path(args.out, env_var=OUTPUT_ROOT_ENV_VAR, label="out")
    summary = run_audit(
        inbox_dir=inbox,
        out_dir=out_dir,
        run_id=(str(args.run_id).strip() if args.run_id else None),
        enable_match=not bool(args.no_match),
        dry_run=bool(args.dry_run),
    )
    print(summary.to_human_summary())
    log_event(logger, "command.complete", command="run")
    return 0


def _load_path(raw: str | None, *, env_var: str, label: str) -> Path:
    value = (raw or "").strip() or os.environ.get(env_var, "").strip()
    if not value:
        raise UserError(f"Missing {label} directory. Pass --{label} or set {env_var}.")
    return Path(value)
