"""한 스텝 안에 성격이 다른 호출이 섞여도 정적분을 놓치지 않는다.

★2026-08-25 실측: `scene_detail` 10호출은 본 호출 6(pro)과 보조 판정
4(flash)가 섞인 것이었다. 스텝 하나로 묶어 줄 빈도를 재면 어느 줄도
`STATIC_DF=0.9` 문턱을 못 넘어(6/10=60%, 4/10=40%) **정적분이 통째로
0 으로 잡힌다.** 실제로는 system 의 99.1% 가 호출마다 똑같았다.

같은 이유로 발송량 1위 `scene_image_pipeline`(54%, 12종류 이상)도
0.00 으로 잡혔다. 상위 두 스텝의 판정이 다 틀린 셈이라, 이 계약이
깨지면 프롬프트 분석 전체가 엉뚱한 곳을 판다.
"""
import sys
from pathlib import Path

sys.path.insert(0, str(Path(__file__).resolve().parents[3]))

from tools.opik_prompt_audit.audit.metrics import per_step


def _span(step, op, model, system, user):
    return {
        "tags": [f"step:{step}", f"op:{op}", f"model:{model}"],
        "model": model,
        "input": [{"role": "system", "content": system},
                  {"role": "user", "content": user}],
    }


BIG = "\n\n".join(f"규칙 {i}: 이 줄은 호출마다 그대로 실린다." for i in range(20))
SMALL = "\n\n".join(f"판정 {i}: 짧은 지침." for i in range(3))


def test_mixed_call_shapes_keep_their_static_share():
    """본 호출 6 + 보조 4 가 섞여도 각각의 정적분이 잡힌다."""
    spans = []
    for i in range(6):
        spans.append(_span("scene_detail", "scene_detail", "pro",
                           BIG, f"샷 {i} 의 서로 다른 본문"))
    for i in range(4):
        spans.append(_span("scene_detail", "scene_detail_owned_judge", "flash",
                           SMALL, f"판정 대상 {i}"))

    rows = per_step(spans, trace_index={})
    row = rows["scene_detail"]

    assert row["calls"] == 10
    ratio = row["system_static_ratio"]
    assert ratio is not None and ratio > 0.8, \
        f"섞였다고 정적분을 놓쳤다: {ratio!r}"


def test_resend_chars_counts_only_repeats():
    """재전송 글자 = 정적분 × (호출수-1). 첫 호출은 낭비가 아니다."""
    spans = [_span("s", "op1", "m", BIG, f"u{i}") for i in range(6)]
    row = per_step(spans, trace_index={})["s"]
    resend = row["system_resend_chars"]
    assert resend > 0
    # 6 호출이면 5 회분이 재전송이다
    assert resend == row["system_static_chars"] * 5, \
        f"재전송 계산이 어긋난다: {resend} vs {row['system_static_chars']}"


def test_single_call_cluster_is_not_all_static():
    """호출이 1건인 군집은 정적으로 세지 않는다 — 비교 대상이 없다.

    안 막으면 한 번만 부른 호출의 system 전체가 「정적」이 되어 비율이
    부풀고, 덜어낼 것이 없는데 있는 것처럼 보인다.
    """
    spans = [_span("s", "only_once", "m", BIG, "u")]
    row = per_step(spans, trace_index={})["s"]
    assert not row.get("system_static_chars"), \
        "호출 1건짜리를 정적으로 셌다"


def test_user_side_stays_variable():
    """본문이 호출마다 다르면 user 정적분은 낮게 남아야 한다."""
    spans = [_span("s", "op1", "m", BIG, f"완전히 다른 본문 {i}" * 20)
             for i in range(6)]
    row = per_step(spans, trace_index={})["s"]
    assert (row["user_static_ratio"] or 0) < 0.2, \
        f"가변 본문을 정적으로 셌다: {row['user_static_ratio']}"
