"""CLI — Opik 역추적 프롬프트 감사.

backend/.env 의 OPIK_URL_OVERRIDE/OPIK_WORKSPACE/OPIK_PROJECT_NAME 을 그대로
읽는다 (backend 설정이 SOT).
"""
import argparse
import logging
import sys
from pathlib import Path

ROOT = Path(__file__).resolve().parent.parent.parent  # 저장소 루트
sys.path.insert(0, str(ROOT / "backend"))
sys.path.insert(0, str(ROOT))

logging.basicConfig(level=logging.INFO, format="%(message)s")


def main() -> None:
    ap = argparse.ArgumentParser(description="Opik 프롬프트 감사")
    ap.add_argument("--since", required=True,
                    help="ISO 시작 시각 (예: 2026-08-14T18:33:00)")
    ap.add_argument("--until", default="9999")
    ap.add_argument("--out", default=None,
                    help="출력 디렉토리 (기본: artifact/<날짜>_opik_prompt_audit)")
    args = ap.parse_args()

    import os
    os.chdir(ROOT / "backend")  # pydantic-settings 가 .env 를 cwd 에서 찾는다
    from app.core.config import settings

    base_url = (settings.opik_url_override or "").rstrip("/")
    if not base_url:
        raise SystemExit("OPIK_URL_OVERRIDE 가 비어 있다 — 셀프 호스팅 전용 도구")

    from tools.opik_prompt_audit.audit.attribute import (
        attribute_lines, build_line_index, growth_curves,
    )
    from tools.opik_prompt_audit.audit.fetch import fetch_traces
    from tools.opik_prompt_audit.audit.metrics import (
        cross_step_duplicates, per_step,
    )
    from tools.opik_prompt_audit.audit.report import render

    traces = fetch_traces(
        base_url, settings.opik_workspace, settings.opik_project_name,
        args.since, args.until)
    steps = per_step(traces)
    dups = cross_step_duplicates(steps)

    prompts_root = ROOT / "prompts"
    curves = growth_curves(prompts_root)
    index = build_line_index(prompts_root)
    attributions = {
        step: attribute_lines(
            [line for line, _df in
             (r.get("system_static_lines") or [])
             + (r.get("user_static_lines") or [])], index)
        for step, r in steps.items()
    }

    from datetime import datetime
    out_dir = Path(args.out) if args.out else (
        ROOT / "artifact"
        / f"{datetime.now():%Y%m%d}_opik_prompt_audit")
    out = render(
        out_dir,
        {"since": args.since, "trace_count": len(traces)},
        steps, dups, curves, attributions)
    print(f"리포트: {out}")


if __name__ == "__main__":
    main()
