from datetime import datetime, timezone
from enum import Enum
from typing import Any

from pydantic import BaseModel, Field


class WsEventType(str, Enum):
    # Connection
    CONNECTED = "connected"
    ERROR = "error"

    # Signalements
    SIGNALEMENT_CREATED = "signalement_created"
    SIGNALEMENT_STATUT_UPDATED = "signalement_statut_updated"
    SIGNALEMENT_ASSIGNED = "signalement_assigned"
    SIGNALEMENT_NOTE_ADDED = "signalement_note_added"
    SIGNALEMENT_TIMELINE_UPDATED = "signalement_timeline_updated"

    # Messages
    MESSAGE_CREATED = "message_created"
    MESSAGE_READ = "message_read"
    DISCUSSION_CREATED = "discussion_created"
    USER_TYPING = "user_typing"

    # Postes (Forum)
    POSTE_CREATED = "poste_created"
    POSTE_UPDATED = "poste_updated"
    POSTE_DELETED = "poste_deleted"
    COMMENTAIRE_CREATED = "commentaire_created"
    REACTION_CREATED = "reaction_created"
    REACTION_REMOVED = "reaction_removed"

    # Calendriers
    EVENT_CREATED = "event_created"
    EVENT_UPDATED = "event_updated"
    EVENT_CANCELLED = "event_cancelled"

    # Dashboard / stats
    STATS_UPDATED = "stats_updated"
    ALERT_CREATED = "alert_created"

    # Admin
    USER_DEACTIVATED = "user_deactivated"
    SYSTEM_ALERT = "system_alert"


class WsEvent(BaseModel):
    type: WsEventType
    canal: str
    payload: dict[str, Any] = {}
    timestamp: str = Field(
        default_factory=lambda: datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
    )
