import router from './router'
import { ElMessage,ElMessageBox } from 'element-plus'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { getToken } from '@/utils/auth'
import { isHttp } from '@/utils/validate'
import { isRelogin } from '@/utils/request'
import useUserStore from '@/store/modules/user'
import useSettingsStore from '@/store/modules/settings'
import usePermissionStore from '@/store/modules/permission'
import { getQueryObject } from '@/utils'

NProgress.configure({ showSpinner: false });

const whiteList = ['/login', '/register','/demo/table'];
let num = 0;
const handle = (to,next) => {
  isRelogin.show = true
  // 判断当前用户是否已拉取完user_info信息
  useUserStore().getInfo().then(() => {
    isRelogin.show = false
    usePermissionStore().generateRoutes().then(accessRoutes => {
      // 根据roles权限生成可访问的路由表
      accessRoutes.forEach(route => {
        if (!isHttp(route.path)) {
          router.addRoute(route) // 动态添加可访问路由表
        }
      })
      next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
    })
  }).catch(err => {
    ElMessageBox.alert(err, '提示', {
      confirmButtonText: '确定',
      callback: () => {
        useUserStore().logOut().then(() => {
          // ElMessage.error(err)
          // next({ path: '/' })
        })
      }
    })
    
  })
}

router.beforeEach((to, from, next) => {
  num++
  NProgress.start()
  let params = getQueryObject();
  const ticket = params.ticket;
  const ssoToken = params.ssoToken;
  if((ticket || ssoToken) && num === 1){
    let data = {}
    const url = ticket ? '/sso/doLoginByTicket' : '/sso/doLoginByToken'
    if(ticket) {
      data.ticket = ticket
    }
    if(ssoToken) {
      data.token = ssoToken
    }
    // console.log('开始');
    useUserStore().getTokenHandle({url:url,data:data})
    .then(() => {
      handle(to,next)
    }).catch(err =>{
      let msg = '未知错误，请联系管理员！'
      if(err && err.msg) {
        msg = err.msg
      }
      ElMessageBox.alert(msg, '提示', {
        confirmButtonText: '确定',
        callback: () => {
          store.dispatch('LogOut').then(() => {})
        }
      });
    })
  }else if(getToken()) {
    to.meta.title && useSettingsStore().setTitle(to.meta.title)
    /* has token*/
    // if (to.path === '/login') {
    //   next({ path: '/' })
    //   NProgress.done()
    // } else {
      if (useUserStore().roles.length === 0) {
        handle(to,next)
      } else {
        next()
      }
    // }
  }else{
    const redirect = location.origin
    location.href = `${import.meta.env.VITE_APP_LOGIN_URL}?&redirect=${encodeURIComponent(redirect)}`
  }


  // if (getToken()) {
  //   to.meta.title && useSettingsStore().setTitle(to.meta.title)
  //   /* has token*/
  //   // if (to.path === '/login') {
  //   //   next({ path: '/' })
  //   //   NProgress.done()
  //   // } else {
  //     if (useUserStore().roles.length === 0) {
  //       handle(to,next)
  //     } else {
  //       next()
  //     }
  //   // }
  // } else {
  //   let params = getQueryObject();
  //   const ticket = params.ticket;
  //   const ssoToken = params.ssoToken;
  //   if(ticket || ssoToken){
  //     let data = {}
  //     const url = ticket ? '/sso/doLoginByTicket' : '/sso/doLoginByToken'
  //     if(ticket) {
  //       data.ticket = ticket
  //     }
  //     if(ssoToken) {
  //       data.token = ssoToken
  //     }
  //     // console.log('开始');
  //     useUserStore().getTokenHandle({url:url,data:data})
  //     .then(() => {
  //       handle(to,next)
  //     }).catch(err =>{
  //       let msg = '未知错误，请联系管理员！'
  //       if(err && err.msg) {
  //         msg = err.msg
  //       }
  //       ElMessageBox.alert(msg, '提示', {
  //         confirmButtonText: '确定',
  //         callback: () => {
  //           store.dispatch('LogOut').then(() => {})
  //         }
  //       });
  //     })
  //   }else{
  //     const redirect = location.origin
  //     location.href = `${import.meta.env.VITE_APP_LOGIN_URL}?&redirect=${encodeURIComponent(redirect)}`
  //   }
    

    // 没有token
    // if (whiteList.indexOf(to.path) > -1) {
    //   // 在免登录白名单，直接进入
    //   next()
    // } else {
    //   next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页
    //   NProgress.done()
    // }
  // }
})

router.afterEach(() => {
  NProgress.done()
})
