import router, { resetRouter } from './router'
import store from './store'
import { Message } from 'element-ui'
import { hasLogin, initGoPage } from '@/utils/auth'
import { createHash } from '@/utils/tools'
import getPageTitle from '@/utils/get-page-title'

// 不用拦截的路由
const whiteList = ['/login', '/auth-redirect']
// 需要添加跳转限制的路由，防止数据冲突
const toSupplier = ['/supplier/list', '/supplier']

// 重置登录信息和路由信息及标签页信息
const resetState = () => {
  store.dispatch('user/logout')
  store.dispatch('resetState')
}

// 是否开启会话 条件：当前用户为管理员 && socket对象已创建成功
const isOpenSocket = () => {
  return store.getters.openSoket && !store.getters.socketState && store.getters.userIdentity === 1
}

router.beforeEach(async(to, from, next) => {
  // 设置页面名称
  document.title = getPageTitle(to.meta.title)
  const proxyInfo = store.getters.proxyInfo
  const isChangeProxy = store.getters.isChangeProxy
  // 如果登录过
  if (hasLogin()) {
    /**
     * 满足要求则关闭所有标签，防止代理数据冲突
     * 条件：1、sotre中存有代理数据 即 proxyInfo !== null
     *      2、即将跳转的页面为 /supplier/list 或者 /supplier
     */
    if (toSupplier.includes(to.path) && store.getters.proxyInfo !== null) {
      store.dispatch('tagsView/delAllProxyView')
      store.commit('user/SET_PROXY_INFO', null)
    }
    // 是否需要初始化路由
    const hasInitRouter = store.getters.initRouter
    // 在登录状态下访问login页面，直接跳转到首页
    if (to.path === '/login' && hasInitRouter) {
      next(initGoPage())
    } else {
      // 加载国家列表
      store.dispatch('app/setCountry')
      // 如果路由已经初始化则不需要再次初始化路由
      if (hasInitRouter && !isChangeProxy) {
        next()
      } else {
        try {
          // 是否需要登录代理数据
          if (proxyInfo !== null) {
            store.dispatch('user/proxyLogin', proxyInfo) // 代理登录 模拟
          }
          resetRouter()
          console.log(router)
          store.commit('proxy/CHANGE_PROXY_STATE', false)
          store.dispatch('resetState')
          // 设置路由的初始化状态
          store.commit('permission/RESET_STATE')
          store.commit('permission/SET_INITROUTER', true)
          const accessRoutes = await store.dispatch('permission/generateRoutes', store.getters.roles)
          // 设置路由
          router.addRoutes(accessRoutes)
          // 初始化会话信息
          if (isOpenSocket()) {
            store.dispatch('webSocket/initMessage')
          }
          // 放行
          next({ ...to, replace: true })
        } catch (error) {
          Message.error(error || '未知错误，请重新登录')
          // 重置登录信息和路由信息及标签页信息
          resetState()
          next(`/login?redirect=${to.path}`)
        }
      }
    }
  } else {
    // 重置登录信息和路由信息及标签页信息
    resetState()
    // token不存在并且访问的路由非拦截路由
    if (whiteList.indexOf(to.path) !== -1) {
      // 允许访问
      next()
    } else {
      // 跳转到登录页面
      Message({ message: '登录失效，请重新登录！', duration: 1500 })
      next(`/login?cm=${createHash(6)}`)
      return
    }
  }
})
