/**
 * GroupDeal domain effects — discriminated union.
 *
 * The machine emits effects; applyEffects.ts interprets them.
 * Pure module: no imports from @/server/db, do-client, or outbox-producer.
 *
 * Alarm arm/disarm side effects are executed in group-deal.ts (workflow) and
 * group-deals.ts (query helpers) via armGroupDealAlarm / disarmGroupDealAlarm
 * with non-fatal captureCaught — not in applyEffects.
 */

export type GroupDealEffect =
  /** Arm (or re-arm) the GroupDeal deadline alarm. */
  | { kind: 'arm-alarm'; alarmType: 'deadline' | 'partial_decision'; groupDealId: string; at: Date }
  /** Disarm the GroupDeal alarm (all kinds). */
  | { kind: 'disarm-alarm'; groupDealId: string }
  /** Insert an outbox row and enqueue it. */
  | {
      kind: 'enqueue-outbox';
      eventType: string;
      aggregateType: string;
      aggregateId: string;
      payload: Record<string, unknown>;
    }
  /** Release all held reservations (fires only on fail/cancel transitions). */
  | { kind: 'release-reservations'; groupDealId: string }
  /** Execute: capture payments + generate QR codes + create purchases. */
  | { kind: 'execute-deal'; groupDealId: string };
