/**
 * 处理数组数据，并根据 key 进行分组
 * @param array 数组数据
 * @param key 分组的键值依据
 * @param resKey 分组后数据存放的列表
 * @param arrKey  分组时需要提取出来的属性列表
 */
const handleOrderItems = (array = [], key, resKey = 'list', arrKey = []) => {
  if (!key) return array
  const aMap = []
  const aResult = []
  for (let i = 0; i < array.length; i++) {
    const item = array[i]
    if (aMap.indexOf(item[key]) === -1) {
      const oItem = {}
      oItem[resKey] = [item]
      oItem[key] = item[key]
      if (item[key] !== 0 && item[key]) {
        oItem.spuMold = 2
      } else {
        oItem.spuMold = 0
      }
      if (arrKey.length > 0) {
        arrKey.forEach(keyItem => {
          oItem[keyItem] = item[keyItem]
        })
      }
      aResult.push(oItem)
      aMap.push(item[key])
    } else {
      const index = aMap.indexOf(item[key])
      aResult[index][resKey].push(item)
    }
  }
  return aResult
}

/**
 * 根据所传数组及 key,计算并返回总和
 * @param list 数组
 * @param priceKey 数据 列：价格
 * @param countKey 数量
 * @returns {number}
 */
const countComboPrice = (list, priceKey, countKey) => {
  let s = 0
  for (let i = 0; i < list.length; i++) {
    if (list[i][priceKey]) {
      s += parseFloat(list[i][priceKey] * list[i][countKey])
    }
  }
  s = s.toFixed(3) * 1000 / 1000
  return s || 0
}

/**
 * 根据传入新总价，等比例计算出新的商品单价
 * @param arr 数组
 * @param totalPrice 新总价
 * @param priceKey 原先的单价
 * @param countKey 数量
 * @param newPriceKey 根据新总数计算出的新单价
 */
const slipperShowPrice = (arr, totalPrice, priceKey = 'comboPrice', countKey = 'comboCount', newPriceKey = 'showPrice') => {
  let orTotal = 0
  // 计算数组原先的总数量
  arr.forEach((item) => {
    if (item[priceKey]) {
      orTotal += item[priceKey] * item[countKey]
    }
  })
  // 根据传入的新总数，等比例计算先数量
  arr.forEach((item) => {
    if (orTotal === 0 || orTotal === null) orTotal = 0.01
    if (item[countKey] === 0 || item[countKey] === null) item[countKey] = 1
    item[newPriceKey] = ((((item[priceKey] * item[countKey]) / orTotal) * totalPrice) / item[countKey]).toFixed(2)
  })

  let total = 0
  for (let i = 0; i < arr.length - 1; i++) {
    total += arr[i][newPriceKey] * arr[i][countKey]
  }

  arr[arr.length - 1][newPriceKey] = ((totalPrice - total) / arr[arr.length - 1][countKey]).toFixed(2)
  return arr
}

export {
  handleOrderItems,
  countComboPrice,
  slipperShowPrice
}
