import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
import { Toaster } from "sonner";
import { NextIntlClientProvider } from "next-intl";
import { cookies } from "next/headers";
import "./globals.css";
import { getPublicGeneralSettings, getPublicSeoSettings } from "@/services/settings/public";
import { LocaleProvider } from "@/context/LocaleContext";
import { defaultLocale, locales, type Locale } from "@i18n/config";

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

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

export async function generateMetadata(): Promise<Metadata> {
  const [generalSettings, seoSettings] = await Promise.all([
    getPublicGeneralSettings(),
    getPublicSeoSettings(),
  ]);

  return {
    title: {
      default: `Petro-Base Group ${seoSettings?.meta_title_suffix || ""}`.trim(),
      template: `%s ${seoSettings?.meta_title_suffix || ""}`.trim(),
    },
    description: seoSettings?.meta_description || "A multinational integrated Oil & Gas service company delivering excellence across continents.",
    icons: {
      icon: generalSettings?.favicon_url,
    },
    openGraph: {
      title: `Petro-Base Group ${seoSettings?.meta_title_suffix || ""}`.trim(),
      description: seoSettings?.meta_description || "A multinational integrated Oil & Gas service company delivering excellence across continents.",
      images: seoSettings?.og_image_url ? [{ url: seoSettings.og_image_url }] : [],
      type: "website",
    },
    robots: seoSettings?.robots_noindex ? "noindex, nofollow" : undefined,
  };
}

export default async function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode;
}>) {
  const cookieStore = await cookies();
  const raw = cookieStore.get("locale")?.value ?? defaultLocale;
  const locale: Locale = (locales as readonly string[]).includes(raw)
    ? (raw as Locale)
    : defaultLocale;
  // Load messages directly — avoids relying on the next-intl/config alias
  const messages = (await import(`../../messages/${locale}.json`)).default;

  return (
    <html
      lang={locale}
      className={`${geistSans.variable} ${geistMono.variable} h-full antialiased`}
    >
      <body className="min-h-full flex flex-col">
        <NextIntlClientProvider
          locale={locale}
          messages={messages}
          formats={{}}
          now={new Date()}
          timeZone={Intl.DateTimeFormat().resolvedOptions().timeZone}
        >
          <LocaleProvider>
            {children}
          </LocaleProvider>
        </NextIntlClientProvider>
        <Toaster richColors position="top-right" />
      </body>
    </html>
  );
}
