/**
 * Vendor Deal Draft domain events — discriminated union.
 *
 * Drafts have weak state (a row exists or doesn't); the decider validates
 * the inputs and emits the effect list.
 *
 *   create_requested:    raw payload → validate-emptiness + cap-check + insert
 *   update_requested:    raw payload → either delete (empty) or update
 *   star_toggle:         flip starred flag
 *   delete_requested:    validate ownership → delete
 *   submit_requested:    strict schema → insert deal + images + tags + outbox + delete-draft
 *
 * Pure module: no imports from @/server/db, do-client, outbox-producer, payments, fetch.
 */

export type CreateDraftRequestedEvent = {
  kind: 'create_requested';
  vendorId: string;
  /** Raw payload — schema parse happens inside decider. */
  payload: unknown;
  /**
   * Whether this vendor may bypass the draft cap (ACTIVE or VETERAN).
   * Caller pre-resolves so the decider stays pure.
   */
  capExempt: boolean;
  /** Current draft count for the vendor; only used when !capExempt. */
  currentDraftCount: number;
  at: Date;
};

export type UpdateDraftRequestedEvent = {
  kind: 'update_requested';
  draftId: string;
  vendorId: string;
  payload: unknown;
  at: Date;
};

export type StarTogglePayload = {
  kind: 'star_toggle';
  draftId: string;
  vendorId: string;
  /** Current starred flag; decider flips it. */
  currentlyStarred: boolean;
  at: Date;
};

export type DeleteDraftRequestedEvent = {
  kind: 'delete_requested';
  draftId: string;
  vendorId: string;
  at: Date;
};

export type SubmitDraftRequestedEvent = {
  kind: 'submit_requested';
  draftId: string;
  vendorId: string;
  /** Pre-normalized payload (legacy field migration done by caller). */
  normalizedPayload: unknown;
  at: Date;
};

export type VendorDealDraftEvent =
  | CreateDraftRequestedEvent
  | UpdateDraftRequestedEvent
  | StarTogglePayload
  | DeleteDraftRequestedEvent
  | SubmitDraftRequestedEvent;
