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

const router = createRouter({
  history: createWebHistory(),
  routes: [
    {
      // Root lands on the journal. To revert to Knowledge as home, change
      // the redirect target below to "/knowledge" (Knowledge stays a real
      // route at /knowledge, so the swap is a one-line edit).
      path: "/",
      redirect: "/journal",
    },
    {
      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: "/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: "/workspace/:projectId",
      name: "workspace",
      component: () => import("@/views/WorkspaceView.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: "/chat",
      name: "chat",
      component: () => import("@/views/ChatView.vue"),
    },
    {
      path: "/chat/:id",
      name: "chat-conversation",
      component: () => import("@/views/ChatView.vue"),
    },
    {
      path: "/shared",
      name: "shared-with-me",
      component: () => import("@/views/SharedWithMeView.vue"),
    },
    {
      path: "/calendar",
      name: "calendar",
      component: () => import("@/views/CalendarView.vue"),
    },
    {
      path: "/journal",
      name: "journal",
      component: () => import("@/views/JournalView.vue"),
    },
    {
      path: "/settings",
      name: "settings",
      component: () => import("@/views/SettingsView.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;
