"""Progressive Disclosure 스킬 로딩 벤치마크."""

import sys
import time
from pathlib import Path

# 프로젝트 루트를 path에 추가
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))

from utils.skill_loader import (
    KEYWORD_TRIGGERS,
    SECURITY_WHITELIST,
    SkillLevel,
    classify_skill,
    list_skills,
    load_skill,
)

SKILLS_DIR = Path(__file__).resolve().parent.parent / "skills"


def estimate_tokens(text: str) -> int:
    """UTF-8 바이트 수 / 4로 토큰 수 추정."""
    return len(text.encode("utf-8")) // 4


def benchmark():
    """벤치마크 실행."""
    summaries = list_skills(SKILLS_DIR)
    total_skills = len(summaries)

    # 1. Baseline: 모든 스킬 전체 로드
    baseline_tokens = 0
    baseline_start = time.perf_counter()
    for s in summaries:
        try:
            content = load_skill(SKILLS_DIR, s.name)
            baseline_tokens += estimate_tokens(content)
        except FileNotFoundError:
            pass
    baseline_time = time.perf_counter() - baseline_start

    # 2. CORE only (SECURITY_WHITELIST 스킬만 전체 로드)
    core_tokens = 0
    core_start = time.perf_counter()
    for s in summaries:
        if classify_skill(s.name) == SkillLevel.CORE:
            try:
                content = load_skill(SKILLS_DIR, s.name)
                core_tokens += estimate_tokens(content)
            except FileNotFoundError:
                pass
    core_time = time.perf_counter() - core_start

    # 2b. Level 1 (이름+설명만, list_skills 결과)
    level1_tokens = 0
    for s in summaries:
        # 이름 + 설명 문자열만 카운트
        meta = f"{s.name}: {s.description}"
        level1_tokens += estimate_tokens(meta)

    # 3. CORE + 3개 STANDARD 트리거 (시뮬레이션)
    sample_prompt = "블로그 SEO 전략 회고"  # blog-writer + seo-audit + retro 매칭 예상
    triggered_names: set[str] = set()
    prompt_lower = sample_prompt.lower()
    for skill_name, keywords in KEYWORD_TRIGGERS.items():
        for kw in keywords:
            if kw.lower() in prompt_lower:
                triggered_names.add(skill_name)
                break

    triggered_tokens = core_tokens
    for name in triggered_names:
        try:
            content = load_skill(SKILLS_DIR, name)
            triggered_tokens += estimate_tokens(content)
        except FileNotFoundError:
            pass

    # 결과 출력
    print("=" * 60)
    print("Progressive Disclosure 벤치마크 결과")
    print("=" * 60)
    print(f"총 스킬 수: {total_skills}")
    print()
    print(f"[Baseline] 전체 로드:")
    print(f"  토큰 수: {baseline_tokens:,}")
    print(f"  로드 시간: {baseline_time:.3f}s")
    print()
    print(f"[Level 1] 이름+설명만 (list_skills):")
    print(f"  토큰 수: {level1_tokens:,}")
    if baseline_tokens > 0:
        print(f"  절감율: {(1 - level1_tokens / baseline_tokens) * 100:.1f}%")
    print()
    print(f"[CORE only] 보안 화이트리스트 {len(SECURITY_WHITELIST)}개만 전체 로드:")
    print(f"  토큰 수: {core_tokens:,}")
    print(f"  로드 시간: {core_time:.3f}s")
    if baseline_tokens > 0:
        print(f"  절감율: {(1 - core_tokens / baseline_tokens) * 100:.1f}%")
    print()
    print(f"[CORE + STANDARD] 프롬프트 '{sample_prompt}' 트리거:")
    print(f"  트리거된 스킬: {sorted(triggered_names)}")
    print(f"  토큰 수: {triggered_tokens:,}")
    if baseline_tokens > 0:
        print(f"  절감율: {(1 - triggered_tokens / baseline_tokens) * 100:.1f}%")
    print()
    print(f"MoAI-ADK 주장: 81% 절감")
    if baseline_tokens > 0:
        actual = (1 - core_tokens / baseline_tokens) * 100
        print(f"실제 측정 (CORE only): {actual:.1f}%")
        if actual >= 30:
            print("→ PD 도입 가치 있음 (≥30% 기준)")
        else:
            print("⚠️  경고: PD 도입 가치 재검토 필요 (<30% 절감)")
            print("   CORE 스킬 비중이 너무 높거나, SECURITY_WHITELIST 재조정 권장")

    # JSON 결과 (보고서 삽입용)
    results = {
        "total_skills": total_skills,
        "baseline_tokens": baseline_tokens,
        "level1_tokens": level1_tokens,
        "core_tokens": core_tokens,
        "triggered_tokens": triggered_tokens,
        "triggered_skills": sorted(triggered_names),
        "reduction_level1_pct": round((1 - level1_tokens / baseline_tokens) * 100, 1) if baseline_tokens else 0,
        "reduction_core_pct": round((1 - core_tokens / baseline_tokens) * 100, 1) if baseline_tokens else 0,
        "reduction_triggered_pct": round((1 - triggered_tokens / baseline_tokens) * 100, 1) if baseline_tokens else 0,
        "moai_claim_pct": 81,
    }

    import json

    print()
    print("--- JSON 결과 ---")
    print(json.dumps(results, indent=2, ensure_ascii=False))

    return results


if __name__ == "__main__":
    benchmark()
