import type { Router } from 'vue-router';
import { NsMessage } from '/nerv-lib/component/message';
import { authorizationService } from '/nerv-base/store/modules/authorization-service';
import { appConfigStore } from '/nerv-base/store/modules/app-config';
import { Cookies } from '/nerv-lib/util/cookie';
import { setRouteChange } from '/nerv-lib/util/routeChange';

console.log(import.meta.env.VITE_PUBLIC_PATH);

export function createPermissionGuard(router: Router, whiteNameList: string[]) {
  const authorizationStore = authorizationService();
  const appConfig = appConfigStore();
  router.beforeEach(async (to, from, next) => {
    if (!appConfig.userCustomRouterGuard) {
      setRouteChange(to);
      if (to?.query?.nervsid) {
        if (to?.query?.nervsid !== Cookies.get(`${import.meta.env.VITE_PUBLIC_PATH}-nervsid`)) {
          Cookies.set(`${import.meta.env.VITE_PUBLIC_PATH}-nervsid`, to?.query?.nervsid);
          try {
            const info = await appConfig.userInfo();
            await authorizationStore.initUserResource();
            authorizationStore.initMenuResource();
            appConfig.setUserInfo(info.data);
            info.success
              ? window.sessionStorage.setItem(
                  import.meta.env.VITE_PUBLIC_PATH,
                  JSON.stringify(info.data),
                )
              : '';
          } catch (err) {
            Cookies.remove(`${import.meta.env.VITE_PUBLIC_PATH}-nervsid`);
          }
        }
      }
      if (
        !Cookies.get(`${import.meta.env.VITE_PUBLIC_PATH}-nervsid`) &&
        to.fullPath !== '/login' &&
        to.name &&
        !whiteNameList.includes(to.name as string)
      ) {
        NsMessage.error('登录信息已过期,请重新登录!', 1);
        next({ name: 'login' });
      } else {
        //  存储用户信息
        if (to.fullPath !== '/login') {
          const initUserInfo = window.sessionStorage[import.meta.env.VITE_PUBLIC_PATH];
          if (!initUserInfo && Cookies.get(`${import.meta.env.VITE_PUBLIC_PATH}-nervsid`)) {
            try {
              const info = await appConfig.userInfo();
              info.data
                ? window.sessionStorage.setItem(
                    import.meta.env.VITE_PUBLIC_PATH,
                    JSON.stringify(info.data),
                  )
                : '';
            } catch (err) {
              Cookies.remove(`${import.meta.env.VITE_PUBLIC_PATH}-nervsid`);
            }
          } else {
            if (initUserInfo) {
              const userInfo = JSON.parse(initUserInfo);
              authorizationStore.setEnterpriseName(
                !userInfo.organizationalName ? '' : userInfo.organizationalName,
              );
            }
          }
        }

        if (to.name && !whiteNameList.includes(to.name as string)) {
          if (appConfig.enablePermissions !== undefined && appConfig.enablePermissions) {
            if (authorizationStore.getInitRouterList.length === 0) {
              await authorizationStore.initUserResource();
            }

            if (
              authorizationStore.checkPermissionRouter(
                to.meta?.bindView ? to.meta?.bindView : to.name,
              )
            ) {
              next();
            } else {
              if (to.path === '/') {
                next({ name: authorizationStore.getInitRouterList[0] });
              } else {
                //  console.log(authorizationStore.getInitRouterList);
                NsMessage.error('无该页面权限!');
                next({ name: 'error403' });
              }
            }
          } else {
            next();
          }
        } else {
          next();
        }
      }
    } else {
      await appConfig.userCustomRouterGuard(
        to,
        from,
        next,
        whiteNameList,
        authorizationStore,
        appConfig,
      );
    }
  });
}