import { QueryClient } from "@tanstack/react-query";
import { createRouter as createTanstackRouter } from "@tanstack/react-router";
import { setupRouterSsrQueryIntegration } from "@tanstack/react-router-ssr-query";
import { routeTree } from "./routeTree.gen";



export const getRouter = () => {
  // New QueryClient per request on the server; on the client this also runs once
  // per page load. Defaults are tuned so SSR-primed data is NOT refetched on
  // hydration: anything not explicitly marked stale stays fresh for 5 minutes.
  const queryClient = new QueryClient({
    defaultOptions: {
      queries: {
        staleTime: 5 * 60 * 1000,
        gcTime: 30 * 60 * 1000,
        refetchOnWindowFocus: false,
        refetchOnReconnect: false,
        refetchOnMount: false,
        retry: 1,
      },
    },
  });

  // Language prefix: "/en/..." is English, everything else Dutch. Input strips the
  // prefix (remembering the language for this router instance); output re-adds it
  // so every internal link stays in the visitor's language.
  let lang: "nl" | "en" = "nl";
  const router = createTanstackRouter({
    routeTree,
    context: { queryClient },
    scrollRestoration: true,
    // Let TanStack Query control freshness, not the router's preload cache.
    defaultPreloadStaleTime: 0,
    // Prefetch route code + loader data on link hover/touch for instant SPA nav.
    defaultPreload: "intent",
    rewrite: {
      input: ({ url }) => {
        const p = url.pathname;
        if (p === "/en" || p.startsWith("/en/")) {
          lang = "en";
          url.pathname = p === "/en" ? "/" : p.slice(3);
        } else {
          lang = "nl";
        }
        return url;
      },
      output: ({ url }) => {
        if (lang === "en" && !url.pathname.startsWith("/api/")) {
          url.pathname = url.pathname === "/" ? "/en" : `/en${url.pathname}`;
        }
        return url;
      },
    },
  });


  // Wires automatic dehydrate (server) + hydrate (client) of the QueryClient
  // through the router's built-in SSR state pipeline.
  setupRouterSsrQueryIntegration({ router, queryClient });
  return router;
};
