// 前端 roles 控制菜单权限 通过登录后的角色对菜单就行过滤处理
// 如果需要前端 roles 控制菜单权限 请使用此文件代码替换 permission.ts 的内容

import { defineStore } from 'pinia';
import { RouteRecordRaw } from 'vue-router';
import router, { allRoutes } from '@/router';
import { store } from '@/store';

// 定义一个函数，用于过滤路由，根据角色权限来决定哪些路由应该被访问
function filterPermissionsRouters(routes: Array<RouteRecordRaw>, roles: Array<unknown>) {
  const res: Array<RouteRecordRaw> = []; // 存储可访问的路由
  const removeRoutes: Array<RouteRecordRaw> = []; // 存储需要移除的路由
  routes.forEach((route) => {
    const children: Array<RouteRecordRaw> = []; // 存储当前路由的子路由
    route.children?.forEach((childRouter) => {
      const roleCode = childRouter.meta?.roleCode || childRouter.name; // 获取角色代码，如果没有则使用路由名称
      if (roles.indexOf(roleCode) !== -1) {
        children.push(childRouter); // 如果角色代码在角色列表中，添加到子路由
      } else {
        removeRoutes.push(childRouter); // 否则，添加到需要移除的路由列表
      }
    });
    if (children.length > 0) {
      route.children = children; // 更新当前路由的子路由
      res.push(route); // 添加到可访问的路由列表
    }
  });
  return { accessedRouters: res, removeRoutes }; // 返回可访问的路由和需要移除的路由
}

// 定义一个Pinia store，用于管理权限相关的状态和操作
export const usePermissionStore = defineStore('permission', {
  state: () => ({
    whiteListRouters: ['/login'], // 白名单路由，这些路由不需要权限验证
    routers: [], // 存储可访问的路由
    removeRoutes: [], // 存储需要移除的路由
  }),
  actions: {
    // 初始化路由，根据角色权限来过滤路由
    async initRoutes(roles: Array<unknown>) {
      let accessedRouters = [];
      let removeRoutes: Array<RouteRecordRaw> = [];
      // 如果角色列表包含'all'，则所有路由都可访问
      if (roles.includes('all')) {
        accessedRouters = allRoutes;
      } else {
        // 否则，使用filterPermissionsRouters函数来过滤路由
        const res = filterPermissionsRouters(allRoutes, roles);
        accessedRouters = res.accessedRouters;
        removeRoutes = res.removeRoutes;
      }
      // 更新store中的路由列表
      this.routers = accessedRouters;
      this.removeRoutes = removeRoutes;
      // 从路由器中移除不需要的路由
      removeRoutes.forEach((item: RouteRecordRaw) => {
        if (router.hasRoute(item.name)) {
          router.removeRoute(item.name);
        }
      });
    },
    // 恢复移除的路由
    async restore() {
      this.removeRoutes.forEach((item: RouteRecordRaw) => {
        router.addRoute(item);
      });
    },
  },
});

// 导出一个函数，用于获取PermissionStore的实例
export function getPermissionStore() {
  return usePermissionStore(store);
}
