"""단위 테스트: token-tracker.py enrich() / parse_session() 토큰 기록 로직

task-2338 | 작성자: 카마소츠 (dev7 테스터)
"""

import importlib.util
import json
import sys
from pathlib import Path

# ── 모듈 import (파일명에 '-' 포함으로 직접 import 불가) ──────────────────
WORKSPACE = Path(__file__).resolve().parents[1]
spec = importlib.util.spec_from_file_location(
    "token_tracker", WORKSPACE / "scripts" / "token-tracker.py"
)
assert spec is not None and spec.loader is not None
token_tracker = importlib.util.module_from_spec(spec)
sys.modules["token_tracker"] = token_tracker
spec.loader.exec_module(token_tracker)


# ─────────────────────────────────────────────────────────────────────────────
# Helper
# ─────────────────────────────────────────────────────────────────────────────

def _write_jsonl(path: Path, lines: list[dict]) -> None:
    path.write_text("\n".join(json.dumps(l) for l in lines), encoding="utf-8")


# ─────────────────────────────────────────────────────────────────────────────
# 1. parse_session: 4종 토큰 수집
# ─────────────────────────────────────────────────────────────────────────────

def test_parse_session_collects_4_token_types(tmp_path):
    """assistant usage 블록에서 input/output/cache_read/cache_creation 4종 토큰을
    모두 수집하고 total_tokens = 합산, task_id 파싱을 검증한다."""
    jsonl = tmp_path / "session.jsonl"
    _write_jsonl(jsonl, [
        {
            "type": "assistant",
            "message": {
                "usage": {
                    "input_tokens": 100,
                    "output_tokens": 200,
                    "cache_read_input_tokens": 300,
                    "cache_creation_input_tokens": 400,
                },
                "model": "claude-sonnet-4-6",
            },
        },
        {
            "type": "user",
            "message": {"content": "task-9999"},
        },
    ])

    r = token_tracker.parse_session(str(jsonl))

    assert r["input_tokens"] == 100
    assert r["output_tokens"] == 200
    assert r["cache_read_tokens"] == 300
    assert r["cache_creation_tokens"] == 400
    assert r["total_tokens"] == 1000
    assert r["task_id"] == "task-9999"


# ─────────────────────────────────────────────────────────────────────────────
# 2. parse_session: cwd_project 감지
# ─────────────────────────────────────────────────────────────────────────────

def test_parse_session_detects_cwd_project_insuro(tmp_path):
    """user 메시지 내 경로에서 cwd_project 'InsuRo'를 추출하는지 확인한다.

    NOTE: parse_session()에 cwd_project 감지 로직이 현재 미구현 상태임.
    쿠쿨칸 패치 병합 후 통과 예정.
    """
    jsonl = tmp_path / "session.jsonl"
    _write_jsonl(jsonl, [
        {
            "type": "user",
            "message": {
                "content": "task-9000 작업, 경로: /home/jay/projects/InsuRo/src/main.tsx"
            },
        },
    ])

    r = token_tracker.parse_session(str(jsonl))

    assert r.get("cwd_project") == "InsuRo"


# ─────────────────────────────────────────────────────────────────────────────
# 3. parse_session: mcp_used 감지
# ─────────────────────────────────────────────────────────────────────────────

def test_parse_session_detects_mcp_used(tmp_path):
    """assistant tool 호출에 'mcp__' 접두사가 있을 때 mcp_used == True 인지 확인한다.

    NOTE: parse_session()에 mcp_used 감지 로직이 현재 미구현 상태임.
    쿠쿨칸 패치 병합 후 통과 예정.
    """
    jsonl = tmp_path / "session.jsonl"
    _write_jsonl(jsonl, [
        {
            "type": "assistant",
            "message": {
                "content": [
                    {
                        "type": "tool_use",
                        "name": "mcp__code-review-graph__get_review",
                        "input": {},
                    }
                ],
                "usage": {
                    "input_tokens": 10,
                    "output_tokens": 5,
                    "cache_read_input_tokens": 0,
                    "cache_creation_input_tokens": 0,
                },
                "model": "claude-sonnet-4-6",
            },
        },
        {
            "type": "user",
            "message": {"content": "task-8888"},
        },
    ])

    r = token_tracker.parse_session(str(jsonl))

    assert r.get("mcp_used") is True


# ─────────────────────────────────────────────────────────────────────────────
# 4. enrich: 4종 토큰 + cost + cwd_project + mcp_used 복사
# ─────────────────────────────────────────────────────────────────────────────

def test_enrich_writes_all_4_token_fields(tmp_path):
    """ledger → timers 로 token_usage 4종 + total + cost 복사,
    cwd_project/mcp_used 태스크 레벨 복사를 검증한다.

    NOTE: enrich()가 mcp_used를 아직 복사하지 않음 — 쿠쿨칸 패치 병합 후 통과 예정.
    """
    ledger_path = tmp_path / "token-ledger.json"
    timers_path = tmp_path / "task-timers.json"

    ledger_data = {
        "tasks": {
            "task-X": {
                "input_tokens": 1,
                "output_tokens": 2,
                "cache_read_tokens": 3,
                "cache_creation_tokens": 4,
                "total_tokens": 10,
                "cost_estimate_usd": 0.5,
                "model": "claude-sonnet-4-6",
                "cwd_project": "InsuRo",
                "mcp_used": True,
            }
        }
    }
    timers_data = {
        "tasks": {
            "task-X": {
                "team_id": "dev7-team",
            }
        }
    }

    ledger_path.write_text(json.dumps(ledger_data), encoding="utf-8")
    timers_path.write_text(json.dumps(timers_data), encoding="utf-8")

    token_tracker.enrich(timers_path=str(timers_path), ledger_path=str(ledger_path))

    result = json.loads(timers_path.read_text(encoding="utf-8"))
    tx = result["tasks"]["task-X"]
    tu = tx["token_usage"]

    # 4종 토큰 + total + cost
    assert tu["input_tokens"] == 1
    assert tu["output_tokens"] == 2
    assert tu["cache_read_tokens"] == 3
    assert tu["cache_creation_tokens"] == 4
    assert tu["total_tokens"] == 10
    assert tu["cost_estimate_usd"] == 0.5

    # task 레벨에 cwd_project 복사됨
    assert tx.get("cwd_project") == "InsuRo"

    # task 레벨에 mcp_used 복사됨 (쿠쿨칸 패치 필요)
    assert tx.get("mcp_used") is True


# ─────────────────────────────────────────────────────────────────────────────
# 5. enrich: 매칭 안 되는 태스크는 token_usage 미추가
# ─────────────────────────────────────────────────────────────────────────────

def test_enrich_skips_unmatched_tasks(tmp_path):
    """timers에 task-Y, ledger에 task-Z만 있을 때
    task-Y에 token_usage가 추가되지 않음을 확인한다."""
    ledger_path = tmp_path / "token-ledger.json"
    timers_path = tmp_path / "task-timers.json"

    ledger_data = {
        "tasks": {
            "task-Z": {
                "input_tokens": 999,
                "output_tokens": 999,
                "cache_read_tokens": 0,
                "cache_creation_tokens": 0,
                "total_tokens": 1998,
                "cost_estimate_usd": 0.1,
                "model": "claude-sonnet-4-6",
            }
        }
    }
    timers_data = {
        "tasks": {
            "task-Y": {
                "team_id": "dev7-team",
            }
        }
    }

    ledger_path.write_text(json.dumps(ledger_data), encoding="utf-8")
    timers_path.write_text(json.dumps(timers_data), encoding="utf-8")

    token_tracker.enrich(timers_path=str(timers_path), ledger_path=str(ledger_path))

    result = json.loads(timers_path.read_text(encoding="utf-8"))
    ty = result["tasks"]["task-Y"]

    assert "token_usage" not in ty
