import { useEffect, useRef } from "react";
import { createFileRoute, useNavigate } from "@tanstack/react-router";
import { z } from "zod";
import { toast } from "sonner";

import type { AuthSession } from "@rubis/shared";
import { api } from "@/lib/api";
import { authStore } from "@/lib/auth";
import { Gem } from "@/components/brand/Gem";

/**
 * Callback SSO côté SPA — partagé entre Google et Microsoft. Se charge :
 *  1. d'appeler POST /api/v1/auth/refresh (le cookie httpOnly posé par
 *     la callback backend OAuth est auto-envoyé)
 *  2. de stocker l'access token + user dans authStore
 *  3. de naviguer vers `?next=...` (envoyé par le backend selon l'état
 *     d'onboarding : "/" pour user complet, "/onboarding/entreprise"
 *     pour un nouveau)
 *
 * En cas d'échec du refresh, on renvoie sur /login avec un toast.
 */
const searchSchema = z.object({
  next: z.string().default("/"),
});

export const Route = createFileRoute("/auth/sso/complete")({
  validateSearch: searchSchema,
  component: SsoCompletePage,
});

function SsoCompletePage() {
  const { next } = Route.useSearch();
  const navigate = useNavigate();
  // Strict-mode protect : avoid double-firing the refresh in dev.
  const triggered = useRef(false);

  useEffect(() => {
    if (triggered.current) return;
    triggered.current = true;
    (async () => {
      try {
        const session = await api.post<AuthSession>(
          "/api/v1/auth/refresh",
          undefined,
          { anonymous: true },
        );
        authStore.setSession(session.accessToken, session.user);
        const firstName = session.user.fullName?.split(" ")[0];
        toast.success(firstName ? `Bonjour ${firstName}.` : "Connecté.");
        // Sécurité : si `next` n'est pas un chemin relatif, on renvoie sur "/".
        const target = next.startsWith("/") && !next.startsWith("//") ? next : "/";
        void navigate({ to: target });
      } catch {
        toast.error("Connexion Google échouée. Réessayez.");
        void navigate({ to: "/login" });
      }
    })();
  }, [next, navigate]);

  // UI minimale pendant l'aller-retour réseau (max 1-2s en pratique).
  return (
    <main className="min-h-screen bg-cream flex items-center justify-center">
      <div className="flex flex-col items-center gap-3 text-ink-2">
        <Gem size={28} className="animate-pulse" />
        <p className="text-[14px] font-medium">Connexion en cours…</p>
      </div>
    </main>
  );
}
