import { SidePanelStore } from "../components/side_panel/side_panel/side_panel_store";
import { interactiveSortSelection } from "../helpers/sort_interactive";
import { getZoneArea } from "../helpers/zones";
import { TrimWhitespaceStore } from "../stores/trim_whitespace_store";
import { _t } from "../translation";
import { ActionSpec } from "./action";
import * as ACTIONS from "./menu_items_actions";

export const sortRange: ActionSpec = {
  name: _t("Sort range"),
  isVisible: ACTIONS.IS_ONLY_ONE_RANGE,
  icon: "o-spreadsheet-Icon.SORT_RANGE",
};

export const sortAscending: ActionSpec = {
  name: _t("Ascending (A ⟶ Z)"),
  execute: (env) => {
    const { anchor, zones } = env.model.getters.getSelection();
    const sheetId = env.model.getters.getActiveSheetId();
    interactiveSortSelection(env, sheetId, anchor.cell, zones[0], "asc");
  },
  icon: "o-spreadsheet-Icon.SORT_ASCENDING",
};

export const dataCleanup: ActionSpec = {
  name: _t("Data cleanup"),
  icon: "o-spreadsheet-Icon.DATA_CLEANUP",
};

export const removeDuplicates: ActionSpec = {
  name: _t("Remove duplicates"),
  execute: (env) => {
    if (getZoneArea(env.model.getters.getSelectedZone()) === 1) {
      env.model.selection.selectTableAroundSelection();
    }
    env.openSidePanel("RemoveDuplicates", {});
  },
  isEnabled: (env) => !env.isSmall,
};

export const trimWhitespace: ActionSpec = {
  name: _t("Trim whitespace"),
  execute: (env) => {
    env.getStore(TrimWhitespaceStore).trimWhitespace();
  },
};

export const cleanupDataSources: ActionSpec = {
  name: _t("Remove unused data sources"),
  execute: (env) => env.openSidePanel("DataSourceCleanup", {}),
  isEnabled: (env) => !env.isSmall,
};

export const sortDescending: ActionSpec = {
  name: _t("Descending (Z ⟶ A)"),
  execute: (env) => {
    const { anchor, zones } = env.model.getters.getSelection();
    const sheetId = env.model.getters.getActiveSheetId();
    interactiveSortSelection(env, sheetId, anchor.cell, zones[0], "desc");
  },
  icon: "o-spreadsheet-Icon.SORT_DESCENDING",
};

export const createRemoveFilter: ActionSpec = {
  ...ACTIONS.CREATE_OR_REMOVE_FILTER_ACTION,
};

export const createRemoveFilterTool: ActionSpec = {
  ...ACTIONS.CREATE_OR_REMOVE_FILTER_ACTION,
  isActive: (env) => ACTIONS.SELECTED_TABLE_HAS_FILTERS(env),
};

export const splitToColumns: ActionSpec = {
  name: _t("Split text to columns"),
  sequence: 1,
  execute: (env) => env.openSidePanel("SplitToColumns", {}),
  isEnabled: (env) => !env.isSmall && env.model.getters.isSingleColSelected(),
  icon: "o-spreadsheet-Icon.SPLIT_TEXT",
};

export const dataAnalysis: ActionSpec = {
  name: _t("Data analysis"),
  execute: (env) => {
    const sidePanelStore = env.getStore(SidePanelStore);
    sidePanelStore.togglePinnedSidePanel("DataAnalysisPanel");
  },
  icon: "o-spreadsheet-Icon.COLUMN_STATS",
  isEnabled: (env) => !env.isSmall,
};

export const columnStatistics: ActionSpec = {
  name: _t("Column statistics"),
  execute: (env) => env.openSidePanel("ColumnStats", {}),
  icon: "o-spreadsheet-Icon.COLUMN_STATS",
};

export const reinsertDynamicPivotMenu: ActionSpec = {
  id: "reinsert_dynamic_pivot",
  name: _t("Re-insert dynamic pivot"),
  sequence: 60,
  icon: "o-spreadsheet-Icon.INSERT_PIVOT",
  children: [ACTIONS.REINSERT_DYNAMIC_PIVOT_CHILDREN],
  isVisible: (env) =>
    env.model.getters.getPivotIds().some((id) => env.model.getters.getPivot(id).isValid()),
};

export const reinsertStaticPivotMenu: ActionSpec = {
  id: "reinsert_static_pivot",
  name: _t("Re-insert static pivot"),
  sequence: 70,
  icon: "o-spreadsheet-Icon.INSERT_PIVOT",
  children: [ACTIONS.REINSERT_STATIC_PIVOT_CHILDREN],
  isVisible: (env) =>
    env.model.getters.getPivotIds().some((id) => env.model.getters.getPivot(id).isValid()),
};

export const calculationMode: ActionSpec = {
  name: _t("Calculation"),
  icon: "o-spreadsheet-Icon.CALCULATOR",
};

export const automaticCalculation: ActionSpec = {
  name: _t("Automatic"),
  execute: (env) => env.model.dispatch("SET_AUTOMATIC_EVALUATION", { enabled: true }),
  isActive: (env) => env.model.getters.isAutomaticEvaluationEnabled(),
};

export const manualCalculation: ActionSpec = {
  name: _t("Manual"),
  execute: (env) => env.model.dispatch("SET_AUTOMATIC_EVALUATION", { enabled: false }),
  isActive: (env) => !env.model.getters.isAutomaticEvaluationEnabled(),
};
