import XEUtils from 'xe-utils';
import GlobalConfig from './src/conf';
import { interceptor } from './src/interceptor';
import { renderer } from './src/renderer';
import { commands } from './src/commands';
import { menus } from './src/menus';
import { formats } from './src/formats';
import { validators } from './src/validators';
import { config } from './src/config';
import { UtilTools } from '../tools/utils';
import { errLog } from '../tools/log';

const installedPlugins = [];

export function use(Plugin, options) {
  /* eslint-disable @typescript-eslint/no-use-before-define */
  if (Plugin && Plugin.install) {
    if (installedPlugins.indexOf(Plugin) === -1) {
      Plugin.install(VTable, options);
      installedPlugins.push(Plugin);
    }
  }
  return VTable;
}

/**
 * 检测模块的安装顺序是否正确
 */
function reg(key) {
  /* eslint-disable @typescript-eslint/no-use-before-define */
  // 检测安装顺序是否正确
  if (process.env.NODE_ENV === 'development') {
    if (VTable.Table) {
      errLog('tablePlus.error.useErr', [key]);
    }
  }
  VTable[`_${key}`] = 1;
}

function getExportOrImpotType(types, flag) {
  const rest = [];
  XEUtils.objectEach(types, (val, type) => {
    if (val === 0 || val === flag) {
      rest.push(type);
    }
  });
  return rest;
}

class VTableConfig {
  /**
   * 获取当前的 zIndex
   */
  get zIndex() {
    return UtilTools.getLastZIndex();
  }

  /**
   * 获取下一个 zIndex
   */
  get nextZIndex() {
    return UtilTools.nextZIndex();
  }

  /**
   * 获取所有导出类型
   */
  get exportTypes() {
    return getExportOrImpotType(GlobalConfig.export.types, 1);
  }

  /**
   * 获取所有导入类型
   */
  get importTypes() {
    return getExportOrImpotType(GlobalConfig.export.types, 2);
  }
}

// 已废弃
export const globalConfs = new VTableConfig();

export function _t(key, args) {
  return key ? XEUtils.toValueString(GlobalConfig.translate ? GlobalConfig.translate(key, args) : key) : '';
}

export const v = 'v3';
export const setup = config;

export const globalStore = {};

export const VTable = {
  v,
  version: process.env.VUE_APP_TABLE_PLUS_VERSION,
  reg,
  use,
  setup,
  globalStore,
  interceptor,
  renderer,
  commands,
  formats,
  menus,
  validators,
  _t,

  // 已废弃
  config,
  globalConfs
};

export * from './src/interceptor';
export * from './src/renderer';
export * from './src/commands';
export * from './src/menus';
export * from './src/formats';
export * from './src/config';

export default VTable;
