from src.domain.app_blocks.runtime_dependencies import build_v2_runtime_dependency_manifest
from src.domain.app_blocks.v2_contract import (
    V2_APP_BLOCKS,
    get_v2_app_block,
    v2_contract_catalog_payload,
)


def test_v2_contract_keeps_payment_semantics_provider_neutral():
    block = get_v2_app_block("payments.subscription")
    assert block.requires == [
        "payments.subscription",
        "payments.customer",
        "payments.webhook",
    ]
    assert "stripe" not in block.requires
    assert block.bindings["payments"].provider == "stripe"
    assert "paddle" in block.bindings["payments"].supported


def test_v2_runtime_manifest_changes_binding_status_not_requires():
    block = get_v2_app_block("payments.subscription")
    manifest = build_v2_runtime_dependency_manifest([block])
    row = manifest["blocks"]["payments.subscription"]
    assert row["requires"] == block.requires
    assert row["status"] == "configuration_required"

    configured = build_v2_runtime_dependency_manifest([block], configured_providers={"paddle"})
    configured_row = configured["blocks"]["payments.subscription"]
    assert configured_row["requires"] == block.requires
    assert configured_row["status"] == "ready"


def test_v2_catalog_is_explicitly_core_policy_cloud_execution():
    payload = v2_contract_catalog_payload()
    assert payload["schema_version"] == 2
    assert payload["provider_neutral"] is True
    assert payload["policy_owner"] == "core"
    assert payload["execution_owner"] == "cloud"
    assert {item["id"] for item in payload["blocks"]} == set(V2_APP_BLOCKS)
