import React from 'react';
import ReactDOM from 'react-dom/client';
import { Provider } from 'react-redux';
import store from './store';
import './index.css';
import { Toaster } from '@/components/ui/toaster.tsx';
import ErrorBoundary from '@/components/ErrorBoundary';
import { getCurrentUserMenus } from '@/pages/System/Menu/List/service';
import { setMenus } from './store/userSlice';
import App from './App';
import AppSkeleton from './layouts/components/AppSkeleton';

/**
 * 应用启动流程 - 性能优化版本
 * 
 * 优化点：
 * 1. 优先使用缓存菜单，快速启动
 * 2. 减少控制台日志输出
 * 3. 使用骨架屏提升体验
 * 4. 登录后刷新页面确保路由正确
 */

const rootElement = document.getElementById('root')!;
const root = ReactDOM.createRoot(rootElement);

// 启动应用
async function bootstrap() {
  try {
    const token = localStorage.getItem('token');

    // 如果已登录，预加载菜单数据
    if (token) {
      // 检查 localStorage 中是否有缓存的菜单数据
      const cachedMenus = localStorage.getItem('menus');
      
      if (cachedMenus) {
        try {
          const menus = JSON.parse(cachedMenus);
          if (menus && menus.length > 0) {
            // ✅ 优先使用缓存，快速启动
            store.dispatch(setMenus(menus));
          } else {
            throw new Error('缓存菜单为空');
          }
        } catch (error) {
          // 缓存失败，从服务器获取
          const menuData = await getCurrentUserMenus();
          store.dispatch(setMenus(menuData));
        }
      } else {
        // 没有缓存，从服务器获取
        const menuData = await getCurrentUserMenus();
        store.dispatch(setMenus(menuData));
      }
    }

    // ✅ 渲染应用
    root.render(
      <ErrorBoundary>
        <Provider store={store}>
          <App />
          <Toaster />
        </Provider>
      </ErrorBoundary>
    );
  } catch (error) {
    // 启动失败，清除 token 并渲染应用（会自动跳转到登录页）
    localStorage.removeItem('token');
    localStorage.removeItem('menus');
    
    root.render(
      <ErrorBoundary>
        <Provider store={store}>
          <App />
          <Toaster />
        </Provider>
      </ErrorBoundary>
    );
  }
}

// 显示骨架屏（更好的视觉体验）
root.render(<AppSkeleton />);

// 启动应用
bootstrap();
