/**
 * Js数据排序工具类
 * @author cls
 * @date 2019-05-21
 */
import pinyin from 'js-pinyin';
/**
 * showdoc
 * @catalog JS工具类/DataSort
 * @title JSON数组排序
 * @description 根据传入对象数组，关键key，进行升序或降序排序
 * @method static
 * @url import { jsonArraySort } from '@birt/funclib/DataSort.js'
 * @param datas 必选 [{},{}] 记录集对象
 * @param key 必选 String json对象其中一个key值
 * @param sortType 可选 排序类型[ASC,DESC],默认ASC升序
 * @return [{},{}] 有序对象数组
 * @remark 测试用例
 *  jsonArraySort(
 *    [{'userAge':30,'userId':'张三'},{'userAge':26,'userId':'李四'},{'userAge':28,'userId':'王五'}],'userAge'
 *  )
 *  返回==>
 *  [{'userAge':26,'userId':'李四'},{'userAge':28,'userId':'王五'},{'userAge':30,'userId':'张三'}]
 */
export function jsonArraySort(datas, key, sortType) {
  datas.forEach(d => {
    if (escape(d[key]).indexOf("%u") >= 0) {
      d._py = pinyin.getCamelChars(d[key]).toUpperCase();
    } else {
      d._py = d[key]
    }
  })
  datas.sort((a, b) => a._py < b._py ? -1 : 1);
  if (sortType && sortType.toUpperCase() === "DESC") {
    datas.reverse()
  }
  return datas
}

/**
 * showdoc
 * @catalog JS工具类/DataSort
 * @title JSON数组多排序
 * @description 根据传入对象数组，orderBy多排序配置，进行升序或降序排序
 * @method static
 * @url import { jsonArrayMultiSort } from '@birt/funclib/DataSort.js'
 * @param datas 必选 [{},{}] 记录集对象
 * @param orderBy 必选 [{name:'字段名1',type:'ASC'},{name:'字段名2',type:'ASC'}] json对象其中一个key值
 * @return [{},{}] 有序对象数组
 * @remark 测试用例
 *  jsonArraySort(
 *    [{'userAge':30,'userId':'张三'},{'userAge':26,'userId':'赵六'},{'userAge':26,'userId':'李四'},{'userAge':28,'userId':'王五'}],
 *    [{name:'userAge',type:'ASC'},{}]
 *  )
 *  返回==>
 *  [{'userAge':26,'userId':'李四'},{'userAge':26,'userId':'赵六'},{'userAge':28,'userId':'王五'},{'userAge':30,'userId':'张三'}]
 */
export function jsonArrayMultiSort(datas, orderBy) {
  if (orderBy && orderBy.length === 1) {
    return jsonArraySort(datas, orderBy[0].name, orderBy[0].type)
  } else if (orderBy && orderBy.length > 1) {
    // 多排序算法暂不实现, 同时有不同方向排序未实现
    let joinDatas = []
    datas.forEach((recd, i) => {
      let joinVal = "";
      orderBy.forEach(orderItem => {
        joinVal += recd[orderItem.name]
      })
      joinDatas.push({
        joinVal: joinVal,
        arrayIndex: i
      })
    })
    joinDatas = jsonArraySort(joinDatas, "joinVal", orderBy[0].type)

    let sortDatas = []
    joinDatas.forEach(jItem => {
      sortDatas.push(datas[jItem.arrayIndex])
    })
    return sortDatas
  } else {
    return datas;
  }
}
