import json
from pathlib import Path
from tempfile import TemporaryDirectory

from src.domain.app_blocks.compiler import compile_install_plan
from src.domain.app_blocks.runtime_dependencies import build_runtime_dependency_manifest


def test_runtime_manifest_records_provider_contract_without_blocking_install():
    plan = compile_install_plan({"product": {"purpose": "Build a subscription billing app."}})
    manifest = build_runtime_dependency_manifest(plan)
    assert manifest["schema_version"] == 1
    assert isinstance(manifest["blocks"], dict)
    # The shape remains serializable and carries provider requirements when a
    # selected block has them; missing config is recorded, never invented as a
    # successful provider.
    json.dumps(manifest)
    for block in manifest["blocks"].values():
        assert {"id", "requires", "provider_bindings", "status", "runtime_dependencies"} <= set(
            block
        )


def test_runtime_manifest_resolves_available_capability():
    plan = compile_install_plan({"product": {"purpose": "Build a quote request form."}})
    manifest = build_runtime_dependency_manifest(
        plan,
        runtime_contract={"capabilities": {"email.send": {"available": True}}},
    )
    if "email.send" in manifest["dependencies"]:
        assert manifest["dependencies"]["email.send"]["status"] == "ready"


def test_organization_subfamilies_are_fast_lane_composable_records():
    plan = compile_install_plan(
        {"product": {"purpose": "Track organization teams and organizational units."}}
    )
    assert {item.id for item in plan.blocks} >= {"crm.team", "crm.org_unit"}
    assert "organization-records" in plan.required_feature_packs
    assert "data.entity" in plan.required_primitives


def test_catalog_adapter_writer_materializes_runtime_dependency_manifest():
    from src.domain.codegen.port_adapter import install_catalog_adapters
    from src.integrations.platform_ports import CATALOG_VERSION, entitled_ports

    plan = compile_install_plan({"product": {"purpose": "Build a quote request form."}})
    context = {
        "ports": entitled_ports(),
        "catalog_version": CATALOG_VERSION,
        "runtime_contract": {"capabilities": {"email.send": {"available": False}}},
    }
    with TemporaryDirectory() as repo_path:
        root = Path(repo_path)
        (root / "p2hs").mkdir()
        (root / "p2hs" / "app-blocks-plan.json").write_text(
            json.dumps(plan.model_dump()), encoding="utf-8"
        )
        install_catalog_adapters(repo_path, "html", context)
        manifest = json.loads(
            (root / "p2hs" / "runtime-dependencies.json").read_text(encoding="utf-8")
        )
        assert (root / "lib" / "runtime-dependencies.js").is_file()
    assert manifest["schema_version"] == 1
