"""Phase 2E — public Dashboard/BFF document proxy. Catalog invocable stays false."""
from __future__ import annotations

from src.domain.codegen.prompt_wrapper import _app_recipes
from src.domain.connectors.invoke_capabilities import (
    DOCUMENT_FAMILY_PHASE_2E,
    DOCUMENT_FAMILY_RESOLVER_DESIGN,
    DOCUMENT_FROZEN_VERBS,
    is_implemented,
)
from src.domain.connectors.public_gateway import (
    BFF_MUST_NOT,
    FORBIDDEN_RESPONSE_KEYS,
    PHASE_2E_STATUS,
    PHASE_2F_STATUS,
    PUBLIC_BFF_PROXY_CAPABILITIES,
    PUBLIC_INVOCABLE_CAPABILITIES,
    is_public_bff_proxy_capability,
    is_public_invocable_capability,
    strip_capability_response,
)
from src.domain.manifest.service import _connectors_manifest_envelope


def test_phase_2e_proxies_without_catalog_flips() -> None:
    assert PHASE_2E_STATUS == "complete"
    assert PHASE_2F_STATUS == "complete"
    phase = DOCUMENT_FAMILY_PHASE_2E
    assert phase["public_bff_capability_route"] is True
    assert phase["bff_role"] == "proxy_only"
    assert phase["core_owns_semantics"] is True
    assert phase["catalog_invocable"] is False
    assert phase["implements_attached"] is False
    assert phase["codegen_default"] is False
    assert phase["catalog_method_unset"] is True
    assert phase["next_slice"] == "2f_document_runtime_truth"
    assert DOCUMENT_FAMILY_RESOLVER_DESIGN["public_bff_capability_route"] is True
    envelope = _connectors_manifest_envelope(items={})
    for verb in DOCUMENT_FROZEN_VERBS:
        cap = envelope["capabilities"][verb]
        assert cap["method"] is not None
        assert is_implemented(verb) is True
        assert is_public_invocable_capability(verb) is True
        assert is_public_bff_proxy_capability(verb) is True
        assert verb in PUBLIC_BFF_PROXY_CAPABILITIES
        assert verb in PUBLIC_INVOCABLE_CAPABILITIES
    assert "notification.sms" not in PUBLIC_BFF_PROXY_CAPABILITIES
    assert "capabilities/document." in _app_recipes()


def test_bff_must_not_own_document_semantics() -> None:
    for item in (
        "capability_resolution",
        "provider_selection",
        "binding_semantics",
        "document_alias_resolution",
        "google_payload_normalization",
        "persist_create_binding",
        "provider_authorization_policy",
    ):
        assert item in BFF_MUST_NOT


def test_defense_in_depth_strips_provider_internals_keeps_document() -> None:
    stripped = strip_capability_response(
        {
            "capability": "document.get",
            "status": "succeeded",
            "document": {"title": "Proposal", "body_text": "Hello"},
            "reason_code": None,
            "connection_id": "conn_1",
            "connector_id": "cat_1",
            "provider": "google_docs",
            "action": "google_docs.get_document",
            "action_slug": "google_docs.get_document",
            "document_id": "1abc",
            "revisionId": "rev",
            "job_id": "job_9",
            "payload": {"document_id": "1abc"},
            "output": {"documentId": "1abc"},
            "access_token": "secret",
        }
    )
    assert stripped == {
        "capability": "document.get",
        "status": "succeeded",
        "document": {"title": "Proposal", "body_text": "Hello"},
        "reason_code": None,
    }
    for key in (
        "connection_id",
        "connector_id",
        "job_id",
        "document_id",
        "revisionId",
        "access_token",
        "payload",
        "output",
        "action",
    ):
        assert key in FORBIDDEN_RESPONSE_KEYS
        assert key not in stripped
