import { headers } from "next/headers";
import type { Metadata } from "next";
import "./globals.css";
import "@/styles/sections.css";
import "@/styles/legal.css";
import { SiteHeader } from "@/components/SiteHeader";
import { MobileMenu } from "@/components/MobileMenu";
import { SiteFooter } from "@/components/SiteFooter";
import { WhatsAppFab } from "@/components/WhatsAppFab";
import { ClientInit } from "@/components/ClientInit";
import { Animations } from "@/components/Animations";
import { PageScrollReveal } from "@/components/PageScrollReveal";
import { fetchMenu } from "@/lib/wp/menus";
import { fetchSiteSettings } from "@/lib/wp/site";
import {
  fetchSeoDefaults,
  organizationJsonLd,
  safeJsonLd,
} from "@/lib/wp/seo-defaults";
import { DEFAULT_LOCALE, htmlDir, isLocale, stripLocalePrefix } from "@/lib/i18n/config";

const SITE_URL = (process.env.NEXT_PUBLIC_SITE_URL ?? "http://localhost:3000").replace(/\/$/, "");

export async function generateMetadata(): Promise<Metadata> {
  const requestHeaders = await headers();
  const headerLocale = requestHeaders.get("x-locale");
  const locale = isLocale(headerLocale) ? headerLocale : DEFAULT_LOCALE;
  const defaults = await fetchSeoDefaults(locale);

  const siteName = defaults.site_name_ar || defaults.site_name || undefined;
  const ogImage = defaults.default_og_image.url ?? undefined;

  return {
    metadataBase: new URL(SITE_URL),
    applicationName: siteName,
    openGraph: {
      siteName,
      locale: defaults.locale,
      type: "website",
      ...(ogImage ? { images: [{ url: ogImage }] } : {}),
    },
    twitter: {
      card: "summary_large_image",
      ...(defaults.twitter_handle ? { site: defaults.twitter_handle } : {}),
      ...(ogImage ? { images: [ogImage] } : {}),
    },
  };
}

export default async function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode;
}>) {
  const requestHeaders = await headers();
  const headerLocale = requestHeaders.get("x-locale");
  const locale = isLocale(headerLocale) ? headerLocale : DEFAULT_LOCALE;
  const pathname = requestHeaders.get("x-pathname") ?? "/";
  const search = requestHeaders.get("x-search") ?? "";
  const pathWithoutLocale = stripLocalePrefix(pathname);

  const [headerNav, footerQuickLinks, footerServices, site, seoDefaults] = await Promise.all([
    fetchMenu("header", locale),
    fetchMenu("footer_column_1", locale),
    fetchMenu("footer_column_2", locale),
    fetchSiteSettings(locale),
    fetchSeoDefaults(locale),
  ]);

  const orgGraph = organizationJsonLd(seoDefaults, SITE_URL);

  return (
    <html lang={locale} dir={htmlDir(locale)}>
      <head>
        <link rel="preconnect" href="https://fonts.googleapis.com" />
        <link rel="preconnect" href="https://fonts.gstatic.com" crossOrigin="" />
        <link
          rel="stylesheet"
          href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,400;12..96,500;12..96,600;12..96,700;12..96,800&family=DM+Sans:opsz,wght@9..40,400;9..40,500;9..40,600;9..40,700&family=Cairo:wght@400;500;600;700;800;900&family=Tajawal:wght@400;500;700;800&family=JetBrains+Mono:wght@400;500;700&display=swap"
        />
        <link
          rel="stylesheet"
          href="https://fonts.googleapis.com/css2?family=Noto+Kufi+Arabic:wght@400;500;600;700;800;900&family=IBM+Plex+Sans+Arabic:wght@400;500;600;700&display=swap"
        />
        {orgGraph ? (
          <script
            type="application/ld+json"
            dangerouslySetInnerHTML={{ __html: safeJsonLd(orgGraph) }}
          />
        ) : null}
      </head>
      <body>
        <SiteHeader nav={headerNav} site={site} locale={locale} pathname={pathWithoutLocale} search={search} />
        <MobileMenu nav={headerNav} site={site} locale={locale} pathname={pathWithoutLocale} search={search} />
        {children}
        <SiteFooter
          quickLinks={footerQuickLinks}
          services={footerServices}
          site={site}
          locale={locale}
        />
        <WhatsAppFab whatsappUrl={site.socials.whatsapp_url} label={site.labels.whatsapp_label} />
        <ClientInit />
        <Animations />
        <PageScrollReveal />
      </body>
    </html>
  );
}
