"""Telemetry gateway contracts and data structures.

This module defines the envelope format for telemetry events and the routing
configuration that determines how each event type is processed.
"""

from __future__ import annotations

from enum import StrEnum
from typing import Any

from pydantic import BaseModel, field_validator


class TelemetryCase(StrEnum):
    """Enumeration of all known telemetry event cases."""

    WORKFLOW_RUN = "workflow_run"
    NODE_EXECUTION = "node_execution"
    DRAFT_NODE_EXECUTION = "draft_node_execution"
    MESSAGE_RUN = "message_run"
    TOOL_EXECUTION = "tool_execution"
    MODERATION_CHECK = "moderation_check"
    SUGGESTED_QUESTION = "suggested_question"
    DATASET_RETRIEVAL = "dataset_retrieval"
    GENERATE_NAME = "generate_name"
    PROMPT_GENERATION = "prompt_generation"
    APP_CREATED = "app_created"
    APP_UPDATED = "app_updated"
    APP_DELETED = "app_deleted"
    FEEDBACK_CREATED = "feedback_created"


class SignalType(StrEnum):
    """Signal routing type for telemetry cases."""

    TRACE = "trace"
    METRIC_LOG = "metric_log"


class CaseRoute(BaseModel):
    """Routing configuration for a telemetry case.

    Attributes:
        signal_type: The type of signal (trace or metric_log).
        ce_eligible: Whether this case is eligible for community edition tracing.
    """

    signal_type: SignalType
    ce_eligible: bool


class TelemetryEnvelope(BaseModel):
    """Envelope for telemetry events.

    Attributes:
        case: The telemetry case type.
        tenant_id: The tenant identifier.
        event_id: Unique event identifier for deduplication.
        payload: The main event payload.
        payload_fallback: Fallback payload (max 64KB).
        metadata: Optional metadata dictionary.
    """

    case: TelemetryCase
    tenant_id: str
    event_id: str
    payload: dict[str, Any]
    payload_fallback: bytes | None = None
    metadata: dict[str, Any] | None = None

    @field_validator("payload_fallback")
    @classmethod
    def validate_payload_fallback_size(cls, v: bytes | None) -> bytes | None:
        """Validate that payload_fallback does not exceed 64KB."""
        if v is not None and len(v) > 65536:  # 64 * 1024
            raise ValueError("payload_fallback must not exceed 64KB")
        return v

    class Config:
        """Pydantic configuration."""

        use_enum_values = False
