import { createBrowserRouter, Navigate, RouteObject } from 'react-router-dom';
import { Suspense, lazy } from 'react';
import Login from '../pages/Login';
import BasicLayout from '../layouts/BasicLayout';
import { getRouteComponent } from './routeMap';
import type { MenuResponse } from '@/pages/System/Menu/List/types';
import store from '../store';
import ProtectedRoute from './ProtectedRoute';
import RouteLoading from '@/components/RouteLoading';
import ErrorFallback from '@/components/ErrorFallback';
import RootRedirect from './RootRedirect';

// 错误页面
const Forbidden = lazy(() => import('@/pages/Error/403'));
const NotFound = lazy(() => import('@/pages/Error/404'));
const NoPermission = lazy(() => import('@/pages/Error/NoPermission'));

// 维护页面
const Maintenance = lazy(() => import('@/pages/Maintenance'));

// 表单设计器测试页面（写死的路由）
const FormDesignerTest = lazy(() => import('../pages/FormDesigner'));

/**
 * 根据菜单数据动态生成路由配置
 * @param menus 菜单列表
 * @returns 路由配置数组
 */
const generateRoutes = (menus: MenuResponse[]): RouteObject[] => {
  const routes: RouteObject[] = [];

  menus.forEach((menu) => {
    // ⚠️ 注意：不要跳过 hidden 的菜单，因为隐藏菜单也需要生成路由
    // 隐藏菜单只是不在侧边栏显示，但路由必须存在才能通过 navigate() 访问

    // 如果有 component 且有 path，创建路由
    if (menu.component && menu.path) {
      // 对于隐藏菜单，抑制组件未找到的警告
      const Component = getRouteComponent(menu.component, menu.hidden);
      if (Component) {
        // 移除开头的 /
        const path = menu.path.replace(/^\//, '');

        routes.push({
          path,
          element: (
            <ProtectedRoute requiresAuth={true}>
              <Suspense fallback={<RouteLoading />}>
                <Component />
              </Suspense>
            </ProtectedRoute>
          ),
        });
      }
      // 警告已在 getRouteComponent 内部处理
    }

    // 递归处理子菜单
    if (menu.children && menu.children.length > 0) {
      const childRoutes = generateRoutes(menu.children);
      routes.push(...childRoutes);
    }
  });

  return routes;
};

/**
 * 创建路由配置
 * 从 Redux store 中获取菜单数据，动态生成路由
 */
export const createDynamicRouter = () => {
  const state = store.getState();
  const menus = state.user.menus || [];
  const hasMenus = menus.length > 0;

  // 动态生成路由
  const dynamicRoutes = generateRoutes(menus);

  return createBrowserRouter([
    {
      path: '/login',
      element: <Login />,
    },
    // 维护页面（独立路由，无需布局和权限验证）
    {
      path: '/maintenance',
      element: (
        <Suspense fallback={<RouteLoading />}>
          <Maintenance />
        </Suspense>
      ),
    },
    {
      path: '/',
      element: <BasicLayout />,
      errorElement: <ErrorFallback />,
      children: [
        {
          path: '',
          element: <RootRedirect />,
        },
        // 写死的测试路由：表单设计器测试页面
        {
          path: 'workflow/form-designer',
          element: (
            <ProtectedRoute requiresAuth={true}>
              <Suspense fallback={<RouteLoading />}>
                <FormDesignerTest />
              </Suspense>
            </ProtectedRoute>
          ),
        },
        // 动态生成的路由
        ...dynamicRoutes,
        // 无权限欢迎页（用户没有任何菜单权限时显示）
        {
          path: 'no-permission',
          element: (
            <ProtectedRoute requiresAuth={true}>
              <Suspense fallback={<RouteLoading />}>
                <NoPermission />
              </Suspense>
            </ProtectedRoute>
          ),
        },
        // 403 无权限页面
        {
          path: '403',
          element: (
            <Suspense fallback={<RouteLoading />}>
              <Forbidden />
            </Suspense>
          ),
        },
        // 404 页面不存在
        {
          path: '404',
          element: (
            <Suspense fallback={<RouteLoading />}>
              <NotFound />
            </Suspense>
          ),
        },
        // 其他未匹配路由重定向到 404
        {
          path: '*',
          element: <Navigate to="/404" replace />,
        },
      ],
    },
  ]);
};

// 导出路由实例（初始化时创建一次）
let router = createDynamicRouter();

// 导出重新创建路由的函数
export const recreateRouter = () => {
  console.log('🔄 重新创建路由...');
  router = createDynamicRouter();
  return router;
};

export default router;
