import {hasAuthority} from '@/utils/authority-utils' // 权限判断
import {loginIgnore} from '@/router/index' // 不用登录白名单
import {checkAuthorization} from '@/utils/request' // 登录校验
import NProgress from 'nprogress' // 进度条

NProgress.configure({ showSpinner: false }) // 进度条配置 是否显示加载ico

/**
 * 进度条开始
 * @param to
 * @param form
 * @param next
 */
const progressStart = (to, from, next) => { 
  // start progress bar
  // console.log("progressStart进度条开始")
  if (!NProgress.isStarted()) { // 如果进度条没有开始
    NProgress.start() // 进度条开始
  }
  next() // 正常跳转
}

/**
 * 登录守卫
 * @param to
 * @param form
 * @param next
 * @param options
 */
const loginGuard = (to, from, next, options) => {
  // console.log("进入loginGuard登录守卫")
  const {message} = options // 获取message
  // console.log('loginIgnore.includes(to)', loginIgnore.includes(to))
  // console.log('checkAuthorization():', checkAuthorization())
  if (!loginIgnore.includes(to) && !checkAuthorization()) { // 如果不是白名单 并且 登录校验失败
    message.warning('登录已失效，请重新登录')
    next({path: '/login'}) // 跳转到登录页面
  } else {
    // console.log('进入loginGuard登录守卫next()')
    next() // 如果是白名单，正常跳转
  }
  
  
}

/**
 * 权限守卫
 * @param to
 * @param form
 * @param next
 * @param options
 */

const authorityGuard = (to, from, next, options) => {
  const {store, message} = options
  const permissions = store.getters['account/permissions']  // 获取权限数据 
  if (to.meta.authority !== undefined){
    if (!hasAuthority(to, permissions)) { // 判断是否有权限
      // 如果没有权限，跳转到403页面
      message.warning(`对不起，您无权访问页面: ${to.fullPath}，请联系管理员`)
      next({path: '/403'})
      // NProgress.done()
    } else {
      // console.log('进入authorityGuard权限守卫next()')
      next() // 如果有权限，正常跳转到你设置好的页面
    }
  }
}

/**
 * 混合导航模式下一级菜单跳转重定向
 * @param to
 * @param from
 * @param next
 * @param options
 * @returns {*}
 */
const redirectGuard = (to, from, next, options) => {
  // console.log("进入redirectGuard混合导航模式")
  const {store} = options // 获取store





  const getFirstChild = (routes) => { // 获取第一个子路由
    // console.log("routes", routes)
    const route = routes[0] // 获取第一个路由
    // console.log("获取第一个路由route:", route)
    if (!route.children || route.children.length === 0) { // 如果没有子路由，返回当前路由
      // console.log("没有子路由，返回当前路由route:", route)
      return route
    }
    return getFirstChild(route.children) // 如果有子路由，递归获取第一个子路由
  }


  
  if (store.state.setting.layout === 'mix') { // 如果是混合导航模式
    console.log("==混合导航模式==")
    const firstMenu = store.getters['setting/firstMenu'] // 获取第一个菜单
    
    // console.log("store.getters['setting/firstMenu']", store.getters['setting/firstMenu'])
    if (firstMenu.find(item => item.fullPath === to.fullPath)) { // 如果是第一个菜单列表,
      store.commit('setting/setActivatedFirst', to.fullPath) // 设置激活的第一个菜单
      const subMenu = store.getters['setting/subMenu'] // 获取第一个菜单的子菜单
      // console.log("store.getters['setting/subMenu']", store.getters['setting/subMenu'])
      if (subMenu.length > 0) { // 如果有子菜单
        const redirect = getFirstChild(subMenu) // 获取第一个子菜单
        console.log("subMenu.length", subMenu.length)
        console.log("redirect", redirect)
        return next({path: redirect.fullPath}) // 重定向到第一个子菜单
      }
    }
  }




  
  next()
}

/**
 * 进度条结束
 * @param to
 * @param form
 * @param options
 */
const progressDone = () => { // 进度条结束
  // finish progress bar
  // console.log("progressDone进度条结束")
  NProgress.done() // 进度条结束
}

// guards 是登录守卫，权限守卫，进度条守卫，重定向守卫的集合
export default {
  beforeEach: [progressStart, loginGuard, authorityGuard, redirectGuard],
  afterEach: [progressDone]
}
