/**
 * Enum des types d'événements ShopEvent
 * Couvre toutes les modifications métier importantes dans un shop
 */
export const SHOP_EVENT_TYPES = [
    // Order events
    "order.created",
    "order.updated",
    "order.status_changed",
    "order.deleted",

    // OrderItem events
    "order_item.created",
    "order_item.updated",
    "order_item.status_changed",
    "order_item.production_step_changed",
    "order_item.quantity_changed",
    "order_item.customized",
    "order_item.deleted",

    // Product events
    "product.created",
    "product.updated",
    "product.deleted",

    // ShopUser events
    "shop_user.created",
    "shop_user.updated",
    "shop_user.deleted",

    // CashSession events
    "cash_session.opened",
    "cash_session.closed",
    "cash_session.reopened",
    "cash_session.updated",

    // Payment events
    "payment.attempt_started",
    "payment.attempt_succeeded",
    "payment.attempt_failed",
    "payment.terminal_status_changed",

    // Category events
    "category.created",
    "category.updated",
    "category.deleted",

    // Station events
    "station.created",
    "station.updated",
    "station.deleted",
    "station.stock_updated",

    // Order flow events
    "order.items_replaced",
    "order.product_incremented",

    // Ingredient events
    "ingredient.created",
    "ingredient.updated",
    "ingredient.deleted",

    // Recipe events
    "recipe.created",
    "recipe.updated",
    "recipe.deleted",


    // LogisticsRoute events
    "logistics_route.created",
    "logistics_route.updated",
    "logistics_route.deleted",
] as const

export type ShopEventType = typeof SHOP_EVENT_TYPES[number]

/**
 * Payload de base pour un ShopEvent transmis via WebSocket
 */
export interface ShopEventPayload {
    id: string
    shopId: string
    seq: string // BigInt convertie en string
    type: ShopEventType
    entity?: string // nom du modèle affecté (Order, Product, etc.)
    entityId?: string // ID du modèle
    revision?: number // révision du modèle après mutation
    payload: Record<string, any> // données du changement
    createdAt: string
}
