import type { Metadata, Viewport } from "next";
import { Inter, Fraunces } from "next/font/google";
import { cookies } from "next/headers";
import { ConvexAuthNextjsServerProvider } from "@convex-dev/auth/nextjs/server";
import { Providers } from "@/components/providers";
import { getSettings } from "@/lib/settings";
import "./globals.css";

const inter = Inter({ subsets: ["latin"], variable: "--font-inter", display: "swap" });
const fraunces = Fraunces({ subsets: ["latin"], variable: "--font-fraunces", display: "swap", axes: ["opsz", "SOFT"] });

export const metadata: Metadata = {
  title: { default: "LocaJour", template: "%s · LocaJour" },
  description: "Private property management system for daily-rental apartments.",
  applicationName: "LocaJour",
  manifest: "/manifest.webmanifest",
  appleWebApp: { capable: true, statusBarStyle: "default", title: "LocaJour" },
};

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

export default async function RootLayout({ children }: { children: React.ReactNode }) {
  const [jar, settings] = await Promise.all([cookies(), getSettings().catch(() => null)]);
  const theme = (jar.get("lj_theme")?.value as "light" | "dark" | "system" | undefined) ?? settings?.theme ?? "system";
  const accent = (jar.get("lj_accent")?.value as string | undefined) ?? settings?.accent ?? "teal";
  const lang = settings?.language ?? "en";
  const dir = lang === "ar" ? "rtl" : "ltr";
  return (
    <html lang={lang} dir={dir} className={`${inter.variable} ${fraunces.variable} ${theme === "dark" ? "dark" : ""}`} data-accent={accent} data-theme={theme} suppressHydrationWarning>
      <body className="min-h-dvh antialiased">
        {/* Runs before the page paints, so a dark-mode visitor never sees a light flash.
            It lives at the top of <body> rather than in a hand-written <head>: the App
            Router owns the document head, and rendering our own element there makes
            React reconcile its injected metadata/style list without keys. */}
        {theme === "system" ? (
          <script
            dangerouslySetInnerHTML={{
              __html: `try{if(window.matchMedia('(prefers-color-scheme: dark)').matches)document.documentElement.classList.add('dark')}catch(e){}`,
            }}
          />
        ) : null}
        <ConvexAuthNextjsServerProvider>
          <Providers>{children}</Providers>
        </ConvexAuthNextjsServerProvider>
      </body>
    </html>
  );
}
