"""REC-31 (A1) Phase 4: HERO-missing BLOCKS; UPPERCASE cast normalizes; refless passes;
board-gated-no-board BLOCKS. Pure unit on the real gate. No spend."""
import pytest
from pathlib import Path
from recoil.core.ref_types import ReferenceBundle, RefAsset
from recoil.core.ref_gate import assert_refs_complete
from recoil.core.ref_errors import MissingRequiredRefError, MissingBoardRefError


def _hero(*subjects):
    return ReferenceBundle(tuple(
        RefAsset(Path(f"/x/{s}.png"), "identity", s, "identity", is_hero=True, source="shelf")
        for s in subjects))


def test_uppercase_cast_normalizes_and_passes():
    """Live cast ids are UPPERCASE; bundle subjects are normalized lower. Must pass."""
    assert_refs_complete(shot_id="EP001_SH37", required_subjects=["WREN", "JADE"],
                         bundle=_hero("wren", "jade"), board_gated=False, board_ref_path=None)


def test_subject_with_front_profile_but_no_hero_blocks():
    """The WREN disease: identity refs present (front/profile) but is_hero=False -> BLOCK."""
    bundle = ReferenceBundle((
        RefAsset(Path("/x/wren_front.png"), "identity", "wren", "identity", is_hero=False),
        RefAsset(Path("/x/wren_profile.png"), "identity", "wren", "identity", is_hero=False),
        RefAsset(Path("/x/jade_hero.png"), "identity", "jade", "identity", is_hero=True),
    ))
    with pytest.raises(MissingRequiredRefError) as e:
        assert_refs_complete(shot_id="EP001_SH37", required_subjects=["WREN", "JADE"],
                             bundle=bundle, board_gated=False, board_ref_path=None)
    assert "WREN" in e.value.subjects


def test_cast_but_zero_refs_blocks():
    with pytest.raises(MissingRequiredRefError):
        assert_refs_complete(shot_id="EP001_SH37", required_subjects=["WREN", "JADE"],
                             bundle=_hero("jade"), board_gated=False, board_ref_path=None)


def test_refless_undeclared_blocks():
    with pytest.raises(MissingRequiredRefError):
        assert_refs_complete(shot_id="EP001_SH37", required_subjects=["JADE"],
                             bundle=ReferenceBundle(()), board_gated=False, board_ref_path=None)


def test_refless_declared_passes():
    assert_refs_complete(shot_id="EP001_SH01", required_subjects=[],
                         bundle=ReferenceBundle(()), board_gated=False,
                         board_ref_path=None, refless_declared=True)


def test_board_gated_without_board_blocks():
    with pytest.raises(MissingBoardRefError):
        assert_refs_complete(shot_id="EP001_SH37", required_subjects=["JADE"],
                             bundle=_hero("jade"), board_gated=True, board_ref_path=None)
