"""E2E11 fix① (Codex BLOCKING-1 재설계) — 휴먼 스케일 앵커 부착.

선택형 팩이 아니라 활성 selector 무관 system 부착 스템 — Literal/overlay/
preflight 계약 무변경이 설계 조건.
"""
from app.modules.pipeline.background_prompt import (
    load_human_scale_rule,
    run_background_prompt,
)


def _fake_call(captured):
    def call_structured_fn(**kw):
        captured.update(kw)
        return {"bg_id": "B1",
                "t2i_prompt": "실제 카메라로 촬영한 다큐멘터리 풍 골목 사진 " * 8,
                "objects_owned_by_background": ["door"],
                "applies_to_shots": ["S1_Shot1"],
                "shot_guides": [{"shot_id": "S1_Shot1", "guide_text": "g"}]}
    return call_structured_fn


def _run(scale_anchor, version="7"):
    captured = {}
    run_background_prompt(
        user_prompt="U", expected_bg_id="B1", applies_to_shots=["S1_Shot1"],
        call_structured_fn=_fake_call(captured),
        prompt_version=version, scale_anchor=scale_anchor,
        max_retries=1,
    )
    return captured


def test_rule_loads_and_is_generic():
    r = load_human_scale_rule()
    assert "HUMAN-SCALE" in r and "2m" in r


def test_scale_anchor_appends_to_active_system_v7_and_v14():
    for v in ("7", "14"):
        cap = _run(True, version=v)
        assert "HUMAN-SCALE" in cap["system_prompt"], v


def test_scale_anchor_off_is_byte_identical():
    base = _run(False)["system_prompt"]
    assert "HUMAN-SCALE" not in base
    # OFF 시 기존 system 그대로 (부착 0)
    assert base == _run(False)["system_prompt"]


def test_settings_literal_unchanged():
    """v15 는 selector 가 아니다 — Literal 에 '15' 를 추가하지 않는 설계."""
    from app.modules.pipeline.background_prompt import PROMPT_VERSION_MAP

    assert "15" not in PROMPT_VERSION_MAP
