"""씨드 변형 팩 게이트 — 새 팩이 계약을 조용히 잃지 않는가 (2026-07-30).

## 무엇을 막는가

`seed_prompt_variants` 는 팩 버전을 **frozenset 게이트**로 분기한다.
    _INVENTORY_PACKS      → room_inventory + 간판(signage_*) 구조화 스키마
    _SCALE_VARIANT_PACKS  → human_scale_clause + scale_clause 조립
팩을 새로 발행하면서 이 집합에 넣는 것을 잊으면 **조용히 구 계약으로
내려간다**. 예외도 경고도 없다.

2026-07-30 실측(팩 v11 발행 직후): 저작 산출 키가 8개에서 3개로 줄고
브리프에서 `HUMAN-SCALE CALIBRATION` 과 `IN-WORLD SIGNAGE` 절이 통째로
사라졌다. 간판 문안이 비어 이미지 모델이 상호를 매번 새로 지어냈다 —
같은 장소가 샷마다 다른 간판을 다는 결함으로 이어진다. 25그룹을 다시
구운 뒤에야 드러났다.

이 테스트는 **활성 팩이 두 게이트에 모두 들어 있는지**만 본다. 결정론이고,
새 팩을 올리는 사람이 즉시 실패를 본다.
"""
from __future__ import annotations

from app.core.steps.outdoor_structure_seed_step import (
    SEED_VARIANTS_PACK_VERSION,
)
from app.modules.pipeline.seed_prompt_variants import (
    _INVENTORY_PACKS,
    _SCALE_VARIANT_PACKS,
    build_author_schema,
    resolve_variants_pack_version,
)


def test_active_pack_is_in_inventory_gate():
    """활성 팩이 빠지면 간판·방 구조화 계약이 조용히 사라진다."""
    assert SEED_VARIANTS_PACK_VERSION in _INVENTORY_PACKS, (
        f"팩 v{SEED_VARIANTS_PACK_VERSION} 이 _INVENTORY_PACKS 에 없다 — "
        "저작 스키마에서 signage_required/signage_text/room_inventory 가 "
        "빠지고 브리프의 IN-WORLD SIGNAGE 절이 사라진다."
    )


def test_active_pack_is_in_scale_gate():
    """활성 팩이 빠지면 규모(human scale) 계약이 조용히 사라진다."""
    assert SEED_VARIANTS_PACK_VERSION in _SCALE_VARIANT_PACKS, (
        f"팩 v{SEED_VARIANTS_PACK_VERSION} 이 _SCALE_VARIANT_PACKS 에 없다 — "
        "브리프의 HUMAN-SCALE CALIBRATION 절이 사라진다."
    )


def test_active_pack_resolves_to_a_real_directory():
    full = resolve_variants_pack_version(SEED_VARIANTS_PACK_VERSION)
    assert full.startswith(f"{SEED_VARIANTS_PACK_VERSION}.")


def test_inventory_gate_actually_adds_the_lettering_contract():
    """게이트가 켜져야 활자 문안 칸이 **required** 로 들어간다."""
    off = build_author_schema(3, include_inventory=False)
    on = build_author_schema(3, include_inventory=True)
    assert "lettering_text" not in off["properties"]
    for field in ("lettering_text", "room_inventory",
                  "room_inventory_applicable"):
        assert field in on["properties"], field
        assert field in on["required"], field


def test_gates_never_shrink_across_versions():
    """게이트는 누적된다 — 구 팩을 빼면 그 팩으로 만든 산출을 재현할 수 없다."""
    assert {"9", "10"}.issubset(_INVENTORY_PACKS)
    assert {"6", "7", "8", "9", "10"}.issubset(_SCALE_VARIANT_PACKS)
