"""Single admission-consistency gate across App Block / Feature Pack / Fast
Lane registries.

Run this after adding or editing a Feature Pack, App Block, job pack,
archetype Starter, or Fast Lane recipe. It replaces manually walking
planner.RULES, planner._RECIPE_NEGATION_TERMS, job_packs.JOB_FEATURE_PACKS,
archetypes.ARCHETYPE_STARTERS, and the recipe catalogs by hand.
"""

from src.domain.app_blocks.admission_consistency import check_admission_consistency
from src.domain.app_blocks.canonical import CANONICAL_BLOCK_IDS
from src.domain.app_blocks.job_packs import JOB_FEATURE_PACKS
from src.domain.app_blocks.planner import RULES, _RECIPE_NEGATION_TERMS
from src.domain.starter_library.archetypes import ARCHETYPE_STARTERS, known_archetype_ids


def test_no_cross_registry_admission_problems():
    assert check_admission_consistency() == []


def test_every_rule_block_is_frozen():
    assert {rule.block_id for rule in RULES} <= CANONICAL_BLOCK_IDS


def test_every_rule_block_has_a_negation_guard():
    """A block the user can ask for must also be a block they can ask against."""
    rule_blocks = {rule.block_id for rule in RULES}
    assert rule_blocks <= set(_RECIPE_NEGATION_TERMS)


def test_negation_guard_keys_are_frozen():
    assert set(_RECIPE_NEGATION_TERMS) <= CANONICAL_BLOCK_IDS


def test_job_packs_only_reference_frozen_blocks_and_known_starters():
    known_starters = known_archetype_ids()
    for pack in JOB_FEATURE_PACKS.values():
        touched = set(pack.required_app_blocks) | set(pack.optional_app_blocks)
        assert touched <= CANONICAL_BLOCK_IDS, pack.id
        assert set(pack.compatible_starters) <= known_starters, pack.id


def test_archetype_starters_only_reference_frozen_blocks_and_known_job_packs():
    from src.domain.app_blocks.job_packs import known_job_pack_ids

    known_packs = known_job_pack_ids()
    for starter in ARCHETYPE_STARTERS.values():
        assert set(starter.required_capabilities) <= CANONICAL_BLOCK_IDS, starter.id
        touched_packs = set(starter.default_job_packs) | set(starter.optional_job_packs)
        assert touched_packs <= known_packs, starter.id
