import type { Metadata, Viewport } from "next";
import { Space_Grotesk, Inter, IBM_Plex_Mono } from "next/font/google";
import "./globals.css";
import { ThemeProvider } from "@/lib/theme-provider";
import { LanguageProvider } from "@/lib/i18n/LanguageProvider";
import { OrderStoreProvider } from "@/lib/order-store";
import { AuthProvider } from "@/lib/auth/auth-provider";
import { SettingsProvider } from "@/lib/data/settings-provider";
import { MaintenanceGate } from "@/components/MaintenanceGate";
import { PageTransition } from "@/components/PageTransition";
import { ServiceWorkerRegistration } from "@/components/ServiceWorkerRegistration";

const display = Space_Grotesk({
  subsets: ["latin"],
  weight: ["500", "600", "700"],
  variable: "--font-display",
});

const body = Inter({
  subsets: ["latin"],
  weight: ["400", "500", "600", "700"],
  variable: "--font-body",
});

const mono = IBM_Plex_Mono({
  subsets: ["latin"],
  weight: ["400", "500", "600"],
  variable: "--font-mono",
});

const SITE_URL = process.env.NEXT_PUBLIC_SITE_URL || "http://localhost:3000";

export const metadata: Metadata = {
  metadataBase: new URL(SITE_URL),
  title: {
    default: "SharedNet — Internet Packages",
    template: "%s — SharedNet",
  },
  description: "Buy Zong, Jazz & Ufone shared internet packages in seconds.",
  applicationName: "SharedNet",
  manifest: "/manifest.webmanifest",
  keywords: ["Zong", "Jazz", "Ufone", "internet packages", "MY5", "Pakistan mobile data"],
  robots: { index: true, follow: true },
  openGraph: {
    type: "website",
    siteName: "SharedNet",
    title: "SharedNet — Internet Packages",
    description: "Buy Zong, Jazz & Ufone shared internet packages in seconds.",
  },
  twitter: {
    card: "summary_large_image",
    title: "SharedNet — Internet Packages",
    description: "Buy Zong, Jazz & Ufone shared internet packages in seconds.",
  },
  appleWebApp: {
    capable: true,
    statusBarStyle: "black-translucent",
    title: "SharedNet",
  },
  formatDetection: { telephone: false },
};

export const viewport: Viewport = {
  width: "device-width",
  initialScale: 1,
  maximumScale: 1,
  viewportFit: "cover",
  themeColor: [
    { media: "(prefers-color-scheme: dark)", color: "#0B0E14" },
    { media: "(prefers-color-scheme: light)", color: "#EEF1F6" },
  ],
};

export default function RootLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  return (
    <html lang="en" suppressHydrationWarning>
      <body
        className={`${display.variable} ${body.variable} ${mono.variable} font-body`}
      >
        <ThemeProvider>
          <LanguageProvider>
            <AuthProvider>
              <SettingsProvider>
                <OrderStoreProvider>
                  <ServiceWorkerRegistration />
                  <div className="mx-auto flex min-h-dvh w-full max-w-md flex-col bg-paper dark:bg-ink">
                    <MaintenanceGate>
                      <PageTransition>{children}</PageTransition>
                    </MaintenanceGate>
                  </div>
                </OrderStoreProvider>
              </SettingsProvider>
            </AuthProvider>
          </LanguageProvider>
        </ThemeProvider>
      </body>
    </html>
  );
}
