import { ref } from 'vue';

import type { SpreadsheetCommand } from '../types';

const MAX_STACK = 100;

export function useUndoRedo() {
  const undoStack = ref<SpreadsheetCommand[]>([]);
  const redoStack = ref<SpreadsheetCommand[]>([]);

  function push(cmd: SpreadsheetCommand) {
    undoStack.value.push(cmd);
    if (undoStack.value.length > MAX_STACK) {
      undoStack.value.shift();
    }
    redoStack.value = [];
  }

  async function undo() {
    const cmd = undoStack.value.pop();
    if (!cmd) return;
    await cmd.undo();
    redoStack.value.push(cmd);
  }

  async function redo() {
    const cmd = redoStack.value.pop();
    if (!cmd) return;
    await cmd.redo();
    undoStack.value.push(cmd);
  }

  function canUndo() {
    return undoStack.value.length > 0;
  }

  function canRedo() {
    return redoStack.value.length > 0;
  }

  function clear() {
    undoStack.value = [];
    redoStack.value = [];
  }

  return { push, undo, redo, canUndo, canRedo, clear };
}
