/**
 * Personal Deal domain events — discriminated union (FDS §6.6).
 *
 *   SOLD_OUT deal + request_created → PENDING
 *     effects: [create-request, send-vendor-push]
 *
 *   PENDING + vendor_accepted → ACCEPTED
 *     effects: [create-personal-deal, mark-accepted, send-user-push]
 *
 *   PENDING + vendor_rejected → REJECTED
 *     effects: [mark-rejected, send-user-push]
 *
 *   PENDING + expiry_passed → EXPIRED
 *     effects: [mark-expired, send-user-push]
 *
 * Pure module: no imports from @/server/db, do-client, outbox-producer, payments, fetch.
 */

export type PersonalDealRequestStatus = 'PENDING' | 'ACCEPTED' | 'REJECTED' | 'EXPIRED';

export type RequestCreatedEvent = {
  kind: 'request_created';
  userId: string;
  sourceDealId: string;
  /** Caller computes response deadline so machine stays pure. */
  responseDeadline: Date;
  at: Date;
};

export type VendorAcceptedEvent = {
  kind: 'vendor_accepted';
  requestId: string;
  vendorId: string;
  /** Validated CreateDeal input (already zod-parsed by caller). */
  newDealInput: unknown;
  at: Date;
};

export type VendorRejectedEvent = {
  kind: 'vendor_rejected';
  requestId: string;
  vendorId: string;
  at: Date;
};

export type ExpiryPassedEvent = {
  kind: 'expiry_passed';
  requestId: string;
  at: Date;
};

export type PersonalDealEvent =
  | RequestCreatedEvent
  | VendorAcceptedEvent
  | VendorRejectedEvent
  | ExpiryPassedEvent;
