import style from '../ReportsManage.less';
import { downloadFileUrl } from '../../api/service/workflow';

const isObject = (obj) => {
  return Object.prototype.toString.call(obj) === '[object Object]';
};
const isString = (obj) => {
  return Object.prototype.toString.call(obj) === '[object String]';
};
const isNumber = (num) => {
  return Object.prototype.toString.call(num) === '[object Number]';
};
const isArray = (arr) => {
  return Object.prototype.toString.call(arr) === '[object Array]';
};
const hasMoney = (configItems) => {
  if (!configItems) return false;
  let _items = configItems.split('|');
  return !!_items.find(item => item === '金额');
};
const isSelect = (configItems) => {
  if (!configItems) return false;
  let _items = configItems.split('|');
  return !!_items.find(item => item === 'renderAsSelect');
};
// options=name1[.value1],name2[.value2],name3[.value3];
const returnOptions = (configItems) => {
  if (!configItems) return false;
  let _items = configItems.split('|');
  let _options = _items.find(item => item.includes('options='));
  if (!_options) return false;
  return _options.replace('options=', '').split(',');
};
const returnRows = (configItems) => {
  if (!configItems) return 3;
  let _items = configItems.split('|');
  let _options = _items.find(item => item.includes('rows='));
  if (!_options) return 3;
  let _rows = Number(_options.replace('rows=', ''));
  return !isNaN(_rows) && _rows >= 1 ? _rows : 3;
};
const returnCols = (configItems) => {
  if (!configItems) return 1;
  let _items = configItems.split('|');
  let _options = _items.find(item => item.includes('cols='));
  if (!_options) return 1;
  let _cols = Number(_options.replace('cols=', ''));
  return !isNaN(_cols) && _cols <= 3 && _cols >= 0 ? _cols : 1;
};
/**
 *  @Description: 用来在summary中处理数值的配置
 *  @Params: 参数描述
 *  @Date: 2022/8/10
 *  @Author: ChenLong
 * */
const returnHandledNumber = (configItems, num) => {
  // 精度、前缀、后缀、倍率
  // $_d|_d%|_d*0.0001|金额|0.00|$_d_sum*0.01*百万
  if (isNaN(Number(num))) return '-';
  if (!configItems) return num;
  num = Number(num);
  let _items = configItems.split('|');
  /*  let prefix = '';
    let suffix = '';*/
  let template = '_d';
  let precision = 0;
  let rate = 1;
  _items.forEach(item => {
    if (item.match(/_d[^(\*|_sum)]/)) {
      // 后缀
      template = item;
    } else if (item.match(/^_d\*/)) {
      // 倍率
      // let _rate = item.replace(/_d\*/, '');
      // rate = (_rate && isSummary) ? Number(_rate) : 1; // 总结栏计算需要计算倍率，其他不用
      // edit by chenlong 2023年2月22日 需求变更，总结栏精度转换导致某些累加不够的情况，数据单位发生了变化，废弃当前做法，新增总结栏的倍率判断
    } else if (item.match(/^0\./)) {
      // 精度
      precision = item.replace('0.', '').length;
    }
  });
  // 可能存在NaN的问题
  return _items.includes('金额') ? Number((num * rate).toFixed(precision)).toLocaleString() : (num * rate).toFixed(precision); // 最后用_d%这个带了后缀的模板，将_d用计算后的数字替换掉，就得出带了后缀、单位的数值字符串
};


const returnSummaryNumber = (configItems, num, isSummary) => {
  // 总结栏配置规则
  // $_d_sum*0.01*百万
  if (isNaN(Number(num))) return '-';
  if (!configItems) return num;
  num = Number(num);
  let _items = configItems.split('|');
  /*  let prefix = '';
    let suffix = '';*/
  let template = '_d';
  let precision = 0;
  let rate = 1;
  let combine = '_combine_'; // 连接符
  let _prefix = '';
  _items.forEach(item => {
    if (item.match(/_d_sum\*/)) {
      // 总结栏的倍率
      let hasPrefix = item.match(/(\s+)?_d_sum/);
      _prefix = hasPrefix ? item.split('_d_sum')?.[0] : '';
      let _rateStr = item.replace(/_d_sum\*/, '');
      let _temp = _rateStr.split('*'); // ['0.01','百万']
      let _rate = _temp?.[0];
      rate = (_rate && !isNaN(Number(_rate)) && isSummary) ? Number(_rate) : 1;
      if (isSummary && _temp?.[1]) {
        template = `_d${combine}${_temp[1]}`;
      }
    }
  });
  // 可能存在NaN的问题
  let final = _items.includes('金额') ? Number((num * rate).toFixed(precision)).toLocaleString() : (num * rate).toFixed(precision);
  let _template = template.split(combine);
  return <>
    <span className={style.prefixOrSuffix}>{_prefix || ''}</span>
    {template.replace(/_d(.+)?/, isString(final) ? final : '-')}
    <span className={style.prefixOrSuffix}>{_template[1] || ''}</span>
  </>;
};
/**
 *  @Description: 返回configItems内配置的默认值、默认模式等等
 *  @Params: 参数描述
 *  @Date: 2022/8/12
 *  @Author: ChenLong
 *  @params:
 *           configItems 报表字段的配置 例如 defaultValue=智慧水务    defaultDateModel=customer|defaultDateValue=2022-01-01,2022-12-31;
 *           keysArray 所需要返回的值的key的集合，比如你需要获取configItems中的’defaultValue‘，那么keysArray=['defaultValue'];
 *  @Returns:
 *          defaultValue 通用参数 默认值
 *          defaultDateModel 时间参数 默认模式
 *          defaultDateValue 时间参数 默认时间
 * */
const returnDefaultValueOrConfigs = (configItems = '', keysArray = []) => {
  let _map = {};
  let _configItemsArray = configItems.split('|');
  keysArray.forEach(key => {
    _map[key] = _configItemsArray.find(item => item.includes(`${key}=`))?.replace(`${key}=`, '');
  });
  return _map;
};

function downloadFunc(url, name, target = '_self') {
  const a = document.createElement('a');
  a.href = url;
  a.target = target;
  a.download = name;
  a.click();
  a.remove();
}

/**
 *  @Description: 校验文件的名称是否包含特殊字符
 *  @Params: {Object: File} file file对象 { special:Boolean } 是否去除/的匹配
 *  @Date: 2021/12/8
 *  @Author: ChenLong
 *  @Return {Object} {type: error | success ,content: 提示...}
 * */
function filenameVerification(file, special) {
  // 文件名含有特殊字符  提示不能上传   {+,:/?#[]@!$&\\*+;=}
  // 规则对象(flag)
  var flag = !special ? new RegExp('[`~!@#$^&*=|{}\':;\',\\[\\]/?~！@#￥&*——|{}【】‘；：”“\'。，、？]') : new RegExp('[`~!@#$^&*=|{}\':;\',[\\]?~！@#￥&*——|{}【】‘；：”“\'。，、？]');
  if (flag.test(file.name)) {
    return {
      type: 'error',
      content: `文件名格式错误，请检查文件名是否含有特殊字符${'~!@#$^&*=|{}\':;\',\\[\\]/?~！@#￥&*——|{}【】‘；：”“\'。，、？'}`,
    };
  }
  return {
    type: 'success',
    content: `上传成功！`,
  };
}

function handleFiles(file) {
  let _filesArr = !file ? [] : file.split(',').filter(item => item);
  let fileList = [];
  _filesArr.forEach((item, index) => {
    if (item && filenameVerification({ name: item }, true).type !== 'error') { // @Tips: 直接过滤掉名字中有异常字符的文件
      let _obj = {
        uid: index + '_' + Math.random(),
        value: item,
        name: item.includes('\\') ? item.split('\\').reverse()[0] : item.split('/').reverse()[0],
        type: 'file',
        status: 'done',
        url: `${downloadFileUrl}?filePath=${item}`,
        sourcePath: item,
      };
      fileList.push(_obj);
    }
  });
  return fileList
}

export {
  isObject,
  isString,
  isNumber,
  hasMoney,
  isArray,
  returnHandledNumber,
  returnSummaryNumber,
  returnDefaultValueOrConfigs,
  downloadFunc,
  filenameVerification,
  isSelect,
  returnOptions,
  returnRows,
  returnCols,
  handleFiles,
};
