export type ApprovalMode = 'build' | 'plan' | 'bypass' | 'accept_edits';

export interface ApprovalModeState {
  confirmedMode: ApprovalMode;
  displayMode: ApprovalMode;
  pendingMode?: ApprovalMode;
}

export function initModeState(mode: ApprovalMode): ApprovalModeState {
  return {
    confirmedMode: mode,
    displayMode: mode,
  };
}

export function beginModeSwitch(
  state: ApprovalModeState,
  requested: ApprovalMode,
): ApprovalModeState {
  if (state.pendingMode || requested === state.displayMode) return state;
  return {
    confirmedMode: state.confirmedMode,
    displayMode: requested,
    pendingMode: requested,
  };
}

export function completeModeSwitch(
  state: ApprovalModeState,
  confirmed: ApprovalMode,
): ApprovalModeState {
  if (!state.pendingMode) return state;
  return {
    confirmedMode: confirmed,
    displayMode: confirmed,
  };
}

export function failModeSwitch(state: ApprovalModeState): ApprovalModeState {
  if (!state.pendingMode) return state;
  return {
    confirmedMode: state.confirmedMode,
    displayMode: state.confirmedMode,
  };
}

/**
 * Freeze the approval mode for a queued prompt only when it is authoritative.
 * A pending selection is merely optimistic UI state; returning undefined lets
 * queue draining use the daemon-confirmed (or rolled-back) mode at that time.
 */
export function modeForQueuedPrompt(state: ApprovalModeState): ApprovalMode | undefined {
  return state.pendingMode ? undefined : state.confirmedMode;
}