"use client";
/**
 * OAuth Session → Backend Sync 桥接器
 *
 * 监听 NextAuth session（`useSession()`）：
 *   - 有 NextAuth OAuth session（provider + token）
 *   - 且 auth machine 还没有该 provider 的业务 token
 *   → 派发 `AuthGoogleSyncSubmitted` / `AuthFacebookSyncSubmitted` 事件
 *   → auth machine 调 `AuthRepository.googleLogin/facebookLogin` 换业务 token
 *   → 业务 token 写入本地 storage
 *   → **清掉 NextAuth session**（`signOut({ redirect: false })`）：
 *     idToken / accessToken 已交给后端换业务 token，浏览器侧不再需要保留 OAuth 凭证
 *     避免凭证在 cookie / sessionStorage 里持续暴露
 *
 * 此组件无可见 UI（返回 null），仅作为 NextAuth session 与 auth state
 * machine 之间的桥接器。挂在 RootProviders 内、AuthProvider 之后：
 *   <AuthProvider>     ← 提供 useAuthState / useAuthDispatch
 *     <OAuthSessionSync />  ← 用上面两个 hook
 *   </AuthProvider>
 */
import { useEffect } from "react";
import { signOut, useSession } from "next-auth/react";

import { useAuthDispatch, useAuthState } from "./auth-context";

export function OAuthSessionSync() {
  const { data: session, status } = useSession();
  const dispatch = useAuthDispatch();
  const { loginStatus } = useAuthState();

  useEffect(() => {
    // 1) NextAuth 还没就绪
    if (status !== "authenticated" || !session) return;

    // 2) 没有 OAuth provider（可能是 email / 其它）
    if (!session.provider) return;

    // 3) 已经有该 provider 的业务 token（防止重复 sync 刷后端 user 表）
    if (loginStatus === session.provider) return;

    // 4) Google：派发 idToken sync 事件 → 清 NextAuth session
    if (session.provider === "google") {
      if (!session.idToken) return;
      dispatch({ type: "AuthGoogleSyncSubmitted", idToken: session.idToken });
      // OAuth token 已交给后端 —— 清掉 NextAuth session（fire-and-forget）
      // 清完后 useSession 返 null / unauthenticated → 下次 effect 早 return，不会重入
      void signOut({ redirect: false });
      return;
    }

    // 5) Facebook：派发 accessToken sync 事件 → 清 NextAuth session
    if (session.provider === "facebook") {
      if (!session.accessToken) return;
      dispatch({
        type: "AuthFacebookSyncSubmitted",
        accessToken: session.accessToken,
      });
      void signOut({ redirect: false });
    }
  }, [status, session, loginStatus, dispatch]);

  // 桥接器无 UI
  return null;
}
