#!/usr/bin/env python3
"""프롬프트 자체를 진단한다 — 모순·중복·불필요·과길이.

출력이 아니라 **입력을 연다**. 절(##) 단위로 쪼개서
  ① 크기 순위 (어디가 비대한가)
  ② 같은 낱말이 여러 절에 흩어진 것 (주제 분산 = 중복 후보)
  ③ 금지형 문장의 비중 (「값과 그 값을 쓰는 법은 다르다」)
  ④ 조건부라고 적어 놓고 무조건 실리는 절
를 낸다. 판정은 사람이 한다 — 여기서는 후보만 세운다.
"""
import re
import sys
from collections import Counter, defaultdict
from pathlib import Path

src = Path(sys.argv[1] if len(sys.argv) > 1
           else "/Users/manta/Documents/Projects/TheRoad-I1/scratchpad/scene_detail_sys.txt")
text = src.read_text(encoding="utf-8")

# ── 절 나누기 (## 또는 ### 헤딩) ──
parts = re.split(r"^(#{2,4}\s+.*)$", text, flags=re.M)
secs = []
if parts[0].strip():
    secs.append(("(머리말)", parts[0]))
for i in range(1, len(parts) - 1, 2):
    secs.append((parts[i].strip(), parts[i + 1]))

print(f"전체 {len(text):,}자 · 절 {len(secs)}개\n")

print("=== ① 큰 절 (상위 20) ===")
for h, b in sorted(secs, key=lambda s: -len(s[1]))[:20]:
    lvl = len(h) - len(h.lstrip("#"))
    print(f"  {len(b):>6,}자  {'  ' * (lvl - 2)}{h[:74]}")

# ── ② 주제 분산: 핵심 낱말이 몇 개 절에 나오나 ──
print("\n=== ② 한 주제가 여러 절에 흩어진 것 ===")
KEYS = ["ID", "id_policy", "visible_entities", "silhouette", "실루엣",
        "우선순위", "priority", "복사", "금지", "camera", "카메라",
        "framing", "outlook", "아웃룩", "owned", "reference", "참조",
        "전략", "freeze", "prop", "배경", "background"]
for k in KEYS:
    hit = [h for h, b in secs if k.lower() in (h + b).lower()]
    if len(hit) >= 4:
        print(f"  '{k}' → {len(hit)}개 절")
        for h in hit[:7]:
            print(f"       {h[:70]}")

# ── ③ 금지형 비중 ──
print("\n=== ③ 금지형 문장 ===")
ban_pat = re.compile(r"(금지|하지 마|안 된다|말 것|절대|never|do not|don't|✗|forbidden)",
                     re.I)
lines = [l for l in text.splitlines() if l.strip()]
ban = [l for l in lines if ban_pat.search(l)]
print(f"  전체 {len(lines)}줄 중 금지형 {len(ban)}줄 = {len(ban)/len(lines)*100:.1f}%")
print(f"  금지형 글자 {sum(len(l) for l in ban):,}자 "
      f"= {sum(len(l) for l in ban)/len(text)*100:.1f}%")

# ── ④ 조건부인데 무조건 실리는 절 ──
print("\n=== ④ 「조건부」라고 적힌 절 (해당 없으면 통째로 군더더기) ===")
cond = re.compile(r"(조건부|when |if |해당할 때|경우의|~일 때|일 때만)", re.I)
for h, b in secs:
    if cond.search(h):
        print(f"  {len(b):>6,}자  {h[:74]}")

# ── ⑤ 같은 문장이 두 번 이상 ──
print("\n=== ⑤ 같은 줄이 두 번 이상 나온다 ===")
c = Counter(l.strip() for l in lines if len(l.strip()) >= 25)
dup = [(l, n) for l, n in c.items() if n >= 2]
dup.sort(key=lambda x: -len(x[0]) * x[1])
print(f"  {len(dup)}종")
for l, n in dup[:10]:
    print(f"   {n}회 · {len(l):>4}자  {l[:76]}")
