/**
 * Vendor Deal Draft effects — discriminated union.
 *
 * Effects are interpreted in order by apply-effects.ts.
 *
 * Ordering invariants:
 *   - create-draft / update-draft / delete-draft / set-starred: top-level DB ops
 *   - submit_requested emits a single atomic-submit effect containing the
 *     full strict-validated payload; apply-effects opens a Drizzle transaction.
 *
 * Pure module: no imports from @/server/db, do-client, outbox-producer, payments, fetch.
 */

export type InsertDraftEffect = {
  kind: 'insert-draft';
  vendorId: string;
  /** Parsed draft payload (schema-validated). */
  payload: Record<string, unknown>;
  /** Derived title for list rendering (or null). */
  title: string | null;
};

export type UpdateDraftEffect = {
  kind: 'update-draft';
  draftId: string;
  payload: Record<string, unknown>;
  title: string | null;
};

export type SetStarredEffect = {
  kind: 'set-starred';
  draftId: string;
  starred: boolean;
};

export type DeleteDraftEffect = {
  kind: 'delete-draft';
  draftId: string;
};

export type AtomicSubmitEffect = {
  kind: 'atomic-submit';
  draftId: string;
  vendorId: string;
  /** Strict-validated CreateDealBody. */
  validatedDeal: Record<string, unknown>;
  /** Quantity-discount tiers for the single default SKU (may be empty). */
  singleQtyTiers: Array<{ minQty: number; discountPercent: number }>;
};

export type VendorDealDraftEffect =
  | InsertDraftEffect
  | UpdateDraftEffect
  | SetStarredEffect
  | DeleteDraftEffect
  | AtomicSubmitEffect;

/** Effects emitted by query-only deciders (never includes atomic-submit). */
export type QueryOnlyDraftEffect = Exclude<VendorDealDraftEffect, { kind: 'atomic-submit' }>;
