/**
 * 判断是否为[空]数据
 * @param {String} value 数据值
 * @returns {Boolean}
 * @author Matrix
 * @since 2022/05/30
 */
export function isEmpty(value) {
  return ['', undefined, 'undefined', null, 'null', 'NaN'].includes(value)
}

/**
 * 对数据进行格式化 (用于页面默认展示)
 * @param {String} value 数据值
 * @returns {String}
 * @author Matrix
 * @since 2022/05/30
 */
export function isEffectiveCommon(value) {
  return isEmpty(value) ? '-' : value
}

/**
 * 对数字进行格式化 (用于页面默认展示)
 * @param {String} value 数据值
 * @returns {String}
 * @author Matrix
 * @since 2022/05/30
 */
export function isEffectiveNumber(value) {
  return isEmpty(value) ? '0' : value
}

/**
 * 格式化手机号码
 * @param {String} phone 手机号
 * @returns {String}
 * @author Matrix
 * @since 2022/05/30
 */
export function isEffectivePhone(phone) {
  return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2')
}

/**
 * 判断是否是图片
 * @param {String} url 文件链接
 * @author Matrix
 * @since 2022/05/30
 */
export function isImage(url) {
  return /\.(gif|jpg|jpeg|png|GIF|JPG|PNG)$/.test(url)
}

/**
 * 判断是否可以预览
 * @param {String} url 文件链接
 * @author Matrix
 * @since 2022/05/30
 */
export function isPreview(url) {
  return /\.(jpg|jpeg|png|doc|docx|xls|xlsx|txt|pdf|sql|ppt|pptx)$/.test(url)
}

/**
 * 获取 url 中的参数
 * @param {String} url URL地址
 * @return {{}|any}
 * @author Matrix
 * @since 2022/05/30
 */
export function getParams(url) {
  const search = url.split('?')[1]
  if (!search) {
    return {}
  }
  return JSON.parse(
    '{"' +
      decodeURIComponent(search).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g, '":"').replace(/\+/g, ' ') +
      '"}'
  )
}

/**
 * 格式化金额
 * @param {Number|String} number 金额
 * @param {String} symbol 金额标识 [￥, $]
 * @param {Number} places 保留两位小数
 * @param {String} thousand 占位符
 * @param {String} decimal 分隔符 [.后保留两位小数]
 * @returns {String}
 * @author Matrix
 * @since 2022/05/30
 */
export function isEffectiveMoney(number = 0, symbol = '', places = 2, thousand = ',', decimal = '.') {
  // places = !isNaN((places = Math.abs(places))) ? places : 2
  const negative = number < 0 ? '-' : ''
  const i = parseInt((number = Math.abs(+number || 0).toFixed(places)), 10) + ''
  let j = (j = i.length) > 3 ? j % 3 : 0
  return (
    symbol +
    negative +
    (j ? i.substr(0, j) + thousand : '') +
    i.substr(j).replace(/(\d{3})(?=\d)/g, '$1' + thousand) +
    (places
      ? decimal +
        Math.abs(number - i)
          .toFixed(places)
          .slice(2)
      : '')
  )
}

/**
 * base64 图片转码文件流
 * @param {String} url base64
 * @param {String} type 文件类型
 * @returns {File}
 * @author Matrix
 * @since 2022/05/30
 */
export function base64toFile(url, type = 'file') {
  let arr = url.split(',')
  let mime = arr[0].match(/:(.*?);/)[1]
  let suffix = mime.split('/')[1]
  let bStr = atob(arr[1])
  let n = bStr.length
  let u8arr = new Uint8Array(n)
  while (n--) {
    u8arr[n] = bStr.charCodeAt(n)
  }
  return new File([u8arr], `${type}.${suffix}`, {
    type: mime
  })
}

/**
 * 全局唯一标识符，也称作 uuid(Universally Unique IDentifier)
 * @param {Number} len uuid的长度
 * @param {Number} radix 生成uuid的基数 (2-二进制, 8-八进制, 10-十进制, 16-十六进制)
 * @param {Boolean} firstU 将返回的首字母置为 "u"
 * @returns {string}
 * @author Matrix <matrix.zyh@gmail.com>
 */
export function guid(len = 32, radix = null, firstU = true) {
  const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')
  const uuid = []
  radix = radix || chars.length

  if (len) {
    // 如果指定uuid长度,只是取随机的字符,0|x为位运算,能去掉x的小数位,返回整数位
    for (let i = 0; i < len; i++) uuid[i] = chars[0 | (Math.random() * radix)]
  } else {
    let r
    // rfc4122标准要求返回的uuid中,某些位为固定的字符
    uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'
    uuid[14] = '4'

    for (let i = 0; i < 36; i++) {
      if (!uuid[i]) {
        r = 0 | (Math.random() * 16)
        uuid[i] = chars[i === 19 ? (r & 0x3) | 0x8 : r]
      }
    }
  }

  // 移除第一个字符，并用u替代，因为第一个字符为数值时，该 guid 不能用作 id 或者 class
  if (firstU) {
    uuid.shift()
    return 'u' + uuid.join('')
  } else {
    return uuid.join('')
  }
}
