"""주행 묶음 — 재개해도 하나여야 한다."""
import pytest

from app.modules.llm.opik_trace import episode_thread_id


def test_thread_id_is_stable_across_calls():
    """같은 에피소드면 몇 번을 불러도 같은 값 — 재개가 쪼개지 않는다."""
    a = episode_thread_id(project_name="마지막 임무", episode_title="1회",
                          episode_id="f5372927-bbec-405d-ad2c-100d587f5373")
    b = episode_thread_id(project_name="마지막 임무", episode_title="1회",
                          episode_id="f5372927-bbec-405d-ad2c-100d587f5373")
    assert a == b
    assert "f5372927" in a


def test_thread_id_differs_per_episode():
    a = episode_thread_id(project_name="p", episode_title="1회",
                          episode_id="aaaaaaaa-0000-0000-0000-000000000000")
    b = episode_thread_id(project_name="p", episode_title="2회",
                          episode_id="bbbbbbbb-0000-0000-0000-000000000000")
    assert a != b


def test_thread_id_survives_missing_names():
    """이름이 비어도 값이 나온다 — 묶음이 사라지는 것이 최악이다."""
    t = episode_thread_id(project_name="", episode_title="",
                          episode_id="cccccccc-0000-0000-0000-000000000000")
    assert t
    assert "cccccccc" in t


def _runner(**ctx):
    from app.core.step_runner import StepRunner
    r = StepRunner.__new__(StepRunner)
    r.project_id = "proj-1"
    r.episode_id = "f5372927-bbec-405d-ad2c-100d587f5373"
    r.step_id = "scene_detail"
    r.opik_context = ctx
    return r


def test_v1_metadata_unchanged(monkeypatch):
    """설정 OFF 면 지금 그대로 — session_id·맨 이름 태그."""
    from app.core import config
    monkeypatch.setattr(config.settings, "opik_trace_v2_enabled", False)
    m = _runner(run_tag="RT-1", project_name="마지막 임무",
                episode_title="1회").build_opik_metadata()
    assert m["session_id"] == "RT-1"
    assert m["tags"][0] == "scene_detail"
    assert "마지막 임무" in m["tags"]


def test_v2_uses_thread_id_and_axis_tags(monkeypatch):
    from app.core import config
    monkeypatch.setattr(config.settings, "opik_trace_v2_enabled", True)
    m = _runner(run_tag="RT-1", project_name="마지막 임무",
                episode_title="1회").build_opik_metadata()

    assert "session_id" not in m
    assert "trace_name" not in m
    assert m["thread_id"].endswith("f5372927")

    # 축 태그만 — 한글 이름은 태그에서 빠지고 metadata 로 간다
    assert m["tags"] == ["step:scene_detail"]
    assert "마지막 임무" not in m["tags"]
    # ★`project_name` 이 아니다 — 그것은 litellm 예약 키다(아래 시험 참조).
    assert m["pipeline_project_name"] == "마지막 임무"
    assert "project_name" not in m
    assert m["episode_title"] == "1회"

    # run_tag 는 버리지 않는다 — 한 dispatch 를 따로 볼 때 쓴다
    assert m["run_tag"] == "RT-1"


def test_v2_thread_id_survives_without_run_tag(monkeypatch):
    """run_tag 없이 부른 스텝도 같은 주행에 묶여야 한다.

    지금은 run_tag 가 있어야만 session_id 를 실어서, 그것 없이 도는
    스텝은 묶음 밖으로 떨어졌다.
    """
    from app.core import config
    monkeypatch.setattr(config.settings, "opik_trace_v2_enabled", True)
    m = _runner(project_name="마지막 임무",
                episode_title="1회").build_opik_metadata()
    assert m["thread_id"].endswith("f5372927")
