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

from typing import Any, Protocol
from uuid import UUID


class AccountingProvider(Protocol):
    """Contract for Accounting. Hospitality must not post journals."""

    async def create_receivable_ref(
        self, *, tenant_id: UUID, reference: str, payload: dict[str, Any]
    ) -> dict[str, Any]: ...


class CRMProvider(Protocol):
    """Contract for CRM. Hospitality stores external_crm_contact_ref only."""

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


class LoyaltyProvider(Protocol):
    """Contract for Loyalty. Hospitality must not own points/ledger."""

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


class CommunicationProvider(Protocol):
    """Contract for Communication Platform. Hospitality must not own SMS providers."""

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


class DeliveryProvider(Protocol):
    """Contract for Delivery Platform. Hospitality must not own courier logistics."""

    async def create_delivery_ref(
        self, *, tenant_id: UUID, reference: str, payload: dict[str, Any]
    ) -> dict[str, Any]: ...


class WebsiteBuilderProvider(Protocol):
    """Contract for Website Builder. Hospitality stores site refs only."""

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


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


class StorageProvider(Protocol):
    async def resolve_file(
        self, *, tenant_id: UUID, file_ref: str
    ) -> dict[str, Any]: ...


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


class IdentityProvider(Protocol):
    async def resolve_user(
        self, *, tenant_id: UUID, user_ref: str
    ) -> dict[str, Any]: ...


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