import * as service from '../AffairPage/publicApiService';
import moment from 'moment';
import { isJSON } from '@/baseComponent/utils';
import { getDefaultValues } from '../AffairPage/destruction';
import { message } from 'antd';

const text = [
  'BINARY',
  'BIT',
  'BLOB',
  'CHAR',
  'GEOMETRY',
  'GEOMETRYCOLLECTION',
  'JSON',
  'LINESTRING',
  'LONGBLOB',
  'LONGTEXT',
  'MEDIUMBLOB',
  'MEDIUMINT',
  'MEDIUMTEXT',
  'MULTILINESTRING',
  'MULTIPOINT',
  'MULTIPOLYGON',
  'POINT',
  'POLYGON',
  'REAL',
  'DECIMAL',
  'ENUM',
  'SET',
  'TEXT',
  'TINYBLOB',
  'TIBYTEXT',
  'VARBINARY',
  'VARCHAR',
];

const number = ['BIGINT', 'DOUBLE', 'FLOAT', 'INT', 'INTEGER', 'NUMERIC', 'SMALLINT', 'TINYINT'];

const date = ['DATE', 'DATETIME', 'TIME', 'TIMESTAMP', 'YEAR'];
const taskNode = ['TASKNODE'];
const format = {
  //欢哥那边定义好的 时间格式类型
  DATE: 'YYYY-MM-DD HH:mm',
  DATETIME: 'YYYY-MM-DD HH:mm:ss',
  TIME: 'HH:mm:ss',
  TIMESTAMP: 'HH:mm:ss',
  YEAR: 'YYYY',
};

/**
 * 将时间格式转化为unix时间戳
 * */
const transLateTimeTOUnix = (value, dataType) => {
  if (date.indexOf(dataType) > -1 && value) {
    return moment(value).format('x');
  } else {
    return value;
  }
};

const getFormArrayConfig = header => {
  let config = [];
  for (let item of header) {
    if (item.isPrimaryKey || item.isHidden) {
      // 主键
      continue;
      /* config.push(
         {
           key: item.name,
           name: item.title,
           type: 'input',
           placeHolder: `请输入${item.name}`,
           required: !item.isNull,
         }
       );*/
    } else if (text.indexOf(item.type) > -1) {
      config.push({
        key: item.name,
        name: item.title,
        type: 'input',
        placeHolder: `请输入${item.name}`,
        required: !item.isNull,
      });
    } else if (number.indexOf(item.type) > -1) {
      config.push({
        key: item.name,
        name: item.title,
        type: 'inputNumber',
        placeHolder: `请输入${item.name}`,
        required: !item.isNull,
        min: 0,
      });
    } else if (date.indexOf(item.type) > -1) {
      config.push({
        key: item.name,
        name: item.title,
        type: 'datePicker',
        placeHolder: `请输入${item.name}`,
        required: !item.isNull,
        format: format[item.type],
      });
    } else {
      config.push({
        key: item.name,
        name: item.title,
        type: 'input',
        placeHolder: `请输入${item.name}`,
        required: !item.isNull,
      });
    }
  }
  return config;
};

const transLate = {
  TextArea: 'textarea',
  Radio: 'radioGroup',
  Label: 'text',
  Checkbox: 'checkBoxMutiple',
  Select: 'select',
  Switch: 'switch',
  DatePicker: 'datePicker',
  RangePicker: 'rangePicker',
  UploadCom: 'buttonUpload',
  ImgUploadCom: 'upload',
  Input: 'input',
  TableSelect: 'tableSelect', // 表格选择
  ChildForm: 'childForm', // 最终保存的数据还有问题
  InputNumber: 'inputNumber',
  PartForm: 'partForm', // 还未开发 相当于选了一个选项 表单字段变更
  Echart: 'echart', //  不做
  Description: 'input', // 'description', // 还未开发
  Table: 'table', // 表格 未开发
};

const getOpts = async item => {
  let options = [];
  if (item.optionType === 'reference') {
    options = await service.getOptions(
      item.dataId,
      item.filterSql,
      item.referenceCodeName,
      item.referenceNameName
    );
  } else if (item.optionType === 'sql') {
    options = await service.getSqlOptions(item.dataId, item.sqlKey, item.valueName, item.labelName);
  } else {
    options = item.options;
  }
  return options;
};

const translateAddFields = async (data, tableInfo) => {
  let key = [];
  let res = [];
  for (let item of data) {
    if (key.indexOf(item.key) > -1) {
      continue;
    } else {
      key.push(item.key);
    }
    item.type = transLate[item.comName] || 'input';
    if (typeof item.key === 'undefined' || !item.key) {
      item.key = item.c1;
    }
    switch (item.comName) {
      case 'Input':
        if (number.indexOf(item.dataType) > -1) {
          item.type = 'inputNumber';
        }
        break;
      case 'DatePicker':
        item.format = item.format || format[item.dataType];
        if (item.format.indexOf('HH') > -1) {
          item.showTime = true;
        }
        break;
      case 'RangePicker':
        item.name = item.name || '起止时间';
        item.endKey = item.c2;
        item.format = item.format || format[item.dataType];
        if (item.format.indexOf('HH') > -1) {
          item.showTime = true;
        }
        break;
      case 'ChildForm':
        item.componentProps.thisFields = await translateAddFields(
          item.componentProps.thisFields,
          tableInfo
        );
        break;
      case 'Radio':
        item.options = await getOpts(item);
        break;
      case 'Select':
        item.options = await getOpts(item);
        break;
      case 'Checkbox':
        item.options = await getOpts(item);
        item.options = item.options.map(x => {
          return {
            label: x.name,
            value: x.key,
          };
        });
        break;
      case 'TableSelect':
        let info = await service.handleSqlfind(item.componentProps.sqlKey);
        if (isJSON(info.cols)) {
          info.cols = JSON.parse(info.cols);
        }
        item.componentProps.columnsData = info;
        item.componentProps.allValues = JSON.stringify(getDefaultValues(data, tableInfo));
        break;
      default:
        break;
    }
    res.push(item);
  }
  return res;
};

const mustHaveValue = (configFields, data) => {
  for (let item of configFields) {
    if (item.required && !data[item.key] && data[item.key] !== false && data[item.key] !== 0) {
      message.warning(`${item.name}是必填项请填写`);
      return false;
    }
    if (item.required && typeof data[item.key] === 'object') {
      if (data[item.key].selects && JSON.stringify(data[item.key].selects) === '{}') {
        message.warning(`${item.name}是必填项请填写`);
        return false;
      }
    }
  }
  return true;
};

export {
  text,
  number,
  date,
  getFormArrayConfig,
  translateAddFields,
  transLateTimeTOUnix,
  format,
  mustHaveValue,
  taskNode,
};