"""Phase 0A — email / Slack / Twilio topology alignment. No capability state flips."""
from __future__ import annotations

from src.domain.codegen.prompt_wrapper import (
    _P2HS_CLOUD_CONTRACT,
    _P2HS_CORE_API_GUIDANCE,
    _app_recipes,
)
from src.domain.connectors.catalog import get_action, slugs_implementing
from src.domain.connectors.invoke_capabilities import (
    CAPABILITY_CONVERSION_PATTERN,
    NOTIFICATION_SMS_RESOLVER_DESIGN,
    is_implemented,
)
from src.domain.connectors.public_gateway import (
    EMAIL_SEND_APP_LOCAL_PORT,
    EMAIL_SEND_TRANSPORTS,
    FORBIDDEN_CODEGEN_CORE_MARKERS,
    LEGACY_CAPABILITY_ALIGNMENT,
    PHASE_0_STATUS,
    PHASE_0A_STATUS,
    PUBLIC_BFF_SURFACES,
    PUBLIC_INVOCABLE_CAPABILITIES,
    invoke_path_has_host,
    public_capability_invoke_method,
)
from src.domain.manifest.service import _connectors_manifest_envelope


def test_phase_0a_is_complete_without_advancing_families() -> None:
    assert PHASE_0_STATUS == "complete"
    assert PHASE_0A_STATUS == "complete"
    pattern = CAPABILITY_CONVERSION_PATTERN
    assert pattern["phase_0a_status"] == "complete"
    assert pattern["current_program_phase"] == 8
    assert pattern["program_order"][1] == "phase_0a_legacy_capability_alignment"
    assert pattern["parked_families"] == {}


def test_email_dual_runtime_is_explicit_and_not_a_core_url() -> None:
    email = LEGACY_CAPABILITY_ALIGNMENT["email.send"]
    assert email["status"] == "aligned_dual_runtime_exception"
    assert EMAIL_SEND_APP_LOCAL_PORT == "POST /api/jobs/email.send"
    assert any("capabilities/email.send" in row for row in EMAIL_SEND_TRANSPORTS)
    assert any("/api/jobs/email.send" in row for row in EMAIL_SEND_TRANSPORTS)
    envelope = _connectors_manifest_envelope(items={})
    cap = envelope["capabilities"]["email.send"]
    assert cap["invocable"] is True
    assert cap["method"] == EMAIL_SEND_APP_LOCAL_PORT
    recipes = _app_recipes()
    assert "POST /api/jobs/email.send" in recipes
    assert "capabilities/email.send" in recipes
    assert "Never construct a Core host" in cap["codegen"]
    for marker in FORBIDDEN_CODEGEN_CORE_MARKERS:
        assert marker not in EMAIL_SEND_APP_LOCAL_PORT


def test_messaging_send_is_aligned_to_public_bff() -> None:
    slack = LEGACY_CAPABILITY_ALIGNMENT["messaging.send"]
    assert slack["status"] == "aligned"
    assert slack["builder_alias_only"] is True
    assert slack["integrations_are_account_linking"] is True
    assert "messaging.send" in PUBLIC_INVOCABLE_CAPABILITIES
    method = public_capability_invoke_method("messaging.send")
    assert invoke_path_has_host(method) is False
    assert method.endswith("/capabilities/messaging.send")
    envelope = _connectors_manifest_envelope(items={})
    cap = envelope["capabilities"]["messaging.send"]
    assert cap["invocable"] is True
    assert cap["role"] == "default"
    assert cap["implemented_by"] == ["slack.post_message"]
    pair = get_action("slack.post_message")
    assert pair is not None
    assert pair[1].implements == ("messaging.send",)
    assert envelope["provider_actions"]["slack.post_message"]["role"] == "escape_hatch"
    recipes = "\n".join((_app_recipes(), _P2HS_CLOUD_CONTRACT, _P2HS_CORE_API_GUIDANCE))
    assert "capabilities/messaging.send" in recipes
    assert "Do not emit `POST /api/jobs/messaging.send`" in recipes
    assert "Do not use `slack.post_message` for generic chat" in recipes
    for marker in FORBIDDEN_CODEGEN_CORE_MARKERS:
        if marker in recipes:
            assert (
                "Never construct a Core host" in recipes
                or "never a Core host" in recipes.lower()
                or "Do not construct a Core host" in recipes
            )
    by_kind = {row["kind"]: row for row in PUBLIC_BFF_SURFACES}
    assert "builder" in by_kind["project_connectors"]["ui_alias"]
    assert by_kind["account_linking"]["path"] == "/api/integrations"


def test_messaging_sms_stays_contract_with_twilio_implements() -> None:
    sms = LEGACY_CAPABILITY_ALIGNMENT["messaging.sms.send"]
    assert sms["status"] == "parked_mapping_pass"
    assert sms["public_dashboard_bff"] is False
    assert sms["future_public"] == "dashboard_bff_not_jobs"
    assert sms["no_jobs_route"] is True
    assert "messaging.sms.send" not in PUBLIC_INVOCABLE_CAPABILITIES
    assert "notification.sms" not in PUBLIC_INVOCABLE_CAPABILITIES
    assert is_implemented("messaging.sms.send") is False
    assert slugs_implementing("messaging.sms.send") == ("twilio.send_sms",)
    design = NOTIFICATION_SMS_RESOLVER_DESIGN
    assert design["capability"] == "messaging.sms.send"
    assert design["catalog_invocable"] is False
    assert design["codegen_default"] is False
    assert design["public_topology"] == "dashboard_bff_then_private_core"
    assert design["no_installed_app_jobs_route"] is True
    recipes = _app_recipes()
    assert "POST /api/jobs/messaging.sms.send" not in recipes
    assert "POST /api/jobs/notification.sms" not in recipes
    envelope = _connectors_manifest_envelope(items={})
    cap = envelope["capabilities"]["messaging.sms.send"]
    assert cap["invocable"] is False
    assert "Do not invent POST /api/jobs/messaging.sms.send" in cap["codegen"]
    assert "capabilities/messaging.sms.send" in cap["codegen"]
    assert "notification.sms" not in envelope["capabilities"]
