/**
 * Personal Deal effects — discriminated union.
 *
 * Ordering invariants:
 *   1. create-request (returns request id)
 *   2. create-personal-deal (returns deal id)
 *   3. mark-accepted | mark-rejected | mark-expired (DO alarm disarmed via query layer)
 *   4. send-vendor-push / send-user-push (best-effort)
 *
 * Pure module: no imports from @/server/db, do-client, outbox-producer, payments, fetch.
 */

export type CreateRequestEffect = {
  kind: 'create-request';
  userId: string;
  vendorId: string;
  sourceDealId: string;
  responseDeadline: Date;
};

export type CreatePersonalDealEffect = {
  kind: 'create-personal-deal';
  vendorId: string;
  forUserId: string;
  sourceDealId: string;
  /** Validated CreateDeal input — caller schema-parses before passing event. */
  input: unknown;
};

export type MarkAcceptedEffect = {
  kind: 'mark-accepted';
  /** Filled in by apply-effects once create-personal-deal returns. */
  requestId: string;
};

export type MarkRejectedEffect = {
  kind: 'mark-rejected';
  requestId: string;
};

export type MarkExpiredEffect = {
  kind: 'mark-expired';
  requestId: string;
};

export type SendVendorPushEffect = {
  kind: 'send-vendor-push';
  vendorId: string;
  /** Placeholder — filled by apply-effects after create-request returns id. */
  variant: 'request-created';
};

export type SendUserPushEffect = {
  kind: 'send-user-push';
  userId: string;
  variant: 'accepted' | 'rejected' | 'expired';
  /** Optional context id for tag/url; resolved by apply-effects. */
  contextId?: string;
};

export type PersonalDealEffect =
  | CreateRequestEffect
  | CreatePersonalDealEffect
  | MarkAcceptedEffect
  | MarkRejectedEffect
  | MarkExpiredEffect
  | SendVendorPushEffect
  | SendUserPushEffect;
