import { buildSheetLink, markdownLink } from "../helpers/misc";
import { UuidGenerator } from "../helpers/uuid";
import { _t } from "../translation";
import { ActionSpec } from "./action";

export const linkSheet: ActionSpec = {
  name: _t("Link sheet"),
  children: [
    (env) => {
      const sheets = env.model.getters
        .getSheetIds()
        .map((sheetId) => env.model.getters.getSheet(sheetId));
      return sheets.map((sheet) => ({
        id: sheet.id,
        name: sheet.name,
        execute: () => markdownLink(sheet.name, buildSheetLink(sheet.id)),
      }));
    },
  ],
};

export const deleteSheet: ActionSpec = {
  name: _t("Delete"),
  isVisible: (env) => {
    return env.model.getters.getVisibleSheetIds().length > 1;
  },

  execute: (env) =>
    env.askConfirmation(_t("Are you sure you want to delete this sheet?"), () => {
      env.model.dispatch("DELETE_SHEET", {
        sheetId: env.model.getters.getActiveSheetId(),
        sheetName: env.model.getters.getActiveSheetName(),
      });
    }),
  icon: "o-spreadsheet-Icon.TRASH",
};

export const duplicateSheet: ActionSpec = {
  name: _t("Duplicate"),
  execute: (env) => {
    const sheetIdFrom = env.model.getters.getActiveSheetId();
    const sheetNameFrom = env.model.getters.getSheetName(sheetIdFrom);
    const sheetIdTo = UuidGenerator.smallUuid();
    const sheetNameTo = env.model.getters.getDuplicateSheetName(sheetNameFrom);
    env.model.dispatch("DUPLICATE_SHEET", {
      sheetId: sheetIdFrom,
      sheetIdTo,
      sheetNameTo,
    });
    env.model.dispatch("ACTIVATE_SHEET", { sheetIdFrom, sheetIdTo });
  },
  isEnabledOnLockedSheet: true,
  icon: "o-spreadsheet-Icon.COPY",
};

export const renameSheet = (args: { renameSheetCallback: () => void }): ActionSpec => {
  return {
    name: _t("Rename"),
    execute: args.renameSheetCallback,
    icon: "o-spreadsheet-Icon.RENAME_SHEET",
  };
};

export const changeSheetTabColor = (args: {
  openSheetTabColorPickerCallback: () => void;
}): ActionSpec => {
  return {
    name: _t("Change tab color"),
    execute: args.openSheetTabColorPickerCallback,
    icon: "o-spreadsheet-Icon.PAINT_FORMAT",
  };
};

export const changeSheetBackgroundColor = (args: {
  openSheetBackgroundColorPickerCallback: () => void;
}): ActionSpec => {
  return {
    name: _t("Change grid color"),
    execute: args.openSheetBackgroundColorPickerCallback,
    icon: "o-spreadsheet-Icon.FILL_COLOR",
  };
};

export const sheetMoveRight: ActionSpec = {
  name: _t("Move right"),
  isVisible: (env) => {
    const sheetId = env.model.getters.getActiveSheetId();
    const sheetIds = env.model.getters.getVisibleSheetIds();
    return sheetIds.indexOf(sheetId) !== sheetIds.length - 1;
  },
  execute: (env) =>
    env.model.dispatch("MOVE_SHEET", {
      sheetId: env.model.getters.getActiveSheetId(),
      delta: 1,
    }),
  isEnabledOnLockedSheet: true,
  icon: "o-spreadsheet-Icon.MOVE_SHEET_RIGHT",
};

export const sheetMoveLeft: ActionSpec = {
  name: _t("Move left"),
  isVisible: (env) => {
    const sheetId = env.model.getters.getActiveSheetId();
    return env.model.getters.getVisibleSheetIds()[0] !== sheetId;
  },
  execute: (env) =>
    env.model.dispatch("MOVE_SHEET", {
      sheetId: env.model.getters.getActiveSheetId(),
      delta: -1,
    }),
  isEnabledOnLockedSheet: true,
  icon: "o-spreadsheet-Icon.MOVE_SHEET_LEFT",
};

export const hideSheet: ActionSpec = {
  name: _t("Hide sheet"),
  isVisible: (env) => env.model.getters.getVisibleSheetIds().length !== 1,
  execute: (env) =>
    env.model.dispatch("HIDE_SHEET", { sheetId: env.model.getters.getActiveSheetId() }),
  isEnabledOnLockedSheet: true,
  icon: "o-spreadsheet-Icon.HIDE_SHEET",
};

export const lockSheet: ActionSpec = {
  name: _t("Lock sheet"),
  isVisible: (env) => {
    return !env.model.getters.isCurrentSheetLocked();
  },
  execute: (env) => {
    env.model.dispatch("LOCK_SHEET", {
      sheetId: env.model.getters.getActiveSheetId(),
    });
  },
  icon: "o-spreadsheet-Icon.LOCK",
};

export const unlockSheet: ActionSpec = {
  name: _t("Unlock sheet"),
  isVisible: (env) => {
    return env.model.getters.isCurrentSheetLocked();
  },
  execute: (env) => {
    env.model.dispatch("UNLOCK_SHEET", {
      sheetId: env.model.getters.getActiveSheetId(),
    });
  },
  isEnabledOnLockedSheet: true,
  icon: "o-spreadsheet-Icon.UNLOCK",
};
