/** @format */

import router from "./router";
import { ElMessage } 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 {getConfigKey} from "@/api/system/config";

NProgress.configure({ showSpinner: false });

const whiteList = ["/login", "/register"];

router.beforeEach((to, from, next) => {
  NProgress.start();
  if (to.path == "/iWebOfficeConsle") {
    next();
  }
  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) {
        isRelogin.show = true;
        // 判断当前用户是否已拉取完user_info信息
        useUserStore()
          .getInfo()
          .then(async (res) => {
              // 修改密码时间
              let { msg: updatePasswordDays } = await getConfigKey('updatePasswordDays')
              let { msg: forcePasswordModification } = await getConfigKey('forcePasswordModification')
              if ( res.user.admin != true ){
                  // 是否需要修改密码
                  if ( res.user.updatePasswordTime == null ) {
                      next({name: "Profile", query: {msg: '密码长时间未修改，请先修改密码!'}});
                      //是否需要强制修改密码
                      if (forcePasswordModification == 'true') { return }
                  }

                  // 计算时差
                  let timeDifference = getDaysBetween(res.user.updatePasswordTime, new Date())
                  if (timeDifference > updatePasswordDays) {
                      next({name: "Profile", query: {msg: '密码长时间未修改，请先修改密码!'}});
                        //是否需要强制修改密码
                      if (forcePasswordModification == 'true') { return }
                  }

              }

              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) => {
            useUserStore()
              .logOut()
              .then(() => {
                ElMessage.error(err);
                next({ path: "/" });
              });
          });
      } else {
        next();
      }
    }
  } else {
    // 没有token
    if (whiteList.indexOf(to.path) !== -1) {
      // 在免登录白名单，直接进入
      next();
    } else {
      next(`/login?redirect=${to.fullPath}`); // 否则全部重定向到登录页
      NProgress.done();
    }
  }
});

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

function  getDaysBetween(date1,date2){
    var  startDate = Date.parse(date1);
    var  endDate = Date.parse(date2);
    if (startDate>endDate){
        return 0;
    }
    if (startDate==endDate){
        return 1;
    }
    var days=(endDate - startDate)/(1*24*60*60*1000);
    return  days;
}
