import router, { notFoundRoute } from '@/router'
import { useUserStore } from '@/store/modules/user'
import { usePermissionStore } from '@/store/modules/permission'

// 不需要登录即可访问的路径白名单
const whiteList = ['/auth', '/404']

router.beforeEach(async (to, _from) => {
  const userStore = useUserStore()
  const permissionStore = usePermissionStore()

  const token = userStore.token

  if (token) {
    // ── 已登录 ──
    if (to.path === '/auth') {
      // 已登录不允许访问登录页
      return '/'
    }

    if (permissionStore.isRoutesLoaded) {
      // 路由已加载，直接放行
      return true
    } else {
      try {
        // ① 获取用户信息（角色、昵称等）
        await userStore.getUserInfo()

        // ② 拉取并处理权限路由，返回扁平化路由配置
        const accessRoutes = await permissionStore.generateRoutes(token)

        // ③ 将动态路由注册为 Root（Layout）的子路由
        accessRoutes.forEach(route => {
          router.addRoute('Root', route)
        })

        // ④ 最后注册 404 路由（确保在权限路由之后）
        router.addRoute(notFoundRoute)

        // ⑤ 重新导航到目标页面
        // replace: true 避免在历史记录中留下重定向记录
        // 必须用 next({ ...to }) 而不是 next()，让路由重新匹配新注册的路由
        return { ...to, replace: true }
      } catch (error) {
        // Token 失效或接口异常 → 清除 Token，跳转登录
        console.error('[权限守卫] 初始化失败:', error)
        userStore.resetToken()
        return `/auth?redirect=${encodeURIComponent(to.path)}`
      }
    }
  } else {
    // ── 未登录 ──
    if (whiteList.includes(to.path)) {
      return true
    } else {
      return `/auth?redirect=${encodeURIComponent(to.path)}`
    }
  }
})
