import { createRouter, createRoute, createRootRoute, Outlet } from "@tanstack/react-router";
import { NavBar } from "./components/layout/NavBar";
import { DashboardPage } from "./pages/DashboardPage";
import { SignupPage } from "./pages/SignupPage";
import { LoginPage } from "./pages/LoginPage";
import { NewRepoPage } from "./pages/NewRepoPage";
import { RepoPage } from "./pages/RepoPage";
import { ChangesPage } from "./pages/ChangesPage";
import { ChangePage } from "./pages/ChangePage";
import { FilePage } from "./pages/FilePage";

const rootRoute = createRootRoute({
  component: () => (
    <>
      <NavBar />
      <Outlet />
    </>
  ),
});

const indexRoute = createRoute({
  getParentRoute: () => rootRoute,
  path: "/",
  component: DashboardPage,
});

const signupRoute = createRoute({
  getParentRoute: () => rootRoute,
  path: "/signup",
  component: SignupPage,
});

const loginRoute = createRoute({
  getParentRoute: () => rootRoute,
  path: "/login",
  component: LoginPage,
});

const newRepoRoute = createRoute({
  getParentRoute: () => rootRoute,
  path: "/new",
  component: NewRepoPage,
});

const repoRoute = createRoute({
  getParentRoute: () => rootRoute,
  path: "/$owner/$name",
  component: RepoPage,
});

const repoChangesRoute = createRoute({
  getParentRoute: () => rootRoute,
  path: "/$owner/$name/changes",
  component: ChangesPage,
});

const repoChangeRoute = createRoute({
  getParentRoute: () => rootRoute,
  path: "/$owner/$name/change/$hash",
  component: ChangePage,
});

const repoFileRoute = createRoute({
  getParentRoute: () => rootRoute,
  path: "/$owner/$name/file",
  component: FilePage,
});

const routeTree = rootRoute.addChildren([
  indexRoute,
  signupRoute,
  loginRoute,
  newRepoRoute,
  repoRoute,
  repoChangesRoute,
  repoChangeRoute,
  repoFileRoute,
]);

export const router = createRouter({ routeTree, defaultPreload: "intent" });

declare module "@tanstack/react-router" {
  interface Register {
    router: typeof router;
  }
}