import { createRouter, createWebHistory } from "vue-router";
import { useAuthStore } from "@/stores/auth";

const router = createRouter({
  history: createWebHistory(),
  routes: [
    {
      // The dashboard ("what to work on") is the landing page; Knowledge
      // remains as the exhaustive "Browse" surface.
      path: "/",
      redirect: "/dashboard",
    },
    {
      path: "/dashboard",
      name: "dashboard",
      component: () => import("@/views/DashboardView.vue"),
    },
    {
      path: "/knowledge",
      name: "knowledge",
      component: () => import("@/views/KnowledgeView.vue"),
    },
    {
      path: "/login",
      name: "login",
      component: () => import("@/views/LoginView.vue"),
      meta: { public: true },
    },
    {
      path: "/register",
      name: "register",
      component: () => import("@/views/RegisterView.vue"),
      meta: { public: true },
    },
    {
      path: "/forgot-password",
      name: "forgot-password",
      component: () => import("@/views/ForgotPasswordView.vue"),
      meta: { public: true },
    },
    {
      path: "/reset-password",
      name: "reset-password",
      component: () => import("@/views/ResetPasswordView.vue"),
      meta: { public: true },
    },
    {
      path: "/register-invite",
      name: "register-invite",
      component: () => import("@/views/RegisterInviteView.vue"),
      meta: { public: true },
    },
    {
      path: "/notes",
      redirect: "/knowledge",
    },
    {
      path: "/notes/new",
      name: "note-new",
      component: () => import("@/views/NoteEditorView.vue"),
    },
    {
      path: "/notes/:id",
      name: "note-view",
      component: () => import("@/views/NoteViewerView.vue"),
    },
    {
      path: "/notes/:id/edit",
      name: "note-edit",
      component: () => import("@/views/NoteEditorView.vue"),
    },
    {
      path: "/snippets",
      name: "snippets",
      component: () => import("@/views/SnippetListView.vue"),
    },
    {
      path: "/snippets/new",
      name: "snippet-new",
      component: () => import("@/views/SnippetEditorView.vue"),
    },
    {
      path: "/snippets/:id",
      name: "snippet-view",
      component: () => import("@/views/SnippetDetailView.vue"),
    },
    {
      path: "/snippets/:id/edit",
      name: "snippet-edit",
      component: () => import("@/views/SnippetEditorView.vue"),
    },
    {
      path: "/graph",
      name: "graph",
      component: () => import("@/views/GraphView.vue"),
    },
    {
      path: "/projects",
      name: "projects",
      component: () => import("@/views/ProjectListView.vue"),
    },
    {
      path: "/projects/:id",
      name: "project-view",
      component: () => import("@/views/ProjectView.vue"),
    },
    {
      path: "/rules",
      name: "rules",
      component: () => import("@/views/RulesView.vue"),
    },
    {
      // The design systems this install RECORDS — for the projects it tracks,
      // not for the install itself. There was a sibling `/design` that read the
      // running app's own stylesheet out of the browser; it could only ever
      // inspect the instance it was served from, which made it a mirror rather
      // than a tool (#274).
      path: "/design-systems",
      name: "design-systems",
      component: () => import("@/views/DesignSystemsView.vue"),
    },
    {
      path: "/tasks",
      redirect: "/",
    },
    {
      path: "/tasks/new",
      name: "task-new",
      component: () => import("@/views/TaskEditorView.vue"),
    },
    {
      path: "/tasks/:id",
      name: "task-edit",
      component: () => import("@/views/TaskEditorView.vue"),
    },
    {
      path: "/shared",
      name: "shared-with-me",
      component: () => import("@/views/SharedWithMeView.vue"),
    },
    {
      path: "/settings",
      name: "settings",
      component: () => import("@/views/SettingsView.vue"),
    },
    {
      path: "/trash",
      name: "trash",
      component: () => import("@/views/TrashView.vue"),
    },
    { path: "/admin/users", redirect: "/settings" },
    { path: "/admin/logs", redirect: "/settings" },
  ],
});

router.beforeEach(async (to) => {
  if (to.meta.public) return;

  const authStore = useAuthStore();

  // Wait for initial auth check if still loading
  if (authStore.loading && !authStore.isAuthenticated) {
    await authStore.checkAuth();
  }

  if (!authStore.isAuthenticated) {
    return { name: "login", query: { redirect: to.fullPath } };
  }
});

export default router;
