import pytest
from pydantic import ValidationError
from src.domain.collections.composition import collection_recipe
from src.domain.collections.contract import CollectionContract


def _collection(**overrides):
    payload = {
        "key": "engineering",
        "title": "Engineering",
        "slug": "engineering",
        "source": {"dataset_id": "blog_posts"},
        "route": "/blog/engineering",
        "item_route": "/blog/{item.slug}",
        "presentation": "grid",
    }
    payload.update(overrides)
    return CollectionContract.model_validate(payload)


def test_collection_is_dataset_backed_and_routable():
    collection = _collection()
    assert collection.source.dataset_id == "blog_posts"
    assert collection.route == "/blog/engineering"


def test_collection_rejects_cross_project_dataset_contract():
    with pytest.raises(ValidationError):
        _collection(
            source={
                "dataset_id": "blog_posts",
                "dataset": {
                    "id": "blog_posts",
                    "source": {"kind": "static"},
                    "shape": {"kind": "list"},
                    "scope": {"project": "other"},
                },
            }
        )


def test_collection_does_not_become_a_taxonomy_or_content_model():
    assert "records" not in CollectionContract.model_fields
    assert "taxonomy" not in CollectionContract.model_fields
    assert "content" not in CollectionContract.model_fields


def test_item_route_is_explicitly_safe_for_generated_routes():
    with pytest.raises(ValidationError, match="item_route"):
        _collection(item_route="/blog/{id}")


def test_collection_recipes_compose_existing_presentation_contracts():
    blog = collection_recipe("blog")
    assert "collection.grid" in blog.blocks
    assert "collection.pagination" in blog.blocks


def test_blog_collection_recipe_is_carried_into_codegen_install_plan():
    from src.domain.app_blocks.compiler import compile_install_plan

    plan = compile_install_plan(
        {
            "product": {
                "purpose": "small business website",
                "first_build_goal": "launch a blog with posts grouped by categories",
            },
        },
        source_prompt="small business blog with categories",
    )
    assert plan.collection_recipe_ids == ["blog"]
