// 获取客户端操作系统信息
export const getUserOsInfo = function () {
  const userAgent = navigator.userAgent;
  if (userAgent.indexOf("Windows NT 10.0") !== -1) return "Windows 10";
  if (userAgent.indexOf("Windows NT 6.2") !== -1) return "Windows 8";
  if (userAgent.indexOf("Windows NT 6.1") !== -1) return "Windows 7";
  if (userAgent.indexOf("Windows NT 6.0") !== -1) return "Windows Vista";
  if (userAgent.indexOf("Windows NT 5.1") !== -1) return "Windows XP";
  if (userAgent.indexOf("Windows NT 5.0") !== -1) return "Windows 2000";
  if (userAgent.indexOf("Mac") !== -1) return "Mac/iOS";
  if (userAgent.indexOf("X11") !== -1) return "UNIX";
  if (userAgent.indexOf("Linux") !== -1) return "Linux";
  return "Other";
}
// 获取浏览器类型
export const _mime = function (option, value) {
  var mimeTypes = navigator.mimeTypes;
  for (var mt in mimeTypes) {
      if (mimeTypes[mt][option] == value) {
          return true;
      }
  }
  return false;
}
export const getBrowserType = function () {
  let ua = navigator.userAgent.toLocaleLowerCase()
  let browserType = null
  if (ua.match(/msie/) != null || ua.match(/trident/) != null) {
    browserType = 'IE'
  } else if (ua.match(/firefox/) != null) {
    browserType = 'firefox'
  } else if (ua.match(/ucbrowser/) != null) {
    browserType = 'UC'
  } else if (ua.match(/opera/) != null || ua.match(/opr/) != null) {
    browserType = 'opera'
  } else if (ua.match(/bidubrowser/) != null) {
    browserType = 'baidu'
  } else if (ua.match(/metasr/) != null) {
    browserType = 'sougou'
  } else if (ua.match(/tencenttraveler/) != null || ua.match(/qqbrowse/) != null) {
    browserType = 'QQ'
  } else if (ua.match(/maxthon/) != null) {
    browserType = 'maxthon'
  } else if (ua.match(/chrome/) != null) {
    var is360 = _mime('type', 'application/vnd.chromium.remoting-viewer')
    if (is360) {
      browserType = '360'
    } else {
      browserType = 'chrome'
    }
  } else if (ua.match(/safari/) != null) {
    browserType = 'Safari'
  } else {
    browserType = 'others'
  }
  return browserType
}

export function isMobileDevice() {
    // 方法1：通过userAgent检测
    const userAgent = navigator.userAgent || navigator.vendor || window.opera;
    const mobileRegex = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i;
    
    // 方法2：通过屏幕宽度检测（通常移动端宽度小于768px）
    const isSmallScreen = window.innerWidth < 768;
    
    // 综合判断
    return mobileRegex.test(userAgent) || isSmallScreen;
}

export function timeFix () {
  const time = new Date()
  const hour = time.getHours()
  return hour < 9 ? '早上好' : hour <= 11 ? '上午好' : hour <= 13 ? '中午好' : hour < 20 ? '下午好' : '晚上好'
}

export function welcome () {
  const arr = ['休息一会儿吧', '准备吃什么呢?', '要不要打一把 DOTA', '我猜你可能累了']
  const index = Math.floor(Math.random() * arr.length)
  return arr[index]
}

/**
 * 触发 window.resize
 */
export function triggerWindowResizeEvent () {
  const event = document.createEvent('HTMLEvents')
  event.initEvent('resize', true, true)
  event.eventType = 'message'
  window.dispatchEvent(event)
}

export function handleScrollHeader (callback) {
  let timer = 0

  let beforeScrollTop = window.pageYOffset
  callback = callback || function () {}
  window.addEventListener(
    'scroll',
    event => {
      clearTimeout(timer)
      timer = setTimeout(() => {
        let direction = 'up'
        const afterScrollTop = window.pageYOffset
        const delta = afterScrollTop - beforeScrollTop
        if (delta === 0) {
          return false
        }
        direction = delta > 0 ? 'down' : 'up'
        callback(direction)
        beforeScrollTop = afterScrollTop
      }, 50)
    },
    false
  )
}

/**
 * Remove loading animate
 * @param id parent element id or class
 * @param timeout
 */
export function removeLoadingAnimate (id = '', timeout = 1500) {
  if (id === '') {
    return
  }
  setTimeout(() => {
    document.body.removeChild(document.getElementById(id))
  }, timeout)
}

/**
 * @param {String|Number} value 要验证的字符串或数值
 * @param {*} validList 用来验证的列表
 */
export function oneOf (value, validList) {
  for (let i = 0; i < validList.length; i++) {
    if (value === validList[i]) {
      return true
    }
  }
  return false
}

/**
 * @param {Function} fn 防抖函数
 * @param {Number} delay 延迟时间
 */
export function debounce(fn, delay) {
  var timer;
  return function () {
    var context = this;
    var args = arguments;
    clearTimeout(timer);
    timer = setTimeout(function () {
      fn.apply(context, args);
    }, delay);
  };
}
/**
 * @param {date} time 需要转换的时间
 * @param {String} fmt 需要转换的格式 如 yyyy-MM-dd、yyyy-MM-dd HH:mm:ss
 */
export function formatTime(time, fmt) {
  if (!time) return '';
  else {
    const date = new Date(time);
    const o = {
      'M+': date.getMonth() + 1,
      'd+': date.getDate(),
      'H+': date.getHours(),
      'm+': date.getMinutes(),
      's+': date.getSeconds(),
      'q+': Math.floor((date.getMonth() + 3) / 3),
      S: date.getMilliseconds(),
    };
    if (/(y+)/.test(fmt))
      fmt = fmt.replace(
        RegExp.$1,
        (date.getFullYear() + '').substr(4 - RegExp.$1.length)
      );
    for (const k in o) {
      if (new RegExp('(' + k + ')').test(fmt)) {
        fmt = fmt.replace(
          RegExp.$1,
          RegExp.$1.length === 1
            ? o[k]
            : ('00' + o[k]).substr(('' + o[k]).length)
        );
      }
    }
    return fmt;
  }
}

// 千分位分隔符
export function formatThousands (number) {
  if(!number){return 0}
  const arr = number.toString().split('.')
  const numbers = arr[0].split('').reverse()
  const segs = []

  while (numbers.length) segs.push(numbers.splice(0, 3).join(''))

  return segs.join(',').split('').reverse().join('') + (arr.length>1 ? ("."+arr[1]) : '')
}
/**
 * 数组转树形结构
 * @param {array} list 被转换的数组
 * @param {number|string} root 根节点（最外层节点）的 id
 * @return array
 */
export function arrayToTree(list, root) {
  const result = [] // 用于存放结果
  const map = {} // 用于存放 list 下的节点

  // 1. 遍历 list，将 list 下的所有节点以 id 作为索引存入 map
  for (const item of list) {
    map[item.id] = { ...item } // 浅拷贝
  }

  // 2. 再次遍历，将根节点放入最外层，子节点放入父节点
  for (const item of list) {
    // 3. 获取节点的 id 和 父 id
    const { id, parentId } = item // ES6 解构赋值
    // 4. 如果是根节点，存入 result
    if (item.parentId == root) {
      result.push(map[id])
    } else {
      // 5. 反之，存入到父节点
      map[parentId].children
        ? map[parentId].children.push(map[id])
        : (map[parentId].children = [map[id]])
    }
  }

  // 将结果返回
  return result
}
// 树查找
export function treeFind (tree, func) {
  for (const data of tree) {
    if (func(data)) return data
    if (data.children) {
      const res = treeFind(data.children, func)
      if (res) return res
    }
  }
  return null
}
// 是否有价格权限
export function hasPriceAuth(authNode, priceOptions, userAuthCode){
  const codes = []
  const ret = []
  // 过滤当前节点下的非价格权限菜单
  authNode.map(item=>{
    const a = item.code.split('_')
    const hasCode = priceOptions.find(k => k.value == a[a.length-1])
    const hasRoles = userAuthCode.includes(item.code)
    // 获取当前用户的角色拥有的价格权限
    if(hasCode && hasRoles){
      codes.push(a[a.length-1])
    }
  })
  // console.log(codes)
  // 根据拥有的价格权限生成数组标记[1,0,1,0,0]，每一位对应一个价格权限
  // 有权限标记1，否则标记0
  priceOptions.map(item => {
    ret.push(codes.includes(item.value)?1:0)
  })
  // console.log(ret)
  return ret
}
// 获取接口对应的价格权限code
export function getAuthPriceCode (config, router, store) {
  // 通过路由打开的页面的权限code
  const permission = router.history.current.meta.permission 
  // 手动指定的权限code，如打开的弹框页面或导出、打印
  // 手动指定的权限在使用完后需要清空，如在关闭弹框或导出、打印接口调用完成后清空
  const curActionPermission = store.state.app.curActionPermission
  console.log(curActionPermission)
  // 价格权限的所有选项，销售价、成本价、省、市、特约价
  const priceOptions = store.state.app.priceAuthOptions
  // 最终获取的权限code，手动指定的优先级高于路由打开的页面权限code
  const authCode = curActionPermission || permission
  // 当前角色的分配的价格权限，这里过滤非价格权限code
  const roles = store.state.user.roles
  const userAuthCode = roles.permissionList.filter(item => {
    const a = item.split('_')
    return priceOptions.find(k => k.value == a[a.length-1])
  })

  // 如果有权限code
  if(authCode){
    // 当前正在调用的接口url
    const url = config.url
    // 所有的权限菜单数据
    const authTree = store.state.app.authMenusList
    
    // 从所有的权限菜单中查找当前权限code对应的权限菜单数据
    const authNode = treeFind(authTree,(item)=>item.code == authCode)
    // console.log(authNode,url.replace(/\//g,'_'))
    if(!authNode){return []}
    if(!authNode.permission){return []}
    // 从找到的对应权限菜单数据中判断当前调用接口的url是否存在，这里和权限菜单中的后台权限code比较
    const hasReqUrl = authNode.permission.split(',').find(item => url.replace(/\//g,'_').indexOf(item)>=0)
    // console.log(hasReqUrl)
    // 如果存在则返回一个如 [1,0,1,0,0] 的格式的价格权限字符串给后台接口
    if(hasReqUrl&&authNode.children&&authNode.children.length){
      return hasPriceAuth(authNode.children,priceOptions,userAuthCode)
    }
    return []
  }
  return []
}