"use client";

import "./globals.css";
import { useState, useEffect, useRef } from "react";
import { usePathname } from "next/navigation";
import Footer from "@/components/Footer";
import { SidebarOverlayContext } from "@/context/SidebarContext";
import { getPageTitleForPath } from "@/lib/page-titles";
import { ApiLoadingProvider } from "@/context/ApiLoadingContext";
import CommonSettingsModal from "@/components/CommonSettingsModal";
import { Header } from "@/components/layout/Header";
import { Sidebar } from "@/components/layout/Sidebar";
import { useSessionVerification } from "@/hooks/useSessionVerification";
import { useHeaderHeight } from "@/hooks/useHeaderHeight";
import { useMenuState } from "@/hooks/useMenuState";
import { isAuthRoute } from "@/utils/layout-utils";

const CHROME_EXCLUDED_ROUTES = ["/login", "/careers", "/add-subdomain", "/forgot_password"];

export default function RootLayout({ children }: { children: React.ReactNode }) {
  const [sidebarOpen, setSidebarOpen] = useState(false);
  const [sidebarReportOpen, setSidebarReportOpen] = useState(false);
  const [commonSettingsModalOpen, setCommonSettingsModalOpen] = useState(false);
  const headerRef = useRef<HTMLElement>(null);
  const pathname = usePathname();

  const shouldSkipChrome = isAuthRoute(pathname, CHROME_EXCLUDED_ROUTES);
  const headerHeight = useHeaderHeight(headerRef, !shouldSkipChrome);
  const { settingsOpen, setSettingsOpen, userMenuOpen, setUserMenuOpen } = useMenuState(!shouldSkipChrome);

  useSessionVerification(shouldSkipChrome);

  // Update document title
  useEffect(() => {
    if (typeof document === "undefined" || !pathname) return;
    const title = getPageTitleForPath(pathname);
    document.title = title;
  }, [pathname]);

  const headerOffset = shouldSkipChrome ? 0 : headerHeight || 140;

  const handleToggleSidebar = () => {
    setSidebarOpen((open) => !open);
    setSidebarReportOpen(false);
  };

  const handleToggleSidebarReport = () => {
    setSidebarReportOpen((open) => !open);
    setSidebarOpen(false);
  };

  const handleCloseSidebars = () => {
    setSidebarOpen(false);
    setSidebarReportOpen(false);
  };

  const handleToggleSettings = () => {
    setSettingsOpen((open) => {
      if (!open) setUserMenuOpen(false);
      return !open;
    });
  };

  const handleCloseSettings = () => {
    setSettingsOpen(false);
  };

  const handleToggleUserMenu = () => {
    setUserMenuOpen((open) => {
      if (!open) setSettingsOpen(false);
      return !open;
    });
  };

  const handleOpenCommonSettings = () => {
    setCommonSettingsModalOpen(true);
  };

  const hideFooter = shouldSkipChrome || pathname?.includes("/create/");

  return (
    <html lang="en" suppressHydrationWarning>
      <head></head>
      <body suppressHydrationWarning>
        <ApiLoadingProvider>
          {shouldSkipChrome ? (
            <div className="min-h-screen bg-white">{children}</div>
          ) : (
            <>
              <Header
                headerRef={headerRef}
                sidebarOpen={sidebarOpen}
                sidebarReportOpen={sidebarReportOpen}
                onToggleSidebar={handleToggleSidebar}
                onToggleSidebarReport={handleToggleSidebarReport}
                settingsOpen={settingsOpen}
                userMenuOpen={userMenuOpen}
                onToggleSettings={handleToggleSettings}
                onCloseSettings={handleCloseSettings}
                onToggleUserMenu={handleToggleUserMenu}
                onOpenCommonSettings={handleOpenCommonSettings}
              />

              {/* Sidebar + Main Content */}
              <div
                className="flex"
                style={{
                  paddingTop: headerOffset,
                  minHeight: `calc(100vh - ${headerOffset}px)`,
                }}
              >
                <Sidebar
                  isOpen={sidebarOpen}
                  isReportOpen={sidebarReportOpen}
                  onClose={handleCloseSidebars}
                />

                {/* Main Content */}
                <SidebarOverlayContext.Provider value={sidebarOpen || sidebarReportOpen}>
                  <main className="flex-1 bg-gray-50 overflow-auto hide-scrollbar transition-all duration-300">
                    {children}
                  </main>
                </SidebarOverlayContext.Provider>
              </div>
            </>
          )}
          {!hideFooter && <Footer />}
          <CommonSettingsModal
            isOpen={commonSettingsModalOpen}
            onClose={() => setCommonSettingsModalOpen(false)}
          />
        </ApiLoadingProvider>
      </body>
    </html>
  );
}
