import type { ElementLike } from '../core/Types';
import type { CommandContext } from './CommandStack';

/**
 * A command handler that may be registered via
 * {@link CommandStack#registerHandler}.
 */
export default interface CommandHandler {
  /**
   * Execute changes described in the passed action context.
   *
   * @param context The execution context.
   *
   * @return The list of diagram elements that have changed.
   */
  execute?(context: CommandContext): ElementLike[];

  /**
   * Revert changes described in the passed action context.
   *
   * @param context The execution context.
   *
   * @return The list of diagram elements that have changed.
   */
  revert?(context: CommandContext): ElementLike[];

  /**
   * Return true if the handler may execute in the given context.
   *
   * @param context The execution context.
   *
   * @return Whether the command can be executed.
   */
  canExecute?(context: CommandContext): boolean;

  /**
   * Execute actions before the actual command execution but
   * grouped together (for undo/redo) with the action.
   *
   * @param context The execution context.
   */
  preExecute?(context: CommandContext): void;

  /**
   * Execute actions after the actual command execution but
   * grouped together (for undo/redo) with the action.
   *
   * @param context The execution context.
   */
  postExecute?(context: CommandContext): void;
}
