"""12B1: explicit catalog intent survives co-occurring checkout wording."""
from src.domain.app_blocks.canonical import CANONICAL_BLOCK_IDS
from src.domain.app_blocks.planner import ProductIntent, select_capabilities

CATALOG = "catalog.product"
CHECKOUT = "payments.checkout"


def _blocks(purpose: str, goal: str = "") -> set[str]:
    intent = ProductIntent(purpose=purpose, first_build_goal=goal)
    return {block for _, block, _ in select_capabilities(intent)}


def test_product_catalog_still_selects_catalog():
    assert CATALOG in _blocks("Build a product catalog")


def test_manage_catalog_items_selects_catalog():
    assert CATALOG in _blocks("Staff manage catalog items")


def test_product_catalog_with_stripe_checkout_selects_catalog_and_checkout():
    blocks = _blocks("Staff manage a product catalog and add Stripe checkout")
    assert CATALOG in blocks
    assert CHECKOUT in blocks
    assert blocks <= CANONICAL_BLOCK_IDS
    assert "orders.order" not in blocks


def test_manage_product_catalog_and_accept_payments_selects_catalog_and_checkout():
    blocks = _blocks("Staff manage product catalog and accept payments")
    assert CATALOG in blocks
    assert CHECKOUT in blocks
    assert "orders.order" not in blocks


def test_stripe_checkout_alone_does_not_fabricate_catalog():
    blocks = _blocks("Build a Stripe checkout")
    assert CATALOG not in blocks
    assert CHECKOUT in blocks


def test_accept_payments_alone_does_not_fabricate_catalog():
    blocks = _blocks("Accept payments")
    assert CATALOG not in blocks
    assert CHECKOUT in blocks


def test_shopping_checkout_selects_checkout_without_inventing_orders():
    blocks = _blocks("shopping checkout")
    assert CATALOG not in blocks
    assert CHECKOUT in blocks
    assert blocks <= CANONICAL_BLOCK_IDS
    invented = ("orders.", "commerce.", "storefront.", "billing.")
    assert not any(block.startswith(invented) for block in blocks)
    assert "27" not in blocks
    assert not any(block.endswith(".27") for block in blocks)


def test_shopify_storefront_later_copy_still_misses_catalog():
    # Frozen 11G2 negative: vendor catalog later-copy is not catalog.product.
    later = "Add Stripe checkout products and a Shopify product catalog later"
    assert CATALOG not in _blocks(later)
    assert CHECKOUT not in _blocks(later)


def test_selected_blocks_stay_inside_canonical_catalog():
    samples = [
        "Build a product catalog",
        "manage catalog items",
        "product catalog with Stripe checkout",
        "manage product catalog and accept payments",
        "Stripe checkout",
        "accept payments",
        "shopping checkout",
    ]
    for purpose in samples:
        blocks = _blocks(purpose)
        assert blocks <= CANONICAL_BLOCK_IDS, purpose
        assert not any(block.startswith("orders.") for block in blocks)
        if "stripe checkout" in purpose.lower() or "accept payments" in purpose.lower():
            assert CHECKOUT in blocks, purpose
        if purpose == "Build a product catalog" or purpose == "manage catalog items":
            assert CHECKOUT not in blocks
