import type { Metadata } from 'next';
import { NextIntlClientProvider, hasLocale } from 'next-intl';
import { getTranslations, setRequestLocale } from 'next-intl/server';
import { Roboto, Roboto_Slab } from 'next/font/google';
import { notFound } from 'next/navigation';

import BackToTop from '@/components/BackToTop';
import ScrollRestorer from '@/components/ScrollRestorer';
import { VideoPlayerProvider } from '@/components/common/VideoModalPlayer';
import CookieModal from '@/components/cookies/CookieModal';
import VideoConsentObserver from '@/components/cookies/VideoConsentObserver';
import Footer from '@/components/footer/Footer';
import Header from '@/components/header/Header';
import { Toaster } from '@/components/ui/toaster';
import { getSEOConfig } from '@/utils/seo';

import '@/app/globals.css';
import { AuthProvider } from '@/contexts/AuthContext';
import { LocaleSwitchProvider } from '@/contexts/LocaleSwitchContext';
import { routing } from '@/i18n/routing';

const robotoSlab = Roboto_Slab({
  variable: '--font-roboto-slab',
  subsets: ['latin'],
});

const roboto = Roboto({
  variable: '--font-roboto',
  subsets: ['latin'],
});

const seoConfig = getSEOConfig();

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

export async function generateMetadata({
  params,
}: {
  params: Promise<{ locale: string }>;
}): Promise<Metadata> {
  const { locale } = await params;
  const t = await getTranslations({ locale, namespace: 'siteMeta' });

  return {
    // todo add local to base if en???
    metadataBase: new URL('https://azopus.hu'),
    title: {
      default: t('defaultTitle'),
      template: t('titleTemplate'),
    },
    description: t('description'),
    keywords: [
      'magyar művészeti akadémia',
      'kortárs művészet',
      'mma művészek',
      'magyar művészeti akadémia művészek',
      'magyar művészet',
      'kortárs művészek',
      'kulturális események',
      'művészeti életút',
      'alkotások',
      'művészeti adatbázis',
      'az opus',
      'opus adatbázis',
      'opus művészeti adatbázis',
      'opus művészeti életút-adatbázis',
    ],
    authors: [{ name: 'A-Z OPUS' }],
    creator: 'A-Z OPUS',
    publisher: 'A-Z OPUS',

    // conditional robots meta tags
    robots: seoConfig.shouldIndex
      ? {
          index: true,
          follow: true,
        }
      : {
          index: false,
          follow: false,
        },
    openGraph: {
      type: 'website',
      locale: locale === 'en' ? 'en_US' : 'hu_HU',
      url: 'https://azopus.hu',
      siteName: 'A-Z OPUS',
      title: t('defaultTitle'),
      description: t('description'),
    },
    // images: [
    //   {
    //     url: "/og-image.jpg",
    //     width: 1200,
    //     height: 630,
    //     alt: "A-Z OPUS művészeti adatbázis",
    //   },
    // ],
  };
}

export default async function LocaleLayout({
  children,
  params,
}: Readonly<{
  children: React.ReactNode;
  params: Promise<{ locale: string }>;
}>) {
  const { locale } = await params;
  if (!hasLocale(routing.locales, locale)) {
    notFound();
  }

  setRequestLocale(locale);

  return (
    <html lang={locale} className={`${robotoSlab.variable} ${roboto.variable}`}>
      <body className={`${robotoSlab.variable} ${roboto.variable} antialiased`}>
        <NextIntlClientProvider>
          <AuthProvider>
            <LocaleSwitchProvider>
              <VideoPlayerProvider>
                <div className="relative w-full min-h-screen flex flex-col pt-[60px] md:pt-[68px] lg:pt-[76px]">
                  <Header />
                  <main className="flex-1">{children}</main>
                  <Footer />
                </div>
              </VideoPlayerProvider>
            </LocaleSwitchProvider>

            <VideoConsentObserver />
            <CookieModal />
            <BackToTop />
            <ScrollRestorer />
            <Toaster />
          </AuthProvider>
        </NextIntlClientProvider>
      </body>
    </html>
  );
}
