from src.domain.app_blocks.hosts import host_map_payload, merge_host_map
from src.domain.app_blocks.planner import ProductIntent, select_capabilities
from src.domain.app_blocks.registry import load_default_registry
from src.domain.starter_library.catalog import known_contract_ids


def test_content_collection_is_an_implemented_app_block_over_dataset():
    block = load_default_registry().require("content.collection")
    assert block.implemented is True
    assert {slot.component_contract for slot in block.slots} <= known_contract_ids()
    assert {binding.target for binding in block.bindings} == {
        "contract:dataset",
        "contract:project-relative-routes",
    }


def test_content_collection_host_is_preserved_in_generated_project_map():
    catalog = host_map_payload()
    assert any(item["block"] == "content.collection" for item in catalog["hosts"])
    merged = merge_host_map(
        {
            "version": 1,
            "hosts": [
                {
                    "block": "content.collection",
                    "slot": "grid",
                    "component_contract": "collection.grid",
                    "implementation": "components/starter/blocks/ContentCollection.vue",
                }
            ],
        },
        catalog,
    )
    grid = next(
        item for item in merged["hosts"]
        if item["block"] == "content.collection" and item["slot"] == "grid"
    )
    assert grid["implementation"].endswith("ContentCollection.vue")


def test_blog_and_category_language_selects_collection_composition():
    selected = select_capabilities(
        ProductIntent(
            purpose="A small business blog with posts grouped by categories",
            first_build_goal="Launch a blog and resource center",
        )
    )
    assert any(block_id == "content.collection" for _, block_id, _ in selected)
