/**
 * Domain events emitted by the API (in-process event bus) and optionally
 * forwarded to webhooks. Names match WEBHOOK_EVENTS where applicable.
 */
export interface DomainEventBase {
  id: string;
  type: string;
  tenantId: string;
  warehouseId?: string;
  storerId?: string;
  occurredAt: string; // ISO
  actorId?: string;
  /** 0 on first dispatch; handlers that are not idempotent (metering) act only on attempt 0 */
  attempt?: number;
  payload: Record<string, unknown>;
}

export type DomainEventType =
  | 'asn.created' | 'asn.arrived' | 'asn.received' | 'asn.closed' | 'asn.cancelled'
  | 'receipt.recorded' | 'receipt.reversed'
  | 'order.created' | 'order.allocated' | 'order.released' | 'order.picked' | 'order.packed' | 'order.shipped'
  | 'order.cancelled' | 'order.short_closed' | 'order.short_pending'
  | 'wave.released' | 'wave.completed'
  | 'task.created' | 'task.completed' | 'task.exception'
  | 'inventory.moved' | 'inventory.adjusted' | 'inventory.hold_placed' | 'inventory.hold_released'
  | 'count.completed'
  | 'return.received' | 'return.dispositioned'
  | 'load.dispatched'
  | 'charge.captured' | 'invoice.issued'
  | 'ai.proposal.created' | 'ai.proposal.decided';
