import { convertUpperCamel } from '/@/utils/str-util';

// -------------------------------- java 类型 --------------------------------
export const JavaTypeMap = new Map();
JavaTypeMap.set('bit', 'Boolean');
JavaTypeMap.set('bool', 'Boolean');
JavaTypeMap.set('int', 'Integer');
JavaTypeMap.set('int2', 'Integer');
JavaTypeMap.set('int4', 'Integer');
JavaTypeMap.set('tinyint', 'Integer');
JavaTypeMap.set('smallint', 'Integer');
JavaTypeMap.set('integer', 'Integer');
JavaTypeMap.set('year', 'Integer');
JavaTypeMap.set('bigint', 'Long');
JavaTypeMap.set('int8', 'Long');
JavaTypeMap.set('number', 'Long');
JavaTypeMap.set('float', 'BigDecimal');
JavaTypeMap.set('double', 'BigDecimal');
JavaTypeMap.set('decimal', 'BigDecimal');
JavaTypeMap.set('char', 'String');
JavaTypeMap.set('varchar', 'String');
JavaTypeMap.set('varchar2', 'String');
JavaTypeMap.set('nvarchar', 'String');
JavaTypeMap.set('nvarchar2', 'String');
JavaTypeMap.set('tinytext', 'String');
JavaTypeMap.set('text', 'String');
JavaTypeMap.set('longtext', 'String');
JavaTypeMap.set('blob', 'String');
JavaTypeMap.set('clob', 'String');
JavaTypeMap.set('date', 'LocalDate');
JavaTypeMap.set('datetime', 'LocalDateTime');
JavaTypeMap.set('datetime2', 'LocalDateTime');
JavaTypeMap.set('timestamp', 'LocalDateTime');
JavaTypeMap.set('timestamp without time zone', 'LocalDateTime');

export const JavaTypeList = [
  'Boolean', //
  'Integer', //
  'Long', //
  'Double', //
  'String', //
  'BigDecimal', //
  'LocalDate', //
  'LocalDateTime', //
];

export function getJavaType(dataType) {
  return JavaTypeMap.get(dataType);
}

// -------------------------------- js 类型 --------------------------------
export const JsTypeMap = new Map();
JsTypeMap.set('bit', 'Boolean');
JsTypeMap.set('bool', 'Boolean');
JsTypeMap.set('int', 'Number');
JsTypeMap.set('int2', 'Number');
JsTypeMap.set('int4', 'Number');
JsTypeMap.set('int8', 'Number');
JsTypeMap.set('number', 'Number');
JsTypeMap.set('tinyint', 'Number');
JsTypeMap.set('smallint', 'Number');
JsTypeMap.set('integer', 'Number');
JsTypeMap.set('year', 'Number');
JsTypeMap.set('bigint', 'Number');
JsTypeMap.set('float', 'Number');
JsTypeMap.set('double', 'Number');
JsTypeMap.set('decimal', 'Number');
JsTypeMap.set('char', 'String');
JsTypeMap.set('varchar', 'String');
JsTypeMap.set('varchar2', 'String');
JsTypeMap.set('nvarchar', 'String');
JsTypeMap.set('nvarchar2', 'String');
JsTypeMap.set('character', 'String');
JsTypeMap.set('tinytext', 'String');
JsTypeMap.set('text', 'String');
JsTypeMap.set('longtext', 'String');
JsTypeMap.set('blob', 'String');
JsTypeMap.set('clob', 'String');
JsTypeMap.set('date', 'Date');
JsTypeMap.set('datetime', 'Date');
JsTypeMap.set('datetime2', 'Date');
JsTypeMap.set('timestamp', 'Date');
JsTypeMap.set('timestamp without time zone', 'Date');

export const JsTypeList = [
  'Boolean', //
  'Number', //
  'String', //
  'Date', //
];

export function getJsType(dataType) {
  return JsTypeMap.get(dataType);
}

// -------------------------------- 前端组件 --------------------------------

export const FrontComponentMap = new Map();
FrontComponentMap.set('bit', 'BooleanSelect');
FrontComponentMap.set('bool', 'BooleanSelect');
FrontComponentMap.set('int', 'InputNumber');
FrontComponentMap.set('int2', 'InputNumber');
FrontComponentMap.set('int4', 'InputNumber');
FrontComponentMap.set('int8', 'InputNumber');
FrontComponentMap.set('number', 'InputNumber');
FrontComponentMap.set('tinyint', 'InputNumber');
FrontComponentMap.set('smallint', 'InputNumber');
FrontComponentMap.set('integer', 'InputNumber');
FrontComponentMap.set('year', 'Date');
FrontComponentMap.set('timestamp', 'Date');
FrontComponentMap.set('bigint', 'InputNumber');
FrontComponentMap.set('float', 'InputNumber');
FrontComponentMap.set('double', 'InputNumber');
FrontComponentMap.set('decimal', 'InputNumber');
FrontComponentMap.set('char', 'Input');
FrontComponentMap.set('varchar', 'Input');
FrontComponentMap.set('varchar2', 'Input');
FrontComponentMap.set('nvarchar', 'Input');
FrontComponentMap.set('nvarchar2', 'Input');
FrontComponentMap.set('character', 'Input');
FrontComponentMap.set('tinytext', 'Input');
FrontComponentMap.set('text', 'Textarea');
FrontComponentMap.set('longtext', 'Textarea');
FrontComponentMap.set('blob', 'FileUpload');
FrontComponentMap.set('clob', 'FileUpload');
FrontComponentMap.set('date', 'Date');
FrontComponentMap.set('datetime', 'DateTime');
FrontComponentMap.set('datetime2', 'DateTime');
FrontComponentMap.set('timestamp without time zone', 'DateTime');

export function getFrontComponent(dataType) {
  return FrontComponentMap.get(dataType);
}

// -------------------------------- 前端文件 --------------------------------

export const LANGUAGE_LIST = [
  'js', //
  'ts', //
  'java', //
];

export const JS_FILE_LIST = [
  'js/list.vue', //
  'js/form.vue', //
  'js/api.js', //
  'js/const.js', //
];

export const TS_FILE_LIST = [
  'ts/list.vue', //
  'ts/form.vue', //
  'ts/api.ts', //
  'ts/const.ts', //
];

// -------------------------------- 后端文件 --------------------------------

export const JAVA_DOMAIN_FILE_LIST = [
  'Entity.java', //
  'AddForm.java', //
  'UpdateForm.java', //
  'QueryForm.java', //
  'VO.java', //
];

export const JAVA_FILE_LIST = [
  'Controller.java', //
  'Service.java', //
  'Manager.java', //
  'Dao.java', //
  'Mapper.xml', //
  ...JAVA_DOMAIN_FILE_LIST,
  'Menu.sql', //
];

// -------------------------------- 枚举enum --------------------------------

export function convertJavaEnumName(moduleName, columnName) {
  return moduleName + convertUpperCamel(columnName) + 'Enum';
}

/**
 * 检测是否有枚举
 */
export function checkExistEnum(comment) {
  if (!comment) {
    return false;
  }

  // 检测是否存在  [ ] 或者 【 】
  let leftBracketIndex = comment.indexOf('[');
  if (leftBracketIndex === -1) {
    leftBracketIndex = comment.indexOf('【');
  }

  let rightBracketIndex = comment.indexOf(']');
  if (rightBracketIndex === -1) {
    leftBracketIndex = comment.indexOf('】');
  }

  if (leftBracketIndex === -1 || rightBracketIndex === -1) {
    return false;
  }

  if (comment.indexOf(':') === -1) {
    return false;
  }

  return true;
}
