/*
 * @Author: code4eat awesomedema@gmail.com
 * @Date: 2024-07-17 10:36:43
 * @LastEditors: code4eat awesomedema@gmail.com
 * @LastEditTime: 2024-07-26 17:14:07
 * @FilePath: /BudgetManaSystem/src/authWrapper.tsx
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
// src/components/AuthWrapper.tsx
import React, { useEffect, useState } from 'react';
import { history, useModel } from 'umi';
import type { IRoute } from 'umi';
import { Outlet } from '@umijs/max';

// 权限检查函数
function checkAccess(menu: IRoute[], pathname: string): boolean {
  for (const item of menu) {
    if (item.path === pathname) {
      return true;
    }
    if (item.children) {
      const hasAccess = checkAccess(item.children, pathname);
      if (hasAccess) {
        return true;
      }
    }
  }
  return false;
}

function removePrefix(input: string, prefix: string): string {
  if (input.startsWith(prefix)) {
    return input.slice(prefix.length);
  }
  return input;
}

// 权限包装组件
const AuthWrapper: React.FC = (props) => {
  const { initialState } = useModel('@@initialState');
  const [loading, setLoading] = useState(true);
  const [dataLoaded, setDataLoaded] = useState(false);

  useEffect(() => {
    if (!dataLoaded) {
      const menu = initialState?.memuData ?? [];
      if (menu.length > 0) {
        setDataLoaded(true);
        const { pathname } = history.location;
        const hasAccess = checkAccess(
          menu,
          removePrefix(pathname, '/CostAccountingSys'),
        );
        // console.log({ hasAccess, menu, pathname });
        if (!hasAccess) {
          history.push('/noAccess');
        }
        setLoading(false);
      }
    }
  }, [initialState, dataLoaded]);

  return loading ? <>loading...</> : <Outlet />;
};

export default AuthWrapper;
export { checkAccess };
