import type { CheckinSubmitPayload } from "@alqove/api-client";

/** Local wizard draft — mirrors the submit payload minus key/turnstile. */
export interface CheckinDraft {
  first_name: string;
  last_name: string;
  phone: string; // normalized US digits
  container_count: number;
  container_description: string;
  opt_loyalty: boolean;
  opt_txn: boolean;
  opt_promo: boolean;
}

export const MIN_CONTAINERS = 1;
export const MAX_CONTAINERS = 20;

export const initialDraft: CheckinDraft = {
  first_name: "",
  last_name: "",
  phone: "",
  container_count: MIN_CONTAINERS,
  container_description: "",
  opt_loyalty: false,
  opt_txn: false,
  opt_promo: false,
};

export type CheckinDraftAction =
  | { type: "set"; field: keyof CheckinDraft; value: string | number | boolean }
  | { type: "incrementContainers" }
  | { type: "decrementContainers" }
  | { type: "reset" };

export function checkinDraftReducer(
  state: CheckinDraft,
  action: CheckinDraftAction,
): CheckinDraft {
  switch (action.type) {
    case "set":
      return { ...state, [action.field]: action.value };
    case "incrementContainers":
      return {
        ...state,
        container_count: Math.min(MAX_CONTAINERS, state.container_count + 1),
      };
    case "decrementContainers":
      return {
        ...state,
        container_count: Math.max(MIN_CONTAINERS, state.container_count - 1),
      };
    case "reset":
      return initialDraft;
    default:
      return state;
  }
}

/** Build the API submit payload (minus idempotency key + turnstile token). */
export function draftToPayload(draft: CheckinDraft): CheckinSubmitPayload {
  return {
    first_name: draft.first_name.trim(),
    last_name: draft.last_name.trim(),
    phone: draft.phone,
    container_count: draft.container_count,
    container_description: draft.container_description.trim() || null,
    opt_loyalty: draft.opt_loyalty,
    opt_txn: draft.opt_txn,
    opt_promo: draft.opt_promo,
  };
}
