"""Task B3 — gemini_i2i_editor capture 계측 테스트.

_gemini_generate_content(직접 REST, edit_angle/color/combined 수렴점) → 생성 이미지
capture_generated_image. _create_camera_diagram(PIL, i2i 입력 다이어그램) → "전부"
원칙상 capture_artifact(role=angle_camera_diagram, Codex 합의 포함). 둘 다 default-off.
"""

import base64
import json

from app.services.image_capture.context import generation_context
from app.services.image_capture.queue import CAPTURE_DIAG

_I2I_PAYLOAD = b"I2IPNGBYTES" * 16


class _FakeResp:
    def __enter__(self):
        return self

    def __exit__(self, *a):
        return False

    def read(self):
        b64 = base64.b64encode(_I2I_PAYLOAD).decode("ascii")
        return json.dumps(
            {"candidates": [{"content": {"parts": [{"inlineData": {"data": b64}}]}}]}
        ).encode()


def test_i2i_generate_content_captures_inside_scope(monkeypatch):
    import app.modules.gemini_i2i_editor as g

    monkeypatch.setattr(g.urllib.request, "urlopen", lambda req, timeout=None: _FakeResp())
    with generation_context("p-i2i", "e-i2i", "i2i_edit") as q:
        out = g._gemini_generate_content(
            api_key="k", model="gemini-3.1-flash-image-preview",
            prompt="rotate angle", input_images=[],
        )
        assert out == _I2I_PAYLOAD  # decode 1회, 바이트 그대로 반환
        assert len(q._items) == 1
        _spool, meta = q._items[0]
        assert meta["pipeline_role"] == "i2i_edit"
        assert meta["prompt"] == "rotate angle"


def test_i2i_no_capture_outside_scope(monkeypatch):
    import app.modules.gemini_i2i_editor as g

    monkeypatch.setattr(g.urllib.request, "urlopen", lambda req, timeout=None: _FakeResp())
    before = CAPTURE_DIAG["skipped_no_context"]
    out = g._gemini_generate_content(
        api_key="k", model="m", prompt="x", input_images=[],
    )
    assert out == _I2I_PAYLOAD
    assert CAPTURE_DIAG["skipped_no_context"] >= before + 1


def test_camera_diagram_capture_artifact_inside_scope():
    import app.modules.gemini_i2i_editor as g

    with generation_context("p-cd", "e-cd", "i2i_edit") as q:
        png = g._create_camera_diagram(horizontal_deg=90, vertical_deg=10, zoom=1.2)
        assert png[:8] == b"\x89PNG\r\n\x1a\n"  # PNG signature 보존
        assert len(q._items) == 1
        _spool, meta = q._items[0]
        assert meta["pipeline_role"] == "angle_camera_diagram"


def test_camera_diagram_no_capture_outside_scope():
    import app.modules.gemini_i2i_editor as g

    before = CAPTURE_DIAG["skipped_no_context"]
    png = g._create_camera_diagram(horizontal_deg=0)
    assert png[:8] == b"\x89PNG\r\n\x1a\n"  # bytes 그대로 반환
    assert CAPTURE_DIAG["skipped_no_context"] >= before + 1
