import { defineStore } from 'pinia';
import { RouteMenu } from '/nerv-base/router/helper/menu-helper';
import { ModuleMenu } from '/nerv-base/router/types';
import { appConfigStore } from '/nerv-base/store/modules/app-config';
import { transformRouteToMenu } from '/nerv-base/router/helper/route-helper';
import { NSAxios } from '/nerv-lib/util/http/axios';
interface RouteState {
  route: Recordable[];
  routeModule: RouteMenu[];
  routeModuleObject: Recordable;
}
export const useRouteStore = defineStore({
  id: 'route',
  state: (): RouteState => {
    return { route: [], routeModule: [], routeModuleObject: {} };
  },
  getters: {},
  actions: {
    async getRouteModule() {
      const initList = [];
      this.route.forEach((item) => {
        if (item.name !== 'root') {
          initList.push(transformRouteToMenu(item));
        }
      });
      this.dealNoChildrenMenu(initList);
      this.routeModule = initList;
      return this.routeModule;
    },
    async setRoute(route: Recordable[]) {
      this.route = route;
      await this.getRouteModule();
    },
    /**
     * 判断菜单是否是noChildrenMenu
     *
     */
    dealNoChildrenMenu(item: any) {
      item.forEach((sitem: any) => {
        if (
          Object.prototype.toString.call(sitem.menus) === '[object Array]' &&
          sitem.menus.length !== 0
        ) {
          if (sitem.menus.findIndex((x) => x.type === 'menus') === -1) {
            sitem.type = 'noChildrenMenu';
          } else {
            this.dealNoChildrenMenu(sitem.menus);
          }
        } else {
          if (sitem.route?.meta?.hideChildren) {
            sitem.type = 'noChildrenMenu';
          }
        }
      });
    },
    /**
     * 同步菜单修改到路由
     */
    syncRoute() {
      const appConfig = appConfigStore();
      const routeModuleObject: Recordable = {};
      function loop(routeModule: ModuleMenu[]) {
        for (let i = 0, j = routeModule.length; i < j; i++) {
          routeModuleObject[routeModule[i].code] = routeModule[i];
          routeModule[i].menus && loop(routeModule[i].menus);
        }
      }

      loop(this.routeModule);
      this.routeModuleObject = routeModuleObject;
      function loopRoute(routeList) {
        for (let i = 0, j = routeList.length; i < j; i++) {
          const route = routeList[i];
          !route.meta && (route.meta = {});
          if (routeModuleObject[route.name] === undefined) {
            console.error(`route ${route.name} is not in menu`);
            return;
          }
          if (!route.meta.index || route.meta.index !== routeModuleObject[route.name].sort) {
            route.meta.index = routeModuleObject[route.name].sort;
          }
          if (!route.meta.title || route.meta.title !== routeModuleObject[route.name].label) {
            route.meta.title = routeModuleObject[route.name].label;
          }
          route.children && loopRoute(route.children);
        }
      }
      loopRoute(this.route);
      this.route.sort((a, b) => {
        return a.meta?.index - b.meta?.index;
      });
      // const initPcResource = { application: {}, menus: [] };
      let initPcResource = [];

      this.routeModule.sort((a, b) => {
        return a.route?.meta?.index - b.route?.meta?.index;
      });
      const info = JSON.parse(JSON.stringify(this.routeModule));
      initRouteMouleList(info);
      function initRouteMouleList(info) {
        info.forEach((item, index) => {
          item.sort = index;
          if (item.menus) {
            initRouteMouleList(item.menus);
          }
          if (item.extend) {
            let isNull = true;
            Object.keys(item.extend).forEach((key) => {
              if (item.extend[key]) {
                isNull = false;
              }
            });
            if (isNull) {
              delete item.extend;
            }
          }
          delete item.route;
        });
      }
      // initPcResource.application = appConfig.resourceInfo?.application as object;
      initPcResource = appConfig.resourceInfo?.dealReosurceList
        ? appConfig.resourceInfo?.dealReosurceList(info)
        : info;
      new NSAxios({
        headers: {
          'Content-Type': 'application/json;charset=UTF-8',
          'QA-token': appConfig.resourceInfo?.token as string,
        },
        withCredentials: true,
        timeout: 3 * 1000,
      })
        .post(appConfig.resourceInfo?.api as string, initPcResource)
        .then((res) => {
          console.log(res);
        });
    },
  },
});