// service.js
/** 请求超时时间 */
export const REQUEST_TIMEOUT = 60 * 1000

/** 错误信息的显示时间 */
export const ERROR_MSG_DURATION = 3 * 1000

/** 默认的请求错误code */
export const DEFAULT_REQUEST_ERROR_CODE = 'DEFAULT'

/** 默认的请求错误文本 */
export const DEFAULT_REQUEST_ERROR_MSG = '请求错误~'

/** 请求超时的错误code(为固定值:ECONNABORTED) */
export const REQUEST_TIMEOUT_CODE = 'ECONNABORTED'

/** 请求超时的错误文本 */
export const REQUEST_TIMEOUT_MSG = '请求超时~'

/** 网络不可用的code */
export const NETWORK_ERROR_CODE = 'NETWORK_ERROR'

/** 网络不可用的错误文本 */
export const NETWORK_ERROR_MSG = '网络不可用~'

/** 请求不成功各种状态的错误 */
export const ERROR_STATUS = {
  400: '400: 请求出现语法错误~',
  401: '401: 用户未授权~',
  403: '403: 服务器拒绝访问~',
  404: '404: 请求的资源不存在~',
  405: '405: 请求方法未允许~',
  408: '408: 网络请求超时~',
  500: '500: 服务器内部错误~',
  501: '501: 服务器未实现请求功能~',
  502: '502: 错误网关~',
  503: '503: 服务不可用~',
  504: '504: 网关超时~',
  505: '505: http版本不支持该请求~',
  [DEFAULT_REQUEST_ERROR_CODE]: DEFAULT_REQUEST_ERROR_MSG
}

/** 不弹出错误信息的code */
export const NO_ERROR_MSG_CODE = []
// file.js
export async function getBase64FromImageURL (url) {
  return new Promise(resolve => {
    let canvas = document.createElement('canvas')
    const ctx = canvas.getContext('2d')
    const img = new Image()
    img.crossOrigin = 'Anonymous'
    img.onload = function () {
      canvas.height = img.height
      canvas.width = img.width
      ctx.drawImage(img, 0, 0)
      const base64URL = canvas.toDataURL('image/png')
      resolve(base64URL)
      canvas = null
    }
    img.src = url
  })
}

export function getFileFromBase64 (base64URL, filename) {
  const arr = base64URL.split(',')
  const mime = arr[0].match(/:(.*?);/)[1]
  const bstr = atob(arr[1])
  let n = bstr.length
  const u8arr = new Uint8Array(n)
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n)
  }
  return new File([u8arr], filename, { type: mime })
}
// format.js
import dayjs from 'dayjs'
export function arrToObject (arr = [], key, value) {
  return arr.reduce((acc, cur, index) => {
    if (key && value) {
      acc[cur[key]] = cur[value]
    } else {
      acc[cur] = index
    }
    return acc
  }, {})
}

export function mergeTrees (trees, uniqueKey = 'id') {
  const result = {}

  function mergeNode (node, resultNode) {
    if (!resultNode.children) {
      resultNode.children = []
    }
    const existingNode = resultNode.children.find(
      child => child[uniqueKey] === node[uniqueKey]
    )

    if (existingNode) {
      node.children.forEach(child => mergeNode(child, existingNode))
    } else {
      resultNode.children.push(node)
    }
  }

  trees.forEach(tree => {
    tree.forEach(node => {
      mergeNode(node, result)
    })
  })

  return result.children
}

export function formatTime (time, str) {
  if (time === null) {
    return ''
  } else if (dayjs(time).isValid()) {
    return dayjs(time).format(str)
  } else {
    return ''
  }
}

export function convertObjectValuesToStrings (obj = {}) {
  // 创建一个新的对象来存储转换后的值
  const newObj = {}

  // 遍历对象的键值对
  for (const key in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, key)) {
      const value = obj[key]
      const valueType = typeof value

      // 检查值的类型并进行相应的转换
      if (valueType === 'object' && value !== null) {
        // 递归调用 convertObjectValuesToStrings 方法以处理嵌套对象
        newObj[key] = convertObjectValuesToStrings(value)
      } else {
        // 将值转换为字符串类型
        newObj[key] = String(value)
      }
    }
  }
  return newObj
}
// 防抖
export function debanceFn (callback, delay = 300) {
  let timer = null
  return function () {
    if (timer) {
      clearTimeout(timer)
    }
    timer = setTimeout(() => {
      if (callback && typeof callback === 'function') {
        callback()
      }
    }, delay)
  }
}
// validation.js
// 手机号验证方法
export function isvalidPhone (phone) {
  const reg = /^1([38][0-9]|4[014-9]|[59][0-35-9]|6[2567]|7[0-8])\d{8}$/
  return reg.test(phone)
}
// 车牌号验证方法
export function isVehicleNumber (vehicleNumber) {
  const xreg =
    /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/
  const creg =
    /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/
  if (vehicleNumber.length === 7) {
    return creg.test(vehicleNumber)
  } else if (vehicleNumber.length === 8) {
    return xreg.test(vehicleNumber)
  } else {
    return false
  }
}

// 判断的是否是JSON字符串
export function isJsonStr (str) {
  if (typeof str === 'string') {
    try {
      const obj = JSON.parse(str)
      // 等于这个条件说明就是JSON字符串 会返回true
      if (typeof obj === 'object' && obj) {
        return true
      } else {
        // 不是就返回false
        return false
      }
    } catch (e) {
      return false
    }
  }
  return false
}