#!/usr/bin/env python3
"""A-1(#58) 기록 분류 미배선 — 이번 주행 Opik 실측.

★DB(`llm_call_log`)로 재면 안 된다. DB 는 이미지 계열 전용이고
  분석 스텝은 litellm→Opik 로 간다. 08-26 에 같은 실수로 「기록이 없다」고
  틀린 보고를 했다.

재는 항목 (SOT: artifact/20260828_remaining_tasks/remaining_tasks.md ④):
  ① 스텝 태그 없는 chat.completion span
  ② trace 이름이 `chat.completion` (계층 없음)
  ⑤ `step:step:` 이중 접두사
  ④ 도면 읽기 VLM · 참조 검증에 metadata 없음
"""
import sys
from collections import Counter

sys.path.insert(0, "/Users/manta/Documents/Projects/TheRoad-I1/scratchpad")
from _opik_env import opik_target  # noqa: E402
from tools.opik_prompt_audit.audit.fetch import (  # noqa: E402
    fetch_spans, fetch_trace_index)

BASE, WS, PROJ = opik_target()

# 이번 주행 = 2026-08-28 12:37~14:45 KST = 03:37~05:45 UTC
SINCE, UNTIL = "2026-08-28T03:20:00", "2026-08-28T06:10:00"

spans = fetch_spans(BASE, WS, PROJ, SINCE, UNTIL)
traces = fetch_trace_index(BASE, WS, PROJ, SINCE, UNTIL)
print(f"이번 주행 span {len(spans)} · trace {len(traces)}")
if not spans:
    raise SystemExit("★span 0 — 시간창이나 프로젝트가 틀렸다. 결론 내지 마라.")

# ── ② trace 이름 ──────────────────────────────────────────────
tn = Counter(t.get("name") or "(이름없음)" for t in traces.values())
flat = tn.get("chat.completion", 0)
print(f"\n② trace 이름 `chat.completion`(계층 없음): {flat} / {len(traces)}")
for k, v in tn.most_common(12):
    print(f"     {v:>4}  {k}")

# ── ①⑤ span 이름·태그 ────────────────────────────────────────
dbl, untagged, plain = [], [], []
for s in spans:
    name = s.get("name") or ""
    tags = s.get("tags") or []
    md = s.get("metadata") or {}
    steps = [t for t in tags if t.startswith("step:")]
    if any(t.startswith("step:step:") for t in tags) or name.startswith("step:step:"):
        dbl.append(s)
    if name == "chat.completion" and not steps:
        untagged.append(s)
    if name == "chat.completion":
        plain.append((md.get("step") or md.get("step_name") or "(md에도 없음)"))

print(f"\n⑤ `step:step:` 이중 접두사 span: {len(dbl)}")
print(f"① 스텝 태그 없는 chat.completion span: {len(untagged)} / "
      f"chat.completion 총 {len(plain)}")
if plain:
    for k, v in Counter(plain).most_common(10):
        print(f"     {v:>4}  metadata.step={k}")

# ── ④ 도면 읽기 VLM · 참조 검증 ──────────────────────────────
want = ("floor_plan", "floor_readback", "ref_image", "ref_verify", "reference")
hits = Counter()
for s in spans:
    blob = f"{s.get('name','')} {' '.join(s.get('tags') or [])}"
    for w in want:
        if w in blob:
            hits[w] += 1
print(f"\n④ 도면·참조 계열 span 이름/태그 적중: {dict(hits) or '없음'}")

# 스텝 태그 전수 — 어떤 스텝이 실제로 기록됐나
st = Counter()
for s in spans:
    for t in (s.get("tags") or []):
        if t.startswith("step:"):
            st[t] += 1
print(f"\n── 기록된 스텝 태그 {len(st)}종 ──")
for k, v in st.most_common(40):
    print(f"  {v:>4}  {k}")
