import { Toaster } from "@/components/ui/sonner";
import { VlyToolbar } from "../vly-toolbar-readonly.tsx";
import { InstrumentationProvider } from "@/instrumentation.tsx";
import AuthPage from "@/pages/Auth.tsx";
import { ConvexBetterAuthProvider } from "@convex-dev/better-auth/react";
import { authClient } from "@/lib/auth-client";
import { ConvexReactClient } from "convex/react";
import { StrictMode, useEffect } from "react";
import { createRoot } from "react-dom/client";
import { BrowserRouter, Route, Routes, useLocation } from "react-router";
import "./index.css";
import Landing from "./pages/Landing.tsx";
import NotFound from "./pages/NotFound.tsx";
import Dashboard from "./pages/Dashboard.tsx";
import CreatePresentation from "./pages/CreatePresentation.tsx";
import EditPresentation from "./pages/EditPresentation.tsx";
import Admin from "./pages/Admin.tsx";
import CreateReport from "./pages/CreateReport.tsx";
import EditReport from "./pages/EditReport.tsx";
import CreateAssignment from "./pages/CreateAssignment.tsx";
import EditAssignment from "./pages/EditAssignment.tsx";
import EditProfile from "./pages/EditProfile.tsx";
import AdvertiseWithUs from "./pages/AdvertiseWithUs.tsx";
import Write from "./pages/Write.tsx";
import WriteOrders from "./pages/WriteOrders.tsx";
import WAdmin from "./pages/WAdmin.tsx";
import CreateCaseStudy from "./pages/CreateCaseStudy.tsx";
import EditCaseStudy from "./pages/EditCaseStudy.tsx";
import "./types/global.d.ts";
import { ThemeProvider } from "@/components/theme-provider";
import { ErrorBoundary } from "@/components/ErrorBoundary";
import { AnnouncementBanner } from "@/components/AnnouncementBanner";
import { Analytics } from "@vercel/analytics/react";
import { SpeedInsights } from "@vercel/speed-insights/react";
import { GlobalAuthCheck } from "@/components/GlobalAuthCheck";

const convex = new ConvexReactClient(import.meta.env.VITE_CONVEX_URL as string);

function ScrollToTop() {
  const { pathname } = useLocation();

  useEffect(() => {
    window.scrollTo(0, 0);
  }, [pathname]);

  return null;
}

function RouteSyncer() {
  const location = useLocation();
  useEffect(() => {
    window.parent.postMessage(
      { type: "iframe-route-change", path: location.pathname },
      "*",
    );
  }, [location.pathname]);

  useEffect(() => {
    function handleMessage(event: MessageEvent) {
      if (event.data?.type === "navigate") {
        if (event.data.direction === "back") window.history.back();
        if (event.data.direction === "forward") window.history.forward();
      }
    }
    window.addEventListener("message", handleMessage);
    return () => window.removeEventListener("message", handleMessage);
  }, []);

  return null;
}

createRoot(document.getElementById("root")!).render(
  <StrictMode>
    <VlyToolbar />
    <InstrumentationProvider>
      <ErrorBoundary>
        <ConvexBetterAuthProvider client={convex} authClient={authClient}>
          <ThemeProvider attribute="class" defaultTheme="system" enableSystem>
            <BrowserRouter>
              <ScrollToTop />
              <RouteSyncer />
              <AnnouncementBanner />
              <GlobalAuthCheck>
                <Routes>
                  <Route path="/" element={<Landing />} />
                  <Route path="/auth" element={<AuthPage redirectAfterAuth="/dashboard" />} />
                  <Route path="/dashboard" element={<Dashboard />} />
                  <Route path="/edit-profile" element={<EditProfile />} />
                  <Route path="/create" element={<CreatePresentation />} />
                  <Route path="/edit/:id" element={<EditPresentation />} />
                  <Route path="/create-report" element={<CreateReport />} />
                  <Route path="/edit-report/:id" element={<EditReport />} />
                  <Route path="/create-assignment" element={<CreateAssignment />} />
                  <Route path="/edit-assignment/:id" element={<EditAssignment />} />
                  <Route path="/case-study" element={<CreateCaseStudy />} />
                  <Route path="/edit-case-study/:id" element={<EditCaseStudy />} />
                  <Route path="/admin" element={<Admin />} />
                  <Route path="/advertise" element={<AdvertiseWithUs />} />
                  <Route path="/write" element={<Write />} />
                  <Route path="/write/orders" element={<WriteOrders />} />
                  <Route path="/wadmin" element={<WAdmin />} />
                  <Route path="*" element={<NotFound />} />
                </Routes>
              </GlobalAuthCheck>

            </BrowserRouter>
            <Toaster position="top-center" />
            <Analytics />
            <SpeedInsights />

          </ThemeProvider>
        </ConvexBetterAuthProvider>
      </ErrorBoundary>
    </InstrumentationProvider>
  </StrictMode>,
);
