"""gemini 이미지 클라이언트의 스텝 해석 — ctx > capture scope > image_gen.

2026-08-08 Opik 실측: 같은 실행에서 gpt 경로는 scene_image_pipeline 으로
남는데 gemini 롤 86건이 전부 image_gen 으로 뭉개졌다. 부르는 쪽이 ctx 를
안 채우면 capture scope 에서 해석해야 Opik·DB 양쪽에서 스텝을 가른다.
"""
import app.modules.llm.gemini_image_client as gic
import app.modules.llm.image_tracer as it


def test_ctx_step_wins():
    c = gic.GeminiImageClient(api_key="k")
    c.set_context(step="my_step")
    assert c._trace_step() == "my_step"


def test_empty_ctx_resolves_from_capture_scope(monkeypatch):
    c = gic.GeminiImageClient(api_key="k")
    monkeypatch.setattr(it, "ambient_call_meta",
                        lambda: {"stage": "scene_image_pipeline"})
    assert c._trace_step() == "scene_image_pipeline"


def test_no_scope_falls_back_to_image_gen(monkeypatch):
    c = gic.GeminiImageClient(api_key="k")
    monkeypatch.setattr(it, "ambient_call_meta", lambda: {})
    monkeypatch.setattr(it, "resolve_step_name", lambda fb, amb: fb)
    assert c._trace_step() == "image_gen"


def test_log_ctx_fills_step_name_from_scope(monkeypatch):
    # DB(llm_call_log) 쪽도 같은 병이었다 — step_name 이 NULL 로 남았다.
    c = gic.GeminiImageClient(api_key="k")
    monkeypatch.setattr(it, "ambient_call_meta",
                        lambda: {"stage": "scene_image_pipeline"})
    assert c._log_ctx.get("step_name") == "scene_image_pipeline"


def test_log_ctx_leaves_step_name_empty_without_scope(monkeypatch):
    # 해석이 안 되면 'image_gen' 을 지어내 넣지 않는다 — 빈 것은 빈 채로.
    c = gic.GeminiImageClient(api_key="k")
    monkeypatch.setattr(it, "ambient_call_meta", lambda: {})
    monkeypatch.setattr(it, "resolve_step_name", lambda fb, amb: fb)
    assert "step_name" not in c._log_ctx
