"""Phase 2G — document.* Codegen default exposure. Create-binding stays deferred."""
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 slugs_implementing
from src.domain.connectors.invoke_capabilities import (
    DOCUMENT_CREATE_CODEGEN,
    DOCUMENT_FAMILY_PHASE_2G,
    DOCUMENT_FAMILY_RESOLVER_DESIGN,
    DOCUMENT_FROZEN_VERBS,
    DOCUMENT_INVOKE_METHODS,
    GOOGLE_DOCS_INSERT_TEXT_MAPPING,
    GOOGLE_DOCS_PROVIDER_ACTIONS,
    GOOGLE_DOCS_REPLACE_TEXT_MAPPING,
    INVOKE_CAPABILITIES,
    is_implemented,
)
from src.domain.connectors.public_gateway import (
    PHASE_2G_STATUS,
    PHASE_3A_STATUS,
    PHASE_3_STATUS,
    PUBLIC_INVOCABLE_CAPABILITIES,
    is_public_invocable_capability,
)
from src.domain.manifest.service import _connectors_manifest_envelope

_EXPECTED_IMPLEMENTER = {
    "document.create": "google_docs.create_document",
    "document.get": "google_docs.get_document",
    "document.insert_text": "google_docs.insert_text",
    "document.append_text": "google_docs.append_text",
    "document.replace_text": "google_docs.replace_all_text",
}


def test_phase_2g_exposes_document_codegen_defaults() -> None:
    assert PHASE_2G_STATUS == "complete"
    assert PHASE_3_STATUS == "complete"
    assert PHASE_3A_STATUS == "next"
    phase = DOCUMENT_FAMILY_PHASE_2G
    assert phase["codegen_default"] is True
    assert phase["catalog_method_unset"] is False
    assert phase["status_implemented"] is True
    assert phase["google_docs_demoted_to_provider_actions"] is True
    assert phase["create_does_not_persist_binding"] is True
    assert phase["create_binding_codegen_warning"] is True
    assert phase["no_export"] is True
    assert phase["no_spreadsheet"] is True
    assert phase["p2hs_owned_google_path"] is False
    assert phase["next_slice"] == "3a_spreadsheet_live_path_audit"
    design = DOCUMENT_FAMILY_RESOLVER_DESIGN
    assert design["codegen_default"] is True
    assert design["google_docs_demoted_to_provider_actions"] is True
    assert design["next_slice"] == "3a_spreadsheet_live_path_audit"


def test_manifest_exposes_document_verbs_as_codegen_defaults() -> None:
    envelope = _connectors_manifest_envelope(items={})
    for verb in DOCUMENT_FROZEN_VERBS:
        spec = INVOKE_CAPABILITIES[verb]
        assert spec["status"] == "implemented"
        assert spec["invocable"] is True
        assert spec["method"] == DOCUMENT_INVOKE_METHODS[verb]
        assert spec["runtime"] == "integration.execute"
        assert is_implemented(verb) is True
        assert verb in PUBLIC_INVOCABLE_CAPABILITIES
        assert is_public_invocable_capability(verb) is True
        cap = envelope["capabilities"][verb]
        assert cap["status"] == "implemented"
        assert cap["role"] == "default"
        assert cap["invocable"] is True
        assert cap["method"] == DOCUMENT_INVOKE_METHODS[verb]
        assert cap["implemented_by"] == [_EXPECTED_IMPLEMENTER[verb]]
        assert cap["implemented_by"] == list(slugs_implementing(verb))
        slug = _EXPECTED_IMPLEMENTER[verb]
        action = envelope["provider_actions"][slug]
        assert action["role"] == "escape_hatch"
        assert action["implements"] == [verb]
    compact = _compact_connectors(envelope)
    for verb in DOCUMENT_FROZEN_VERBS:
        assert compact["capabilities"][verb]["role"] == "default"
        assert compact["capabilities"][verb]["method"] == DOCUMENT_INVOKE_METHODS[verb]
    for slug in GOOGLE_DOCS_PROVIDER_ACTIONS:
        assert compact["provider_actions"][slug]["role"] == "escape_hatch"
    assert "document.export" not in envelope["capabilities"]


def test_google_specific_fields_stay_on_escape_hatches() -> None:
    assert "index" in GOOGLE_DOCS_INSERT_TEXT_MAPPING["unmapped_provider_fields"]
    assert "numeric Google Docs index" in GOOGLE_DOCS_INSERT_TEXT_MAPPING["escape_hatch"]
    assert "match_case" in GOOGLE_DOCS_REPLACE_TEXT_MAPPING["unmapped_provider_fields"]
    assert "match_case" in GOOGLE_DOCS_REPLACE_TEXT_MAPPING["escape_hatch"]


def test_codegen_prefers_document_star_and_warns_on_create_binding() -> None:
    recipes = _app_recipes()
    assert "capabilities/document.create" in recipes
    assert "document.get" in recipes
    assert "document.insert_text" in recipes
    assert "Do not emit `POST /api/jobs/document.*`" in recipes
    assert "does not bind a logical alias" in recipes
    assert "document.append_text" in recipes
    assert "proposal" in DOCUMENT_CREATE_CODEGEN
    assert "does not persist a binding" in DOCUMENT_CREATE_CODEGEN
    assert "document.create" in _P2HS_CLOUD_CONTRACT
    assert "does not persist a logical-alias binding" in _P2HS_CLOUD_CONTRACT
    assert "document.create" in _P2HS_CORE_API_GUIDANCE
    assert "match_case" in recipes
    assert "numeric Google Docs index" in recipes
