#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""팀별 dispatch 프롬프트 문자수 계측 (task-2946).

봇 전달 채널(cokacdir --cron)은 프롬프트가 4096 **자**를 넘으면 silent drop
한다(task-2945 실측). 감량/증량 작업 후 팀별 여유를 한눈에 확인하기 위한 계측기.

사용:
    python3 scripts/measure_dispatch_prompt_sizes.py
    python3 scripts/measure_dispatch_prompt_sizes.py --level critical
    python3 scripts/measure_dispatch_prompt_sizes.py --json

주의:
    프롬프트에 실제 ANU key 가 섞이지 않도록 길이만 동일한 더미 키를 쓴다
    (실측 오차 0, 출력에 비밀값 미노출).
"""
from __future__ import annotations

import argparse
import json
import os
import sys
from pathlib import Path

_ROOT = Path(__file__).resolve().parent.parent
if str(_ROOT) not in sys.path:
    sys.path.insert(0, str(_ROOT))

# 실제 ANU key(16자)와 길이가 같은 더미 — 계측값은 동일하고 비밀은 노출되지 않는다.
_DUMMY_ANU_KEY = "0" * 16
_LEVELS = ("normal", "critical", "security")

# 계측 기준 입력 (팀별 편차만 보기 위해 고정)
_TASK_ID = "task-9999"
_DESC = "테스트 작업 설명" * 3


def measure(levels=_LEVELS, task_id: str = _TASK_ID, desc: str = _DESC) -> dict:
    """팀 × 레벨 문자수를 계측해 dict 로 돌려준다."""
    os.environ.setdefault("COKACDIR_KEY_ANU", _DUMMY_ANU_KEY)
    from dispatch import DISPATCH_PROMPT_MAX_CHARS
    from prompts.team_prompts import TEAM_INFO, build_prompt

    rows = {}
    for team_id in TEAM_INFO:
        rows[team_id] = {lv: len(build_prompt(team_id, task_id, desc, lv)) for lv in levels}
    return {"limit": DISPATCH_PROMPT_MAX_CHARS, "levels": list(levels), "teams": rows}


def _render(result: dict) -> str:
    limit = result["limit"]
    levels = result["levels"]
    head = "팀".ljust(12) + "".join(f"{lv:>12}" for lv in levels) + f"{'여유(normal)':>14}"
    lines = [f"상한: {limit}자 (문자수 기준 — 바이트 아님)", "", head, "-" * len(head)]
    over = 0
    for team_id, per_level in result["teams"].items():
        cells = ""
        for lv in levels:
            n = per_level[lv]
            mark = "!" if n > limit else " "
            cells += f"{n:>11}{mark}"
            over += 1 if n > limit else 0
        margin = limit - per_level[levels[0]]
        lines.append(team_id.ljust(12) + cells + f"{margin:>14}")
    lines.append("")
    lines.append(f"상한 초과 셀: {over}개  (! 표시)")
    return "\n".join(lines)


def main() -> int:
    parser = argparse.ArgumentParser(description="팀별 dispatch 프롬프트 문자수 계측")
    parser.add_argument("--level", choices=_LEVELS, help="특정 레벨만 계측")
    parser.add_argument("--json", action="store_true", help="JSON 출력")
    args = parser.parse_args()

    levels = (args.level,) if args.level else _LEVELS
    result = measure(levels)

    if args.json:
        print(json.dumps(result, ensure_ascii=False, indent=2))
    else:
        print(_render(result))
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
