import { createOpaqueId } from "../core/ids";
import { normalizeBrushName } from "../document/brushes";

import { getBoxBrushOrThrow, replaceBrush } from "./brush-command-helpers";
import type { EditorCommand } from "./command";

interface SetBoxBrushNameCommandOptions {
  brushId: string;
  name: string | null;
}

export function createSetBoxBrushNameCommand(options: SetBoxBrushNameCommandOptions): EditorCommand {
  const normalizedName = normalizeBrushName(options.name);
  let previousName: string | undefined;

  return {
    id: createOpaqueId("command"),
    label: normalizedName === undefined ? "Clear box brush name" : `Rename box brush to ${normalizedName}`,
    execute(context) {
      const currentDocument = context.getDocument();
      const brush = getBoxBrushOrThrow(currentDocument, options.brushId);

      if (previousName === undefined) {
        previousName = brush.name;
      }

      context.setDocument(
        replaceBrush(currentDocument, {
          ...brush,
          name: normalizedName
        })
      );
    },
    undo(context) {
      const currentDocument = context.getDocument();
      const brush = getBoxBrushOrThrow(currentDocument, options.brushId);

      context.setDocument(
        replaceBrush(currentDocument, {
          ...brush,
          name: previousName
        })
      );
    }
  };
}
