import type { Metadata } from 'next';
import { NextIntlClientProvider } from 'next-intl';
import { getMessages } from 'next-intl/server';
import { Space_Grotesk, Inter, IBM_Plex_Sans_Arabic } from 'next/font/google';
import { notFound } from 'next/navigation';
import { locales, localeDirection, type Locale } from '@/i18n/config';
import { siteConfig } from '@/data/site-config';
import { Header } from '@/components/layout/header';
import { Footer } from '@/components/layout/footer';
import { HideOnAdmin } from '@/components/layout/hide-on-admin';
import { CartDrawer } from '@/components/cart-drawer';
import '../globals.css';

const spaceGrotesk = Space_Grotesk({
  subsets: ['latin'],
  variable: '--font-display',
  display: 'swap'
});

const inter = Inter({
  subsets: ['latin'],
  variable: '--font-body',
  display: 'swap'
});

const plexArabic = IBM_Plex_Sans_Arabic({
  subsets: ['arabic'],
  weight: ['400', '500', '600', '700'],
  variable: '--font-display-ar',
  display: 'swap'
});

// Reuse the same family for Arabic body text at a lighter register.
const plexArabicBody = IBM_Plex_Sans_Arabic({
  subsets: ['arabic'],
  weight: ['400', '500'],
  variable: '--font-body-ar',
  display: 'swap'
});

export function generateStaticParams() {
  return locales.map((locale) => ({ locale }));
}

// Content is CMS-driven (admin edits, always-fresh data), and next-intl server
// APIs opt routes into dynamic rendering. Rendering locale pages on demand
// avoids statically prerendering them at build time and the related errors.
export const dynamic = 'force-dynamic';

export async function generateMetadata({
  params: { locale }
}: {
  params: { locale: Locale };
}): Promise<Metadata> {
  return {
    title: {
      default: siteConfig.companyName,
      template: `%s | ${siteConfig.companyName}`
    },
    description:
      locale === 'ar' ? siteConfig.seo.defaultDescriptionAr : siteConfig.seo.defaultDescriptionFr,
    metadataBase: new URL(process.env.NEXT_PUBLIC_SITE_URL ?? 'http://localhost:3000'),
    icons: {
      icon: '/images/logo-square.jpg',
      apple: '/images/logo-square.jpg'
    }
  };
}

export default async function LocaleLayout({
  children,
  params: { locale }
}: {
  children: React.ReactNode;
  params: { locale: Locale };
}) {
  if (!locales.includes(locale)) notFound();

  const messages = await getMessages();
  const dir = localeDirection[locale];

  return (
    <html lang={locale} dir={dir}>
      <body
        className={`${spaceGrotesk.variable} ${inter.variable} ${plexArabic.variable} ${plexArabicBody.variable}`}
      >
        <NextIntlClientProvider messages={messages}>
          <HideOnAdmin>
            <Header locale={locale} />
          </HideOnAdmin>
          <main className="page-enter">{children}</main>
          <HideOnAdmin>
            <Footer locale={locale} />
          </HideOnAdmin>
          <HideOnAdmin>
            <CartDrawer locale={locale} />
          </HideOnAdmin>
        </NextIntlClientProvider>
      </body>
    </html>
  );
}
