"use client";

/**
 * 根级 Client Providers 包装
 *
 * 把所有功能 Provider 串起来：
 *   AuthProvider → UserProvider → SidebarProvider → ChatProvider
 *   + AuthStatusChecker（启动时一次：派发 AuthInit）
 *   + OAuthSessionSync   （持续监听 NextAuth session → auth machine）
 *   + UserAuthSync       （auth 登录态恢复后 hydrate user machine）
 *   + ChatAuthSync       （持续监听 auth loginStatus → chat machine）
 *
 * 它们始终挂载，保证各页面直接 `use*State()` / `use*Dispatch()` 即可，
 * 无需在每个页面单独包裹。
 */

import type { ReactNode } from "react";

import { AuthProvider } from "@/stores/auth/auth-context";
import { AuthStatusChecker } from "@/stores/auth/auth-status-checker";
import { OAuthSessionSync } from "@/stores/auth/oauth-session-sync";
import { ChatAuthSync } from "@/stores/chat/chat-auth-sync";
import { ChatProvider } from "@/stores/chat/chat-context";
import { SidebarProvider } from "@/stores/sidebar/sidebar-context";
import { UserAuthSync } from "@/stores/user/user-auth-sync";
import { UserProvider } from "@/stores/user/user-context";

export interface RootProvidersProps {
  children: ReactNode;
}

export function RootProviders({ children }: RootProvidersProps) {
  return (
    <AuthProvider>
      {/* AuthStatusChecker 必须在 AuthProvider 内部（依赖 useAuthDispatch），
       * 必须在 UserProvider/ChatProvider 外部（它们可能在 init 完成前就 mount） */}
      <AuthStatusChecker />
      {/* OAuthSessionSync 同样依赖 AuthProvider 上下文 */}
      <OAuthSessionSync />
      <UserProvider>
        <UserAuthSync />
        <SidebarProvider>
          <ChatProvider>
            <ChatAuthSync />
            {children}
            <div id="toast-portal" />
          </ChatProvider>
        </SidebarProvider>
      </UserProvider>
    </AuthProvider>
  );
}
