import { createRouter, createWebHistory } from 'vue-router'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { constantRoutes } from '@/router/routes.js'

NProgress.configure({ showSpinner: false })

const router = createRouter({
  history: createWebHistory(),
  routes: constantRoutes,
  scrollBehavior(to, from, savedPosition) {
    if (savedPosition) {
      return savedPosition
    }
    return { top: 0 }
  }
})

// Whitelist paths that don't require authentication
const WHITE_LIST = ['/login', '/register', '/404']

router.beforeEach(async (to, from, next) => {
  NProgress.start()

  // Lazily import stores to avoid circular dependency at module init time
  const { useUserStore } = await import('@/stores/user.js')
  const { usePermissionStore } = await import('@/stores/permission.js')
  const userStore = useUserStore()
  const permissionStore = usePermissionStore()

  const token = userStore.token

  if (token) {
    if (to.path === '/login') {
      // Already logged in — redirect to home
      next({ path: '/' })
    } else {
      // Check if user info has been fetched
      if (!userStore.userInfo) {
        try {
          await userStore.getInfo()
          const accessRoutes = permissionStore.generateRoutes(userStore.menus)
          accessRoutes.forEach((route) => router.addRoute(route))
          // Replace so the new routes are active
          next({ ...to, replace: true })
        } catch (err) {
          // Token invalid — clear and redirect
          await userStore.logout()
          next(`/login?redirect=${to.path}`)
        }
      } else {
        next()
      }
    }
  } else {
    // No token
    if (WHITE_LIST.includes(to.path)) {
      next()
    } else {
      next(`/login?redirect=${to.path}`)
    }
  }
})

router.afterEach(() => {
  NProgress.done()
})

export default router
