"""W21B (2026-06-28): background_prompt overlay-missing → v6 degrade fallback.

floor plan 없는 bg(외부/exterior)는 floor_plan_overlay_payload entry 가 없어
v7+ pack 이 fail-closed 된다. _resolve_effective_bg_version 는 그 bg 만 non-overlay
v6 pack 으로 explicit degrade 하고 진단 사유를 남긴다 (internal bg = byte-identical).

Phase I(immobilized subject) 무관 — image dispatch 가 background_prompt completed 를
요구하는데 외부 bg 포함 에피소드에서 deterministic partial 을 만드는 blocker 해소.
"""
from app.core.steps.background_prompt_step import (
    _OVERLAY_REQUIRED_VERSIONS,
    _resolve_effective_bg_version,
)


def test_v7_with_overlay_keeps_v7_no_fallback():
    """requested v7 + overlay 존재 → effective v7, 사유 None (기존 path 불변)."""
    eff, reason = _resolve_effective_bg_version("7", overlay_present=True)
    assert eff == "7"
    assert reason is None


def test_v7_without_overlay_degrades_to_v6_with_diagnostic():
    """requested v7 + overlay 부재 → effective v6, explicit 진단 사유."""
    eff, reason = _resolve_effective_bg_version("7", overlay_present=False)
    assert eff == "6"
    assert reason == "overlay_payload_missing_for_requested_overlay_prompt"


def test_v6_is_byte_identical_passthrough():
    """requested v6(non-overlay) → 항상 v6, 사유 None (byte-identical)."""
    for overlay_present in (True, False):
        eff, reason = _resolve_effective_bg_version("6", overlay_present=overlay_present)
        assert eff == "6"
        assert reason is None


def test_all_overlay_required_versions_degrade_when_missing():
    """v8~v12 등 overlay-required pack 전부 overlay 부재 시 v6 degrade."""
    for v in sorted(_OVERLAY_REQUIRED_VERSIONS):
        eff, reason = _resolve_effective_bg_version(v, overlay_present=False)
        assert eff == "6", f"version {v} should degrade to v6 when overlay missing"
        assert reason == "overlay_payload_missing_for_requested_overlay_prompt"
        # overlay 존재 시엔 불변
        eff2, reason2 = _resolve_effective_bg_version(v, overlay_present=True)
        assert eff2 == v
        assert reason2 is None
