"""6A CRM audit: broad product domain inventory; no frozen crm.* verbs."""
from __future__ import annotations

from src.domain.app_blocks.catalogs import FEATURE_PACK_ALIASES
from src.domain.connectors.catalog import CONNECTORS, get_action, slugs_implementing
from src.domain.connectors.invoke_capabilities import (
    CAPABILITY_CONVERSION_PATTERN,
    CRM_DOMAIN_AUDIT,
    CRM_FAMILY_PLAN,
    CRM_HYPOTHESIZED_VERBS_NOT_FROZEN,
    CRM_OBJECT_VOCABULARY_CANDIDATES,
    INVOKE_CAPABILITIES,
)
from src.domain.connectors.public_gateway import (
    PHASE_6_STATUS,
    PUBLIC_INVOCABLE_CAPABILITIES,
)
from src.domain.feature_packs.catalog_v2 import CATALOG_OVERLAYS


def test_crm_program_is_6a_complete_without_frozen_verbs() -> None:
    pattern = CAPABILITY_CONVERSION_PATTERN
    assert PHASE_6_STATUS == "6p_complete"
    assert pattern["phase_6_status"] == "6p_complete"
    assert pattern["current_program_phase"] == 8
    assert pattern["next_program_slice"] == "9_app_block_modernization"
    assert pattern["opened_families"]["crm.*"] == "canonical_model"
    assert pattern["opened_families"]["crm.contact.*"] == "A"
    assert pattern["opened_families"]["crm.company.*"] == "A"
    assert pattern["next_candidate_classification"]["crm.*"] == (
        "split_p2hs_records_and_customer_crm"
    )
    assert "crm.contact.upsert" not in pattern["deferred"]
    plan = CRM_FAMILY_PLAN
    assert plan["product_domain"] is True
    assert plan["verbs_frozen"] is False
    assert plan["contact_verbs_frozen"] is True
    assert plan["company_verbs_frozen"] is True
    assert plan["deal_verbs_frozen"] is True
    assert plan["company_upsert"] == "PROVIDER_SPECIFIC_FOR_NOW"
    assert plan["deal_upsert"] == "PROVIDER_SPECIFIC_FOR_NOW"
    assert plan["note_decision"] == "DEFER"
    assert plan["task_decision"] == "PROVIDER_SPECIFIC_FOR_NOW"
    assert plan["activity_decision"] == "REJECT_UMBRELLA"
    assert plan["association_verbs_frozen"] is True
    assert plan["association_contact_deal"] == "PROVIDER_SPECIFIC_FOR_NOW"
    assert pattern["opened_families"]["crm.association.*"] == "A"
    assert pattern["opened_families"]["crm.deal.*"] == "A"
    assert plan["object_model_frozen"] is True
    assert plan["slices"][0] == "6a_crm_domain_audit"
    assert plan["slices"][1] == "6b_crm_canonical_object_model"
    assert plan["isolation"]["salesforce_lead_is_not_crm_contact"] is True
    assert CRM_DOMAIN_AUDIT["recommended_next_slice"] == "6b_crm_canonical_object_model"


def test_hypothesized_crm_verbs_are_not_capabilities() -> None:
    assert CRM_OBJECT_VOCABULARY_CANDIDATES == (
        "CRMContact",
        "CRMCompany",
        "CRMDeal",
        "CRMNote",
        "CRMTask",
        "CRMActivity",
        "CRMObjectRef",
        "CRMAssociation",
        "CRMPropertyMap",
    )
    for verb in CRM_HYPOTHESIZED_VERBS_NOT_FROZEN:
        assert verb not in INVOKE_CAPABILITIES
        assert verb not in PUBLIC_INVOCABLE_CAPABILITIES
        assert slugs_implementing(verb) == ()
    from src.domain.connectors.invoke_capabilities import (
        CRM_ASSOCIATION_FROZEN_VERBS,
        CRM_COMPANY_FROZEN_VERBS,
        CRM_CONTACT_FROZEN_VERBS,
        CRM_DEAL_FROZEN_VERBS,
    )

    for verb in (
        *CRM_CONTACT_FROZEN_VERBS,
        *CRM_COMPANY_FROZEN_VERBS,
        *CRM_DEAL_FROZEN_VERBS,
        *CRM_ASSOCIATION_FROZEN_VERBS,
    ):
        assert verb in INVOKE_CAPABILITIES
        assert INVOKE_CAPABILITIES[verb]["invocable"] is True
        slugs = slugs_implementing(verb)
        assert any(s.startswith("hubspot.") for s in slugs)
        assert any(s.startswith("salesforce.") for s in slugs)
    assert CRM_DOMAIN_AUDIT["new_capability_verbs"] == ()
    assert CRM_DOMAIN_AUDIT["catalog_mutated"] is False
    assert CRM_DOMAIN_AUDIT["implements_attached"] is False


def test_only_hubspot_and_salesforce_are_customer_crm_catalogs() -> None:
    crm = [key for key, row in CONNECTORS.items() if row.category == "crm"]
    assert set(crm) == {"hubspot", "salesforce"}
    hubspot = {action.slug for action in CONNECTORS["hubspot"].actions}
    salesforce = {action.slug for action in CONNECTORS["salesforce"].actions}
    assert hubspot == set(CRM_DOMAIN_AUDIT["hubspot_live_actions"])
    assert salesforce == set(CRM_DOMAIN_AUDIT["salesforce_live_actions"])
    for slug in (*hubspot, *salesforce):
        pair = get_action(slug)
        assert pair is not None
        assert pair[1].required_capabilities == ("integrations.execute",)


def test_p2hs_lead_block_is_not_salesforce_lead() -> None:
    assert FEATURE_PACK_ALIASES["crm.lead"] == "lead-lifecycle"
    assert "crm.pipeline" not in FEATURE_PACK_ALIASES  # 11E2: canonical App Block now.
    assert "crm-pipeline" in CATALOG_OVERLAYS
    assert CATALOG_OVERLAYS["lead-lifecycle"]["provides"][0].id == "crm.lead"
    assert "crm.external_sync_is_pack_metadata_not_an_invoke_capability" in (
        CRM_DOMAIN_AUDIT["composition_gaps"]
    )
    capture = CATALOG_OVERLAYS["contact-capture"]["provider_bindings"][0]
    assert capture.capability == "crm.contact.upsert"
    assert capture.providers == ["hubspot", "salesforce"]
    assert capture.configuration_required is False
    assert capture.missing_configuration_behavior == "disabled"
