import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
import { headers } from "next/headers";
import { NextIntlClientProvider } from "next-intl";
import { NuqsAdapter } from "nuqs/adapters/next/app";
import "./globals.css";
import { ImpersonationBanner } from "@/components/admin/impersonation-banner";
import { ThemeProvider } from "@/components/theme-provider";
import { Toaster } from "@/components/ui/sonner";
import { auth } from "@/lib/auth";
import { getActiveSiteLanguage } from "@/lib/sites/site-language";

const geistSans = Geist({
  variable: "--font-geist-sans",
  subsets: ["latin"],
});

const geistMono = Geist_Mono({
  variable: "--font-geist-mono",
  subsets: ["latin"],
});

export const metadata: Metadata = {
  title: "SEO Insight",
  description: "Audit your site against The Website Specification.",
};

/**
 * Label de la personne impersonnée, ou `null` hors impersonation.
 *
 * La bannière porte l'UNIQUE bouton de sortie d'impersonation : elle doit être
 * rendue au-dessus de TOUT écran atteignable pendant une impersonation, pas
 * seulement le groupe (app). `/billing-locked`, `/onboarding`,
 * `/accept-invitation` et `/two-factor` vivent hors de ce groupe, et `/admin`
 * répond 404 tant que la session n'est pas celle de l'opérateur : sans montage
 * ici, un opérateur impersonnant un client dont la facturation a expiré atterrit
 * sur un écran sans aucune issue. Le layout racine est le seul point commun.
 *
 * Lecture non autoritaire (pas de `disableCookieCache`) : c'est un affichage,
 * jamais un gate — et cela ajouterait un aller-retour base sur CHAQUE page, y
 * compris les pages publiques. Le démarrage d'une impersonation repose une
 * session fraîche, donc la bannière apparaît immédiatement.
 *
 * Ne jamais lever : ce layout enveloppe aussi `/login`, `/signup`, `/pricing`,
 * qui n'ont pas de session (même contrat que `getActiveSiteLanguage`).
 */
async function getImpersonatedLabel(): Promise<string | null> {
  try {
    const session = await auth.api.getSession({ headers: await headers() });
    if (!session?.session?.impersonatedBy) return null;
    return session.user.name || session.user.email;
  } catch {
    return null;
  }
}

export default async function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode;
}>) {
  const lang = await getActiveSiteLanguage();
  const impersonated = await getImpersonatedLabel();
  return (
    <html
      lang={lang}
      translate="no"
      suppressHydrationWarning
      className={`${geistSans.variable} ${geistMono.variable} h-full antialiased`}
    >
      <body className="min-h-full flex flex-col">
        <NextIntlClientProvider>
          <ThemeProvider
            attribute="class"
            defaultTheme="system"
            enableSystem
            disableTransitionOnChange
          >
            {impersonated ? (
              <ImpersonationBanner userLabel={impersonated} />
            ) : null}
            <NuqsAdapter>{children}</NuqsAdapter>
            <Toaster />
          </ThemeProvider>
        </NextIntlClientProvider>
      </body>
    </html>
  );
}
