import { NextIntlClientProvider } from 'next-intl';
import { getMessages, setRequestLocale } from 'next-intl/server';
import { notFound } from 'next/navigation';
import { routing } from '@/i18n/routing';
import { LocaleDocumentSync, ThemeProvider, ZodLocaleProvider } from '@/components/providers';
import { AuthProvider } from '@/contexts/auth-context';
import { PermissionsProvider } from '@/contexts/permissions-context';
import { SettingsProvider } from '@/contexts/settings-context';
import { Toaster } from "sonner";
import "./globals.css";

// Generate static params for all locales
export function generateStaticParams() {
  return routing.locales.map((locale) => ({ locale }));
}

export default async function LocaleLayout({
  children,
  params,
}: {
  children: React.ReactNode;
  params: Promise<{ locale: string }>;
}) {
  const { locale } = await params;

  // Ensure that the incoming `locale` is valid
  if (!routing.locales.includes(locale as (typeof routing.locales)[number])) {
    notFound();
  }

  // In production we want static rendering per-locale.
  // In development, `setRequestLocale` can cause stale message caches while editing JSON catalogs.
  if (process.env.NODE_ENV !== "development") {
    setRequestLocale(locale);
  }

  // Load messages explicitly to avoid stale cache during dev
  const messages = await getMessages();

  return (
    <NextIntlClientProvider key={locale} locale={locale} messages={messages}>
      <LocaleDocumentSync locale={locale} />
      <ZodLocaleProvider />
      <ThemeProvider
        attribute="class"
        defaultTheme="light"
        disableTransitionOnChange
      >
        <AuthProvider>
          <PermissionsProvider>
            <SettingsProvider>
              {children}
              <Toaster position="top-center" richColors visibleToasts={1} />
            </SettingsProvider>
          </PermissionsProvider>
        </AuthProvider>
      </ThemeProvider>
    </NextIntlClientProvider>
  );
}
