import axios from 'axios'
import FileSaver from 'file-saver'
import { getToken } from '@/utils/auth'

export function dateFormat2(format, date) {
  if (typeof date === 'string') {
    date = new Date(date)
  }
  const we = date.getDay() // 星期
  const qut = Math.floor((date.getMonth() + 3) / 3).toString() // 季度
  const opt = {
    'Y+': date.getFullYear().toString(), // 年
    'm+': (date.getMonth() + 1).toString(), // 月(月份从0开始，要+1)
    'd+': date.getDate().toString(), // 日
    'H+': date.getHours().toString(), // 时
    'M+': date.getMinutes().toString(), // 分
    'S+': date.getSeconds().toString(), // 秒
    'q+': qut // 季度
  }
  const week = {
    // 中文数字 (星期)
    0: '日',
    1: '一',
    2: '二',
    3: '三',
    4: '四',
    5: '五',
    6: '六'
  }
  const quarter = {
    // 中文数字（季度）
    1: '一',
    2: '二',
    3: '三',
    4: '四'
  }
  if (/(W+)/.test(format)) {
    format = format.replace(
      RegExp.$1,
      RegExp.$1.length > 1 ? (RegExp.$1.length > 2 ? '星期' + week[we] : '周' + week[we]) : week[we]
    )
  }
  if (/(Q+)/.test(format)) {
    // 输入一个Q，只输出一个中文数字，输入4个Q，则拼接上字符串
    format = format.replace(RegExp.$1, RegExp.$1.length === 4 ? '第' + quarter[qut] + '季度' : quarter[qut])
  }
  for (const k in opt) {
    const r = new RegExp('(' + k + ')').exec(format)
    if (r) {
      // 若输入的长度不为1，则前面补零
      format = format.replace(r[1], RegExp.$1.length === 1 ? opt[k] : opt[k].padStart(RegExp.$1.length, '0'))
    }
  }
  return format
}

// 定义一个函数将树形数据转换为列表
export function treeToList(tree, key = 'children', list = []) {
  // 将当前节点添加到列表中
  list.push(...tree)
  // 遍历当前节点的子节点
  tree?.forEach(item => {
    if (item?.[key]?.length) {
      // 递归调用，将子节点及其后代节点添加到列表中
      treeToList(item?.[key], key, list)
    }
  })
  return list
}

/**
 * 删除对象中的空值
 * @param {object} obj
 * @returns {Object}
 */
export function deleteEmptyObj(obj) {
  let newObj = obj
  for (var key in newObj) {
    if (newObj[key] === '' || newObj[key] === null || newObj[key] === undefined) {
      delete newObj[key]
    }
  }
  return newObj
}

/**
 *
 * @param {*} array 要查询的数组
 * @param {*} attr 要查询的字段
 * @param {*} val 要查询的字段值
 * @returns
 */
export function findElem(array, attr, val) {
  if (!array || !array.length) {
    return -1
  }
  for (var i = 0; i < array.length; i++) {
    if (array[i][attr] == val) {
      return i //返回当前索引值
    }
  }
  return -1
}

/**
 * 生成带参数的链接
 * @param {String} url
 * @param {Object} params
 * @returns
 */
export function createParamsUrl(url, params) {
  if (typeof url === 'undefined' || url == null || url == '') {
    return ''
  }
  if (typeof params === 'undefined' || params == null || typeof params !== 'object') {
    return ''
  }
  url += url.indexOf('?') != -1 ? '' : '?'
  for (var k in params) {
    url += (url.indexOf('=') != -1 ? '&' : '') + k + '=' + encodeURI(params[k])
  }
  return url
}

/**
 * 导出功能
 * @param {*} obj
 * @returns
 */
export function downloadFiles(url, params = {}) {
  params['x-token'] = getToken()
  const newParams = deleteEmptyObj(params)
  const newUrl = createParamsUrl(url, newParams)
  console.log(process.env.VUE_APP_BASE_API + newUrl)
  window.open(process.env.VUE_APP_BASE_API + newUrl)
}

export function downloadFiles2(url, params = {}, name) {
  const newParams = deleteEmptyObj(params)
  const newUrl = createParamsUrl(url, newParams)

  axios({
    url: process.env.VUE_APP_BASE_API + newUrl,
    method: 'get',
    responseType: 'blob',
    headers: {
      'x-token': getToken()
    }
  }).then(res => {
    var blob = new Blob([res.data], {
      type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=utf-8'
    })
    var filename = name + '.xlsx'
    var downloadElement = document.createElement('a')
    var href = window.URL.createObjectURL(blob) // 创建下载的链接
    downloadElement.style.display = 'none'
    downloadElement.href = href
    downloadElement.download = filename // 下载后文件名
    document.body.appendChild(downloadElement)
    downloadElement.click() // 点击下载
    document.body.removeChild(downloadElement) // 下载完成移除元素
    window.URL.revokeObjectURL(href) // 释放掉blob对象
  })

  // params['x-token'] = getToken()
  // const newParams = deleteEmptyObj(params)
  // const newUrl = createParamsUrl(url, newParams)
  // console.log(process.env.VUE_APP_BASE_API + newUrl)
  // window.open(process.env.VUE_APP_BASE_API + newUrl)
}

/**
 * 导入功能
 * @param {*} url
 * @param {*} formData
 */
export async function handleImport(url, formData) {
  const Result = await new Promise((resolve, reject) => {
    axios
      .post(
        process.env.VUE_APP_BASE_API + url,
        formData,

        {
          headers: {
            'Content-Type': 'multipart/form-data',
            'x-token': getToken()
          }
        }
      )
      .then(res => {
        resolve(res.data)
      })
      .catch(err => {
        reject(err)
      })
  })
  return Result
}
/**
 * 导入有返回二进制文件
 * @param {*} url
 * @param {*} formData
 */
export async function handleImportTwo(url, formData) {
  const Result = await new Promise((resolve, reject) => {
    axios
      .post(
        process.env.VUE_APP_BASE_API + url,
        formData,

        {
          responseType: 'arraybuffer',
          headers: {
            'Content-Type': 'multipart/form-data',
            'x-token': getToken()
          }
        }
      )
      .then(res => {
        resolve(res.data)
      })
      .catch(err => {
        reject(err)
      })
  })
  return Result
}

/**
 * 重置时间格式
 * @param {*} date
 * @param {*} type
 */
export function resetDateFormat(date, type) {
  let newDate = ''
  if (!date) {
    return ''
  }
  // type=1: yyyy-MM-dd 转 yyyy-MM-dd HH:mm:ss
  if (type == 1 || !type) {
    newDate = date + ' 00:00:00'
  }
}

/**
 * 若文档中已有命名dateFormat，可用dFormat()调用
 * 年(Y) 可用1-4个占位符
 * 月(m)、日(d)、小时(H)、分(M)、秒(S) 可用1-2个占位符
 * 星期(W) 可用1-3个占位符
 * 季度(q为阿拉伯数字，Q为中文数字)可用1或4个占位符
 *
 * let date = new Date()
 * dateFormat("YYYY-mm-dd HH:MM:SS", date)           2020-02-09 14:04:23
 * dateFormat("YYYY-mm-dd HH:MM:SS Q", date)         2020-02-09 14:09:03 一
 * dateFormat("YYYY-mm-dd HH:MM:SS WWW", date)       2020-02-09 14:45:12 星期日
 * dateFormat("YYYY-mm-dd HH:MM:SS QQQQ", date)      2020-02-09 14:09:36 第一季度
 * dateFormat("YYYY-mm-dd HH:MM:SS WWW QQQQ", date)  2020-02-09 14:46:12 星期日 第一季度
 */
export function dateFormat(format, date) {
  const we = date.getDay() // 星期
  const qut = Math.floor((date.getMonth() + 3) / 3).toString() // 季度
  const opt = {
    'Y+': date.getFullYear().toString(), // 年
    'm+': (date.getMonth() + 1).toString(), // 月(月份从0开始，要+1)
    'd+': date.getDate().toString(), // 日
    'H+': date.getHours().toString(), // 时
    'M+': date.getMinutes().toString(), // 分
    'S+': date.getSeconds().toString(), // 秒
    'q+': qut // 季度
  }
  const week = {
    // 中文数字 (星期)
    0: '日',
    1: '一',
    2: '二',
    3: '三',
    4: '四',
    5: '五',
    6: '六'
  }
  const quarter = {
    // 中文数字（季度）
    1: '一',
    2: '二',
    3: '三',
    4: '四'
  }
  if (/(W+)/.test(format)) {
    format = format.replace(
      RegExp.$1,
      RegExp.$1.length > 1 ? (RegExp.$1.length > 2 ? '星期' + week[we] : '周' + week[we]) : week[we]
    )
  }
  if (/(Q+)/.test(format)) {
    // 输入一个Q，只输出一个中文数字，输入4个Q，则拼接上字符串
    format = format.replace(RegExp.$1, RegExp.$1.length == 4 ? '第' + quarter[qut] + '季度' : quarter[qut])
  }
  for (const k in opt) {
    const r = new RegExp('(' + k + ')').exec(format)
    if (r) {
      // 若输入的长度不为1，则前面补零
      format = format.replace(r[1], RegExp.$1.length == 1 ? opt[k] : opt[k].padStart(RegExp.$1.length, '0'))
    }
  }
  return format
}

/**
 * @param url {string} pdf地址
 * @param fileName {string} pdf名称
 */
export function downloadPdf(url, fileName) {
  axios({
    method: 'get',
    url,
    responseType: 'blob'
  }).then(res => {
    const file = new Blob([res.data], {
      type: 'application/pdf'
    })
    FileSaver(file, fileName)
  })
}

export function changeNumberMoneyToChinese(money) {
  // 接收数字或者字符串数字
  if (typeof money === 'string') {
    if (money === '') return ''
    if (isNaN(parseFloat(money))) {
      throw Error(`参数有误：${money}，请输入数字或字符串数字`)
    } else {
      // 去掉分隔符(,)
      money = money.replace(/,/g, '')
    }
  } else if (typeof money === 'number') {
    // 去掉分隔符(,)
    money = money.toString().replace(/,/g, '')
  } else {
    throw Error(`参数有误：${money}，请输入数字或字符串数字`)
  }
  // 汉字的数字
  const cnNums = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']
  // 基本单位
  const cnIntRadice = ['', '拾', '佰', '仟']
  // 对应整数部分扩展单位
  const cnIntUnits = ['', '万', '亿', '兆']
  // 对应小数部分单位
  const cnDecUnits = ['角', '分', '毫', '厘']
  // 整数金额时后面跟的字符
  const cnInteger = '整'
  // 整型完以后的单位
  const cnIntLast = '元'
  // 金额整数部分
  let IntegerNum
  // 金额小数部分
  let DecimalNum
  // 输出的中文金额字符串
  let ChineseStr = ''
  // 正负值标记
  let Symbol = ''
  // 转成浮点数
  money = parseFloat(money)
  // 如果是0直接返回结果
  if (money === 0) {
    ChineseStr = cnNums[0] + cnIntLast + cnInteger
    return ChineseStr
  }
  // 如果小于0，则将Symbol标记为负，并转为正数
  if (money < 0) {
    money = -money
    Symbol = '负 '
  }
  // 转换为字符串
  money = money.toString()
  // 将整数部分和小数部分分别存入IntegerNum和DecimalNum
  if (money.indexOf('.') === -1) {
    IntegerNum = money
    DecimalNum = ''
  } else {
    const moneyArr = money.split('.')
    IntegerNum = moneyArr[0]
    DecimalNum = moneyArr[1].substr(0, 4)
  }
  // 获取整型部分转换
  if (parseInt(IntegerNum, 10) > 0) {
    let zeroCount = 0
    let IntLen = IntegerNum.length
    for (let i = 0; i < IntLen; i++) {
      // 获取整数的每一项
      let term = IntegerNum.substr(i, 1)
      // 剩余待处理的数量
      let surplus = IntLen - i - 1
      // 用于获取整数部分的扩展单位
      // 剩余数量除以4，比如12345，term为1时，expandUnit则为1，
      // cnIntUnits[expandUnit]对应得到的单位为万
      let expandUnit = surplus / 4
      // 用于获取整数部分的基本单位
      // 剩余数量取余4，比如123，那么第一遍遍历term为1，surplus为2，baseUnit则为2，
      // 所以cnIntRadice[baseUnit]对应得到的基本单位为'佰'
      let baseUnit = surplus % 4
      if (term === '0') {
        zeroCount++
      } else {
        // 连续存在多个0的时候需要补'零'
        if (zeroCount > 0) {
          ChineseStr += cnNums[0]
        }
        // 归零
        zeroCount = 0
        /*
   cnNums是汉字的零到玖组成的数组，term则是阿拉伯0-9，
   直接将阿拉伯数字作为下标获取中文数字
   例如term是0则cnNums[parseInt(term)]取的就是'零'，9取的就是'玖'
   最后加上单位就转换成功了！
   这里只加十百千的单位
   */
        ChineseStr += cnNums[parseInt(term)] + cnIntRadice[baseUnit]
      }
      /*
   如果baseUnit为0，意味着当前项和下一项隔了一个节权位即隔了一个逗号
   扩展单位只有大单位进阶才需要，判断是否大单位进阶，则通过zeroCount判断
   baseUnit === 0即存在逗号，baseUnit === 0 && zeroCount < 4 意为大单位进阶
 */
      if (baseUnit === 0 && zeroCount < 4) {
        ChineseStr += cnIntUnits[expandUnit]
      }
    }
    ChineseStr += cnIntLast
  }
  // 小数部分转换
  if (DecimalNum !== '') {
    let decLen = DecimalNum.length
    for (let i = 0; i < decLen; i++) {
      // 同理，参考整数部分
      let term = DecimalNum.substr(i, 1)
      if (term !== '0') {
        ChineseStr += cnNums[Number(term)] + cnDecUnits[i]
      }
    }
  }
  ChineseStr = Symbol + ChineseStr
  return ChineseStr
}

// 区分单击事件和双击事件
export function clickBG(millisecond) {
  this.timer = null
  this.click = callback => {
    clearTimeout(this.timer)
    this.timer = setTimeout(function () {
      clearTimeout(this.timer)
      callback && callback()
    }, millisecond)
  }
  this.dblClick = callback => {
    clearTimeout(this.timer)
    callback && callback()
  }
}

// 获取地址栏参数
export function getUrlParam() {
  let getqyinfo = window.location.href.split('?')[1] || ''
  let getqys = getqyinfo.split('&')
  let obj = {} //创建空对象，接收截取的参数
  for (let i = 0; i < getqys.length; i++) {
    let item = getqys[i].split('=')
    let key = item[0]
    let value = item[1]
    obj[key] = value
  }
  return obj
}
