"""스텝 경계에서 trace 가 열리고 닫힌다."""
import pytest

from app.modules.llm.opik_trace import current_trace


@pytest.fixture
def _fake_client(monkeypatch):
    sent = []

    class _T:
        def __init__(self, **kw):
            sent.append(kw)

        def end(self, **kw):
            pass

        def update(self, **kw):
            pass

    class _C:
        def trace(self, **kw):
            return _T(**kw)

    from app.modules.llm import opik_trace
    monkeypatch.setattr(opik_trace, "_get_client", lambda: _C())
    return sent


def test_step_scope_opens_named_trace(monkeypatch, _fake_client):
    from app.core import config
    from app.modules.llm.opik_trace import open_trace
    monkeypatch.setattr(config.settings, "opik_trace_v2_enabled", True)

    seen = {}
    with open_trace(name="step:scene_detail", tags=["step:scene_detail"],
                    metadata={"thread_id": "ep_f5372927"},
                    thread_id="ep_f5372927"):
        seen["name"] = current_trace().name
    assert seen["name"] == "step:scene_detail"
    assert current_trace() is None
    assert _fake_client[0]["name"] == "step:scene_detail"
    assert _fake_client[0]["thread_id"] == "ep_f5372927"


def test_step_trace_helper_is_noop_when_disabled(monkeypatch, _fake_client):
    from app.core import config
    from app.core.step_runner import _step_trace_scope
    monkeypatch.setattr(config.settings, "opik_trace_v2_enabled", False)

    class _R:
        step_id = "scene_detail"

        def build_opik_metadata(self):
            return {"tags": ["scene_detail"]}

    with _step_trace_scope(_R()):
        assert current_trace() is None
    assert _fake_client == []
