import {
  AppShell,
  ColorSchemeScript,
  MantineProvider,
  mantineHtmlProps,
} from "@mantine/core";
import "@mantine/core/styles.css";
import "@mantine/dates/styles.css";
import "mantine-react-table/styles.css";
import "@mantine/nprogress/styles.css";
import "@mantine/notifications/styles.css";
import "@mantine/dropzone/styles.css";
import { Links, Meta, Outlet, Scripts, ScrollRestoration, useNavigation } from "react-router";
import { Toaster } from "sonner";
import { theme } from "./lib/theme";
import "./root.css";
import { UserProvider } from "./providers/UserProvider";
import { ModalsProvider } from "@mantine/modals";
import { Notifications } from "@mantine/notifications";
import { NavigationProgress, nprogress } from "@mantine/nprogress";
import { useEffect, useRef } from "react";

const COMPLETE_DELAY_MS = 200;

function GlobalLoader() {
  const navigation = useNavigation();
  const completeTimer = useRef<ReturnType<typeof setTimeout> | null>(null);

  useEffect(() => {
    const isActive =
      navigation.state === "loading" || navigation.state === "submitting";

    if (isActive) {
      if (completeTimer.current) {
        clearTimeout(completeTimer.current);
        completeTimer.current = null;
      }
      nprogress.start();
    } else {
      completeTimer.current = setTimeout(() => {
        nprogress.complete();
        completeTimer.current = null;
      }, COMPLETE_DELAY_MS);
    }

    return () => {
      if (completeTimer.current) {
        clearTimeout(completeTimer.current);
        completeTimer.current = null;
      }
    };
  }, [navigation.state]);

  return (
    <NavigationProgress
      size={3}
      color="blue"
      {...({
        style: { position: "fixed", top: 0, bottom: "auto", insetInline: 0 },
      } as any)}
    />
  );
}

export function Layout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="en" {...mantineHtmlProps}>
      <head>
        <meta charSet="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Karma Admin Console</title>
        <link rel="preconnect" href="https://fonts.googleapis.com" />
        <link
          rel="preconnect"
          href="https://fonts.gstatic.com"
          crossOrigin=""
        />
        <link
          href="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=Outfit:wght@100..900&display=swap"
          rel="stylesheet"
        />
        <ColorSchemeScript />
        <Meta />
        <Links />
      </head>
      <body>
        <MantineProvider theme={theme} classNamesPrefix="xp">
          <ModalsProvider>
            <Notifications position="top-right" />
            <UserProvider>
              <GlobalLoader />
              <AppShell bg="dark-8">{children}</AppShell>
            </UserProvider>
          </ModalsProvider>
        </MantineProvider>
        <ScrollRestoration />
        <Toaster />
        <Scripts />
      </body>
    </html>
  );
}

export default function Root() {
  return <Outlet />;
}
