import type { Menu } from '/@/router/types';

import type { Ref } from 'vue';

import { watch, unref, ref, computed } from 'vue';

import { useRouter } from 'vue-router';

import { MenuSplitTyeEnum } from '/@/enums/menuEnum';

import { useThrottleFn } from '@vueuse/core';

import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';

import { getChildrenMenus, getCurrentParentPath, getMenus, getShallowMenus } from '/@/router/menus';

import { usePermissionStore } from '/@/store/modules/permission';

import { useAppInject } from '/@/hooks/web/useAppInject';



export function useSplitMenu(splitType: Ref<MenuSplitTyeEnum>) {

  // Menu array

  const menusRef = ref<Menu[]>([]);

  const { currentRoute } = useRouter();

  const { getIsMobile } = useAppInject();

  const permissionStore = usePermissionStore();

  const { setMenuSetting, getIsHorizontal, getSplit } = useMenuSetting();



  const throttleHandleSplitLeftMenu = useThrottleFn(handleSplitLeftMenu, 50);



  const splitNotLeft = computed(() => unref(splitType) !== MenuSplitTyeEnum.LEFT && !unref(getIsHorizontal));



  const getSplitLeft = computed(() => !unref(getSplit) || unref(splitType) !== MenuSplitTyeEnum.LEFT);



  const getSpiltTop = computed(() => unref(splitType) === MenuSplitTyeEnum.TOP);



  const normalType = computed(() => {

    return unref(splitType) === MenuSplitTyeEnum.NONE || !unref(getSplit);

  });



  watch(

    [() => unref(currentRoute).path, () => unref(splitType)],

    async ([path]: [string, MenuSplitTyeEnum]) => {

      if (unref(splitNotLeft) || unref(getIsMobile)) return;



      const { meta } = unref(currentRoute);

      const currentActiveMenu = meta.currentActiveMenu as string;

      let parentPath = await getCurrentParentPath(path);

      if (!parentPath) {

        parentPath = await getCurrentParentPath(currentActiveMenu);

      }

      parentPath && throttleHandleSplitLeftMenu(parentPath);

    },

    {

      immediate: true,

    }

  );



  // Menu changes

  watch(

    [() => permissionStore.getLastBuildMenuTime, () => permissionStore.getBackMenuList],

    () => {

      genMenus();

    },

    {

      immediate: true,

    }

  );



  // split Menu changes

  watch(

    () => getSplit.value,

    () => {

      // update-begin--author:liaozhiyang---date:20240919---for:【issues/7209】顶部左侧组合菜单关闭之后左侧导航没还原

      // if (unref(splitNotLeft)) return;

      // update-end--author:liaozhiyang---date:20240919---for:【issues/7209】顶部左侧组合菜单关闭之后左侧导航没还原

      genMenus();

    }

  );



  // Handle left menu split

  async function handleSplitLeftMenu(parentPath: string) {

    if (unref(getSplitLeft) || unref(getIsMobile)) return;



    // spilt mode left

    const children = await getChildrenMenus(parentPath);



    if (!children || !children.length) {

      setMenuSetting({ hidden: true });

      menusRef.value = [];

      return;

    }



    setMenuSetting({ hidden: false });

    menusRef.value = children;

  }



  // get menus

  async function genMenus() {

    // normal mode

    if (unref(normalType) || unref(getIsMobile)) {

      menusRef.value = await getMenus();

      return;

    }



    // split-top

    if (unref(getSpiltTop)) {

      const shallowMenus = await getShallowMenus();



      menusRef.value = shallowMenus;

      return;

    }

  }



  return { menusRef };

}