import Vue from "vue";
import iView from "iview";
import Util from "../libs/util";
import VueRouter from "vue-router";
import { routers, otherRouter, appRouter } from "./router";

// ignore NavigationDuplicated. https://github.com/vuejs/vue-router/issues/2881
const originalPush = VueRouter.prototype.push;
VueRouter.prototype.push = function push(location, onResolve, onReject) {
  if (onResolve || onReject)
    return originalPush.call(this, location, onResolve, onReject);
  try {
    return originalPush.call(this, location).catch((err) => err);
  } catch (error) {
    console.log(error);
  }
};
// end ignore

Vue.use(VueRouter);

// 路由配置
const RouterConfig = {
  // mode: 'history',
  routes: routers,
};

export const router = new VueRouter(RouterConfig);

router.beforeEach((to, from, next) => {
  iView.LoadingBar.start();
  Util.title(to.meta.title);
  if (to.name === "locking") {
    next(false);
  } else {
    if (!localStorage.accessToken && to.name !== "login") {
      // 判断是否已经登录且前往的页面不是登录页
      next({
        name: "login",
      });
    } else if (localStorage.accessToken && to.name === "login") {
      // 判断是否已经登录且前往的是登录页
      Util.title();
      next();
    } else {
      const curRouterObj = Util.getRouterObjByName(
        [otherRouter, ...appRouter],
        to.name
      );
      if (
        curRouterObj &&
        curRouterObj.role !== undefined &&
        localStorage.role !== undefined
      ) {
        // 需要判断权限的路由
        if (curRouterObj.role === localStorage.role) {
          Util.toDefaultPage(
            [otherRouter, ...appRouter],
            to.name,
            router,
            next
          ); // 如果在地址栏输入的是一级菜单则默认打开其第一个二级菜单的页面
        } else {
          next({
            replace: true,
            name: "error-403",
          });
        }
      } else {
        // 没有配置权限的路由, 直接通过
        Util.toDefaultPage([...routers], to.name, router, next);
      }
    }
  }
});

router.afterEach((to) => {
  // Util.openNewPage(router.app, to.name, to.params, to.query);
  iView.LoadingBar.finish();
  window.scrollTo(0, 0);
});
