import { createRouter, createWebHistory } from "vue-router";
import routes from "./constantRoutes";
import NProgress from "nprogress";
import "nprogress/nprogress.css";
import { getToken,removeToken } from "@/utils/auth";
import userStore from "@/stores/user";
import permissionStore from "@/stores/permission";
import appStore from "@/stores/app";
import { ElMessage } from "element-plus";

/**
 * Note: 路由配置项
 *
 * hidden: true                     // 当设置 true 的时候该路由不会再侧边栏出现 如401，login等页面，或者如一些编辑页面/edit/1
 * alwaysShow: true                 // 当你一个路由下面的 children 声明的路由大于1个时，自动会变成嵌套的模式--如组件页面
 *                                  // 只有一个时，会将那个子路由当做根路由显示在侧边栏--如引导页面
 *                                  // 若你想不管路由下面的 children 声明的个数都显示你的根路由
 *                                  // 你可以设置 alwaysShow: true，这样它就会忽略之前定义的规则，一直显示根路由
 * redirect: noRedirect             // 当设置 noRedirect 的时候该路由在面包屑导航中不可被点击
 * name:'router-name'               // 设定路由的名字，一定要填写不然使用<keep-alive>时会出现各种问题
 * query: '{"id": 1, "name": "ry"}' // 访问路由的默认传递参数
 * roles: ['admin', 'common']       // 访问路由的角色权限
 * permissions: ['a:a:a', 'b:b:b']  // 访问路由的菜单权限
 * meta : {
    noCache: true                   // 如果设置为true，则不会被 <keep-alive> 缓存(默认 false)
    title: 'title'                  // 设置该路由在侧边栏和面包屑中展示的名字
    icon: 'svg-name'                // 设置该路由的图标，对应路径src/assets/icons/svg
    breadcrumb: false               // 如果设置为false，则不会在breadcrumb面包屑中显示
    activeMenu: '/system/user'      // 当路由设置了该属性，则会高亮相对应的侧边栏。
  }
 */
const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: routes,
});

//刷新后，重新加载缓存中的动态路由
// addCacheRouter(router);

// 是否显示重新登录
export const isRelogin = { show: false };
const whiteList = ["/login", "/register"];

NProgress.configure({ showSpinner: false });

let init = true

router.beforeEach((to, from, next) => {
  NProgress.start();
  if(to.path === "/login"){
    appStore().setloginPage(true)
  }else{
    appStore().setloginPage(false)
  }
  if (getToken()) {
    /* has token*/
    if (to.path === "/login") {
      next({ path: "/" });
      NProgress.done();
    } else {
      const uStore = userStore();
      //setInfor
        if(appStore().isInit){
          isRelogin.show = true;
          const pStore = permissionStore();
          pStore.GenerateRoutes().then(() => {
            isRelogin.show = false;
            appStore().setInit(false)
            //init = false
            next({ ...to, replace: true }); // hack方法 确保addRoutes已完成
          }).catch(err => {
              //init = true
              appStore().setInit(true)
              if(err == 'S0405'){
                removeToken()
                next({ path: "/login" })
              }
              // uStore.LogOut().then(() => {
              //   //ElMessage.error(err);
              //   next({ path: "/login" });
              // })
          })
        }else{
          next()
        }
        

      // if (uStore.roles.length === 0) {
      //   isRelogin.show = true;
      //   const pStore = permissionStore();
      //   pStore.GenerateRoutes().then(() => {
      //     isRelogin.show = false;
      //     next({ ...to, replace: true }); // hack方法 确保addRoutes已完成
      //   }).catch((err) => {
      //       uStore.LogOut().then(() => {
      //         ElMessage.error(err);
      //         next({ path: "/login" });
      //       })
      //   })
      //   // isRelogin.show = true;
      //   // // 判断当前用户是否已拉取完user_info信息
      //   // uStore
      //   //   .GetInfo()
      //   //   .then(() => {
      //   //     isRelogin.show = false;
      //   //     const pStore = permissionStore();
      //   //     pStore.GenerateRoutes().then(() => {
      //   //       next({ ...to, replace: true }); // hack方法 确保addRoutes已完成
      //   //     });
      //   //   })
      //   //   .catch((err) => {
      //   //     uStore.LogOut().then(() => {
      //   //       ElMessage.error(err);
      //   //       next({ path: "/login" });
      //   //     });
      //   //   });
      // } else {
      //   next();
      // }
    }
  } else {
    // 没有token
    if (whiteList.indexOf(to.path) !== -1) {
      // 在免登录白名单，直接进入
      next();
    } else {
      next(`/login?redirect=${to.fullPath}`); // 否则全部重定向到登录页
      NProgress.done();
    }
  }
});

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

export default router;
