"""Platform capability contracts — interfaces only; no implementations in CRM."""
from __future__ import annotations

from typing import Any, Protocol
from uuid import UUID


class AutomationProvider(Protocol):
    """Contract for future Automation Platform. CRM must not own workflows."""

    async def trigger_workflow(
        self, *, tenant_id: UUID, workflow_key: str, payload: dict[str, Any]
    ) -> None: ...


class Customer360Provider(Protocol):
    """Contract for future Customer360. CRM must not own unified customer profile."""

    async def upsert_party_reference(
        self, *, tenant_id: UUID, source: str, source_id: UUID, payload: dict[str, Any]
    ) -> None: ...


class NotificationProvider(Protocol):
    """Contract for future Notification service. CRM must not own delivery."""

    async def notify(
        self,
        *,
        tenant_id: UUID,
        channel: str,
        template_key: str,
        payload: dict[str, Any],
    ) -> None: ...


class AnalyticsProvider(Protocol):
    """Contract for future Analytics Platform. CRM must not own analytics store."""

    async def track(
        self, *, tenant_id: UUID, event_name: str, properties: dict[str, Any]
    ) -> None: ...


class AIProvider(Protocol):
    """Contract for future AI Platform. CRM must not own model inference."""

    async def suggest(
        self, *, tenant_id: UUID, task: str, context: dict[str, Any]
    ) -> dict[str, Any]: ...


class CommunicationProvider(Protocol):
    """Contract for future Communication Platform. CRM must not own messaging."""

    async def send_message(
        self, *, tenant_id: UUID, channel: str, to: str, body: str
    ) -> None: ...


class HelpdeskProvider(Protocol):
    """Contract for future Helpdesk Platform. CRM must not own tickets."""

    async def create_ticket_reference(
        self, *, tenant_id: UUID, subject: str, related_crm_id: UUID
    ) -> None: ...


class FileStorageProvider(Protocol):
    """Contract for File Storage service. CRM stores references only."""

    async def resolve_file(
        self, *, tenant_id: UUID, file_storage_id: str
    ) -> dict[str, Any]: ...


class ProductServiceProvider(Protocol):
    """Contract for Product Service. CRM stores product_ref only — no inventory."""

    async def resolve_product(
        self, *, tenant_id: UUID, product_ref_id: str
    ) -> dict[str, Any]: ...
