import { useState, useCallback } from "react";

export interface Command {
  execute(): void;
  undo(): void;
  description: string;
}

export interface CommandSequence {
  commands: Command[];
  execute(): void;
  undo(): void;
  description: string;
}

export function useUndoRedo() {
  const [undoStack, setUndoStack] = useState<(Command | CommandSequence)[]>([]);
  const [redoStack, setRedoStack] = useState<(Command | CommandSequence)[]>([]);

  const executeCommand = useCallback((command: Command | CommandSequence) => {
    command.execute();
    setUndoStack((prev) => [command, ...prev]);
    setRedoStack([]); // Clear redo stack when new command is executed
  }, []);

  const undo = useCallback(() => {
    if (undoStack.length === 0) return false;

    const command = undoStack[0];
    command.undo();

    setUndoStack((prev) => prev.slice(1));
    setRedoStack((prev) => [command, ...prev]);

    return true;
  }, [undoStack]);

  const redo = useCallback(() => {
    if (redoStack.length === 0) return false;

    const command = redoStack[0];
    command.execute();

    setRedoStack((prev) => prev.slice(1));
    setUndoStack((prev) => [command, ...prev]);

    return true;
  }, [redoStack]);

  const clear = useCallback(() => {
    setUndoStack([]);
    setRedoStack([]);
  }, []);

  const canUndo = undoStack.length > 0;
  const canRedo = redoStack.length > 0;

  return {
    executeCommand,
    undo,
    redo,
    clear,
    canUndo,
    canRedo,
    undoStack,
    redoStack,
  };
}
