/**
 * 解析property
 * @param {Number | String} val property值，也可能是多个对应值之和
 * @return {Object} map
 * @return {Boolean} map.isCompute 是否是计算属性
 * @return {Boolean} map.isField 是否是字段属性
 * @return {Boolean} map.isValue 是否是值属性
 * @return {Boolean} map.isCategray 是否是不是属性
 * @return {Boolean} map.notProperty 是否是类别属性
 */
function parseProperty(val) {
  // 用二进制对应位上的1表示对应属性的开启状态
  // {
  //   1: '0001', // 计算属性
  //   2: '0010', // 字段属性
  //   4: '0100', // 值属性
  //   8: '1000', // 不是属性
  //   16: '00010000', // 类别属性
  // }
  // 将val转为二进制，来处理值之和的情况，例如：3 = 1 + 2 = 0001 + 0010 = 0011
  // 然后再把二进制值的字符串转为数字，调转顺序，0 1转为bool
  const status = Number(val)
    .toString(2)
    .split('')
    .reverse()
    .map(i => i == 1);
  // 根据上面的键值对表，从二进制最末一位开始，对应在数组里
  const keys = ['isCompute', 'isField', 'isValue', 'isCategray', 'notProperty'];
  // 根据数组转换出状态结果
  return keys.reduce((map, key, index) => ({ ...map, [key]: !!status[index] }), {});
}

function getParamsData(node) {
  const result = { key: '', compute: '', value: '' };
  const property = parseProperty(node.property);
  if (property.isField) {
    result.key = node.columnKey;
    // console.log(result.key)
  }
  // isCompute 是否是计算属性
  // 计算属性的值来源：computeCharacter或是选择的值
  if (property.isCompute) {
    result.compute = node.computeCharacter;
  }
  // notProperty 是否是类别属性
  // 类别属性 dealkey有值就带上，和value key同级，如果没值要删掉
  if (property.notProperty && node.dealKey) {
    result.dealKey = node.dealKey;
  }
  result.value = node.value;
  return { type: 'data', data: result };
}
/**
 * @description 将数据转换成后端需要的数据、缩略信息数据
 * @param {Object} data 选择好的筛选条件数据
 * @return {Array} result.filterJson 后端需要的查询条件
 * @return {Array} result.filterFrontShow 前端回显的数据
 */
const transform = (data, scenes) => {
  const result = {
    filterJson: [], // 后台需要的查询条件
    filterFrontShow: [], // 前端回显的数据
    scenes // 场景值 member02
  };
  const obj = { list: [], type: 'and' };
  let filterFrontShow = [];
  data.forEach(item => {
    if (!item.value) return;
    obj.list.push({ type: 'or', list: [getParamsData(item)] });
    filterFrontShow.push(item);
  });
  result.filterJson = JSON.stringify(obj);
  result.filterFrontShow = JSON.stringify(filterFrontShow);
  return { data: result, bool: filterFrontShow.length > 0 };
};

export default transform;
