"""automation.workflow.trigger Template A — Phase 1C complete; Zapier blocked."""
from __future__ import annotations

from src.domain.codegen.platform_backend import _compact_connectors
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 (
    AUTOMATION_WORKFLOW_TRIGGER_ERRORS,
    AUTOMATION_WORKFLOW_TRIGGER_INPUT_SCHEMA,
    AUTOMATION_WORKFLOW_TRIGGER_INVOKE_METHOD,
    AUTOMATION_WORKFLOW_TRIGGER_OUTPUT_SCHEMA,
    AUTOMATION_WORKFLOW_TRIGGER_RESOLVER_DESIGN,
    CAPABILITY_CONVERSION_PATTERN,
    MAKE_AUTOMATION_WORKFLOW_MAPPING,
    N8N_AUTOMATION_WORKFLOW_MAPPING,
    ZAPIER_AUTOMATION_WORKFLOW_MAPPING,
    is_implemented,
)
from src.domain.connectors.public_gateway import PUBLIC_INVOCABLE_CAPABILITIES
from src.domain.manifest.service import _connectors_manifest_envelope


def test_automation_workflow_phase_1c_n8n_implements() -> None:
    pattern = CAPABILITY_CONVERSION_PATTERN
    assert pattern["phase_0_status"] == "complete"
    assert pattern["phase_1_status"] == "1c_complete_1d_zapier_blocked"
    assert pattern["phase_1d_status"] == "blocked_until_catalog_and_cloud_path"
    assert pattern["next_program_slice"] == "9_app_block_modernization"
    assert pattern["automation_codegen_policy"] == "progressive_after_first_implementation"
    assert pattern["current_program_phase"] == 8
    assert pattern["opened_families"]["automation.workflow.trigger"] == "A"


def test_contract_uses_logical_workflow_not_provider_ids() -> None:
    props = AUTOMATION_WORKFLOW_TRIGGER_INPUT_SCHEMA["properties"]
    assert set(props) == {"workflow", "input", "metadata"}
    assert set(AUTOMATION_WORKFLOW_TRIGGER_INPUT_SCHEMA["required"]) == {"workflow", "input"}
    workflow = props["workflow"]
    assert workflow["x-p2hs"]["kind"] == "logical_workflow"
    assert workflow["x-p2hs"]["not_provider_id"] is True
    assert set(AUTOMATION_WORKFLOW_TRIGGER_OUTPUT_SCHEMA["properties"]) == {
        "capability",
        "status",
        "execution_ref",
        "reason_code",
        "message",
    }
    assert "run_id" not in AUTOMATION_WORKFLOW_TRIGGER_OUTPUT_SCHEMA["properties"]
    assert set(AUTOMATION_WORKFLOW_TRIGGER_ERRORS) >= {
        "capability_not_bound",
        "binding_ambiguous",
        "workflow_unbound",
        "workflow_invalid",
        "provider_fields_forbidden",
    }


def test_make_and_n8n_both_implement_via_slugs_implementing() -> None:
    make = get_action("make_com.trigger_scenario")
    n8n = get_action("n8n.trigger_workflow")
    assert make is not None and n8n is not None
    assert make[1].implements == ("automation.workflow.trigger",)
    assert n8n[1].implements == ("automation.workflow.trigger",)
    assert make[1].required_capabilities == ("integrations.execute",)
    assert n8n[1].required_capabilities == ("integrations.execute",)
    assert MAKE_AUTOMATION_WORKFLOW_MAPPING["fields"] == {"input": "payload"}
    assert N8N_AUTOMATION_WORKFLOW_MAPPING["fields"] == {"input": "payload"}
    assert MAKE_AUTOMATION_WORKFLOW_MAPPING["status"] == "runtime_adapter"
    assert N8N_AUTOMATION_WORKFLOW_MAPPING["status"] == "runtime_adapter"
    assert set(slugs_implementing("automation.workflow.trigger")) == {
        "make_com.trigger_scenario",
        "n8n.trigger_workflow",
    }
    assert ZAPIER_AUTOMATION_WORKFLOW_MAPPING["status"] == "blocked"
    assert ZAPIER_AUTOMATION_WORKFLOW_MAPPING["provider_action"] is None
    assert ZAPIER_AUTOMATION_WORKFLOW_MAPPING["implements"] is False
    assert ZAPIER_AUTOMATION_WORKFLOW_MAPPING["resolver_candidate"] is False
    assert get_action("zapier.trigger_workflow") is None
    envelope = _connectors_manifest_envelope(items={})
    adapters = envelope["capabilities"]["automation.workflow.trigger"]["adapter_mappings"]
    assert set(adapters) == {"make_com", "n8n"}
    assert "zapier" not in adapters


def test_resolver_design_is_make_and_n8n_runtime() -> None:
    design = AUTOMATION_WORKFLOW_TRIGGER_RESOLVER_DESIGN
    assert design["phase"] == "1c"
    assert design["catalog_invocable"] is True
    assert design["implements_attached"] is True
    assert design["codegen_default"] is True
    assert design["codegen_default_unchanged"] is True
    assert design["n8n_runtime"] is True
    assert design["runtime_adapter"] == ("make_com", "n8n")
    assert design["dispatch"] == "integration.execute"
    assert design["next_slice"] == "1d_zapier_blocked"
    assert design["phase_1d_status"] == "blocked_until_catalog_and_cloud_path"
    assert design["zapier"] == "blocked_until_catalog_and_cloud_path"
    assert design["n8n_demoted_to_provider_actions"] is True
    assert design["workflow_binding"]["unique_without_alias"] == "workflow_unbound"
    assert design["candidate_eligibility"]["adapter"] == {
        "make_com": "runtime candidate via make_com.trigger_scenario",
        "n8n": "runtime candidate via n8n.trigger_workflow",
    }
    assert "first-wins" in design["workflow_binding"]["multiple"]
    assert AUTOMATION_WORKFLOW_TRIGGER_INVOKE_METHOD.endswith(
        "/capabilities/automation.workflow.trigger"
    )


def test_manifest_expands_implemented_by_without_new_codegen_verb() -> None:
    envelope = _connectors_manifest_envelope(items={})
    cap = envelope["capabilities"]["automation.workflow.trigger"]
    assert cap["status"] == "implemented"
    assert cap["role"] == "default"
    assert cap["invocable"] is True
    assert cap["method"] == AUTOMATION_WORKFLOW_TRIGGER_INVOKE_METHOD
    assert cap["runtime"] == "integration.execute"
    assert set(cap["implemented_by"]) == {
        "make_com.trigger_scenario",
        "n8n.trigger_workflow",
    }
    assert is_implemented("automation.workflow.trigger") is True
    assert envelope["provider_actions"]["make_com.trigger_scenario"]["role"] == "escape_hatch"
    assert envelope["provider_actions"]["n8n.trigger_workflow"]["role"] == "escape_hatch"
    compact = _compact_connectors(envelope)
    assert compact["capabilities"]["automation.workflow.trigger"]["method"] == (
        AUTOMATION_WORKFLOW_TRIGGER_INVOKE_METHOD
    )
    assert "automation.workflow.trigger" in PUBLIC_INVOCABLE_CAPABILITIES


def test_codegen_verb_unchanged() -> None:
    recipes = _app_recipes()
    assert "capabilities/automation.workflow.trigger" in recipes
    assert "Do not emit `POST /api/jobs/automation.workflow.trigger`" in recipes
    assert "Keep using `n8n.trigger_workflow` until" not in recipes
    assert "automation.workflow.trigger" in _P2HS_CLOUD_CONTRACT
    assert "automation.workflow.trigger" in _P2HS_CORE_API_GUIDANCE
    assert "must not change generated" in recipes
