// 统一暴露工具,供其他地方调用

// 数组转对象
export function arrToObj(arr) {
  // 参数必须是一个数组
  if (!Array.isArray(arr)) {
    throw new Error('type err: arr 必须是一个数组')
  }
  // 存放返回结果
  const obj = {}
  arr.map((item) => {
    obj[Object.keys(item)[0]] = item[Object.keys(item)[0]]
  })
  return obj
}

/*
 *  文件流转换为url
 *  @params file 文件流
 *  @return url
 */
export function getObjectURL(file) {
  console.log(file)
  let url = null
  if (window.createObjectURL != undefined) {
    // basic
    url = window.createObjectURL(file)
  } else if (window.webkitURL != undefined) {
    // webkit or chrome
    url = window.webkitURL.createObjectURL(file)
  } else if (window.URL != undefined) {
    // mozilla(firefox)
    url = window.URL.createObjectURL(file)
  }
  return url
}

/**
 * @description 文件下载(兼容IE)
 * @param {Object} response options 接口响应的数据 包括文件流及保文信息
 * @param {String} file_name 文件名称
 * @returns {undefined} undefined
 */
export function downloadFile(response, file_name = 'ExportFile') {
  const fileType = response.headers['content-type'] || 'application/pdf'
  const disposition = response.headers['content-disposition']
  if (disposition) {
    file_name = disposition.split('filename=')[1]
  }
  const blob = new Blob([response.data], { type: `${fileType};charset=utf-8` })

  const ie = navigator.userAgent.match(/MSIE\s([\d.]+)/),
    ie11 =
      navigator.userAgent.match(/Trident\/7.0/) &&
      navigator.userAgent.match(/rv:11/),
    ieEDGE = navigator.userAgent.match(/Edge/g),
    ieVer = ie ? ie[1] : ie11 ? 11 : ieEDGE ? 12 : -1

  if (ie && ieVer < 10) {
    this.message.error('No blobs on IE<10')
    return
  }
  if (ieVer > -1) {
    window.navigator.msSaveBlob(blob, file_name)
    return {}
  } else {
    const url = window.URL.createObjectURL(blob)
    return {
      url,
      file_name
    }
  }
}

//导出excel
export function exportFile(res, file_name) {
  let blob = new Blob([res.data], {
    type: 'application/vnd.ms-excel;charset=utf-8'
  })
  let url = window.URL.createObjectURL(blob)
  let aLink = document.createElement('a')
  aLink.style.display = 'none'
  aLink.href = url
  aLink.setAttribute('download', file_name)
  document.body.appendChild(aLink)
  aLink.click()
  document.body.removeChild(aLink)
  window.URL.revokeObjectURL(url)
}

export const numValid = /^([1-9][0-9]*|0)([.][0-9]+)?$/

// 对象转换成query字符串
export const toQuery = (params) => {
  if (!params) {
    return ''
  }
  let query = []
  for (let i in params) {
    query.push(`${i}=${encodeURIComponent(params[i])}`)
  }
  return query.join('&')
}
// 数值计算
export const accuracy = {
  division(arg1, arg2) {
    //除法
    var t1 = 0,
      t2 = 0,
      r1,
      r2
    try {
      t1 = arg1.toString().split('.')[1].length
    } catch (e) {
      console.log(e)
    }
    try {
      t2 = arg2.toString().split('.')[1].length
    } catch (e) {
      console.log(e)
    }
    if (Math) {
      r1 = Number(arg1.toString().replace('.', ''))
      r2 = Number(arg2.toString().replace('.', ''))
      return this.multiply(r1 / r2, Math.pow(10, t2 - t1))
    }
  },
  multiply(arg1, arg2) {
    //乘法
    var m = 0,
      s1 = arg1.toString(),
      s2 = arg2.toString()
    try {
      m += s1.split('.')[1].length
    } catch (e) {
      console.log(e)
    }
    try {
      m += s2.split('.')[1].length
    } catch (e) {
      console.log(e)
    }
    return (
      (Number(s1.replace('.', '')) * Number(s2.replace('.', ''))) /
      Math.pow(10, m)
    )
  },
  add(arg1, arg2) {
    //加法
    var r1, r2, m
    try {
      r1 = arg1.toString().split('.')[1].length
    } catch (e) {
      r1 = 0
    }
    try {
      r2 = arg2.toString().split('.')[1].length
    } catch (e) {
      r2 = 0
    }
    m = Math.pow(10, Math.max(r1, r2))
    console.log(this.multiply(arg1, m), this.multiply(arg2, m))
    return (this.multiply(arg1, m) + this.multiply(arg2, m)) / m
  },
  subtract(arg1, arg2) {
    //减法
    var r1, r2, m, n
    try {
      r1 = arg1.toString().split('.')[1].length
    } catch (e) {
      r1 = 0
    }
    try {
      r2 = arg2.toString().split('.')[1].length
    } catch (e) {
      r2 = 0
    }
    m = Math.pow(10, Math.max(r1, r2))
    n = r1 >= r2 ? r1 : r2
    return ((arg1 * m - arg2 * m) / m).toFixed(n)
  },
  // 计算一个数组的总和
  sum(arr) {
    let result = 0
    arr.forEach((item) => {
      result = this.add(result, item)
    })
    return result
  },
  // 计算一个数组的总和 fn是对每项数据的处理方式
  sumBy(arr, fn) {
    let result = 0
    arr.forEach((item) => {
      let val = item
      if (fn) {
        val = fn(item)
      }
      result = this.add(result, val)
    })
    return result
  },
  toCeil(num, p = 4) {
    num = isNaN(num) ? 0 : num
    p = isNaN(p) ? 0 : p
    let precision = Math.pow(10, p)
    return Math.ceil((num * precision).toFixed(1)) / precision
  },
  toFloor(num, p = 4) {
    num = isNaN(num) ? 0 : num
    p = isNaN(p) ? 0 : p
    let precision = Math.pow(10, p)
    return Math.floor((num * precision).toFixed(1)) / precision
  }
}