import { createRouter, createWebHistory } from 'vue-router'
import type { RouteRecordRaw } from 'vue-router'
import store from '@/stores'
import { checkLogin } from '@/api/auth'

/**
 * 静态路由 — 不需要权限，应用启动就注册
 */
const staticRoutes: RouteRecordRaw[] = [
  { path: '/',     name: 'Home', component: () => import('@/views/Home.vue') },
  { path: '/jobs', name: 'Jobs', component: () => import('@/views/Jobs.vue') },
  {
    path: '/resume/:id',
    name: 'ResumeDetail',
    component: () => import('@/views/ResumeDetail.vue'),
    meta: { requiresAuth: true },
  },
  {
    path: '/jobs/:id',
    name: 'JobDetail',
    component: () => import('@/views/JobDetail.vue'),
  },
]

const router = createRouter({
  history: createWebHistory(),
  routes: staticRoutes,
})

/**
 * 全局前置守卫 — 核心逻辑：
 *
 * 1. 动态路由未加载 → 先拉取并注册，再重新进入当前路由
 * 2. 需要鉴权的路由 → 调 checkLogin 接口验证 Cookie 是否有效
 *    - 有效：同步 isAuthenticated = true，放行
 *    - 无效：同步 isAuthenticated = false，弹登录框，阻止导航
 * 3. 不需要鉴权的路由 → 直接放行
 */
router.beforeEach(async (to, _from, next) => {
  // 动态路由只需加载一次，与登录状态无关
  if (!store.state.routesLoaded) {
    try {
      await store.dispatch('loadDynamicRoutes', router)
      next({ ...to, replace: true })
    } catch (err) {
      console.error('[router] 加载动态路由失败', err)
      next({ name: 'Home' })
    }
    return
  }

  // 需要鉴权的路由，每次都通过接口校验登录状态
  if (to.meta?.requiresAuth) {
    try {
      const res = await checkLogin()
      if (res.code === '0' && res.data === true) {
        // Cookie 有效，同步前端状态并放行
        store.commit('SET_AUTHENTICATED', true)
        next()
      } else {
        // 未登录或 Cookie 失效
        store.commit('SET_AUTHENTICATED', false)
        store.dispatch('openLogin', to.fullPath)
        next(false)
      }
    } catch {
      // 请求异常（网络错误等），也视为未登录
      store.commit('SET_AUTHENTICATED', false)
      store.dispatch('openLogin', to.fullPath)
      next(false)
    }
    return
  }

  next()
})

export default router
