"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：
 *     idToken / accessToken 已交给后端换业务 token，浏览器侧不再需要保留 OAuth 凭证
 *     避免凭证在 cookie / sessionStorage 里持续暴露
 *
 * 此组件无可见 UI（返回 null），仅作为 NextAuth session 与 auth state
 * machine 之间的桥接器。挂在 RootProviders 内、AuthProvider 之后：
 *   <AuthProvider>     ← 提供 useAuthState / useAuthDispatch
 *     <OAuthSessionSync />  ← 用上面两个 hook
 *   </AuthProvider>
 */
import { useEffect, useRef } 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 { errorMessage, isLoading, loginStatus } = useAuthState();
  const pendingProviderRef = useRef<"google" | "facebook" | null>(null);
  const isClearingSessionRef = useRef(false);

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

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

    const clearOAuthSession = () => {
      if (isClearingSessionRef.current) return;
      isClearingSessionRef.current = true;

      const reset = () => {
        pendingProviderRef.current = null;
        isClearingSessionRef.current = false;
      };
      void signOut({ redirect: false }).then(reset, reset);
    };

    // 3) 业务同步已成功，现在才能安全清理 OAuth session。
    if (loginStatus === session.provider) {
      clearOAuthSession();
      return;
    }

    // 4) 同一 provider 已派发过；失败后清理 session，允许用户重新点击。
    if (pendingProviderRef.current === session.provider) {
      if (!isLoading && errorMessage) clearOAuthSession();
      return;
    }

    // 5) Google：派发 idToken sync 事件。
    if (session.provider === "google") {
      if (!session.idToken) return;
      pendingProviderRef.current = "google";
      dispatch({ type: "AuthGoogleSyncSubmitted", idToken: session.idToken });
      return;
    }

    // 6) Facebook：派发 accessToken sync 事件。
    if (session.provider === "facebook") {
      if (!session.accessToken) return;
      pendingProviderRef.current = "facebook";
      dispatch({
        type: "AuthFacebookSyncSubmitted",
        accessToken: session.accessToken,
      });
    }
  }, [dispatch, errorMessage, isLoading, loginStatus, session, status]);

  // 桥接器无 UI
  return null;
}
