import { createRouter, createWebHistory } from 'vue-router'
import type { RouteRecordRaw } from 'vue-router'
import store from '@/stores'
import { checkLogin } from '@/api/auth'
import { fetchMemberStatus } from '@/api/member'
// 【已禁用】强制简历上传机制相关引用
// import { fetchProfile } from '@/api/profile'
// import { ENABLE_FORCE_RESUME_UPLOAD } from '@/business.config'

/**
 * 静态路由 — 不需要权限，应用启动就注册
 */
const staticRoutes: RouteRecordRaw[] = [
  { path: '/',     name: 'Home', component: () => import('@/views/Home.vue') },
  { path: '/m',    name: 'HomeMobile', component: () => import('@/views/HomeMobile.vue') },
  { path: '/login', name: 'Login', component: () => import('@/views/Login.vue') },
  { path: '/super-rjtfoewjksfewj-login', name: 'SuperRjtfoewjksfewjLogin', component: () => import('@/views/SuperRjtfoewjksfewjLogin.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'),
  },
  {
    path: '/mentor/:id',
    name: 'MentorDetail',
    component: () => import('@/views/MentorDetail.vue'),
  },
  {
    path: '/announcement/:id',
    name: 'AnnouncementDetail',
    component: () => import('@/views/AnnouncementDetail.vue'),
  },
  {
    path: '/privacy',
    name: 'PrivacyPolicy',
    component: () => import('@/views/PrivacyPolicy.vue'),
  },
]

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

/**
 * 检测是否为移动端设备
 */
function isMobileDevice(): boolean {
  return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)
    || window.innerWidth < 768
}

/**
 * 上次静默校验登录状态的时间戳，用于节流（5 分钟内不重复请求）
 */
let lastCheckTime = 0
const CHECK_INTERVAL = 5 * 60 * 1000 // 5 分钟

/**
 * 全局前置守卫 — 核心逻辑：
 *
 * 1. 动态路由未加载 → 先拉取并注册，再重新进入当前路由
 * 2. 每次页面切换都刷新路由菜单数据（权限可能变化）
 * 3. 需要鉴权的路由 → 调 checkLogin 接口验证 Cookie 是否有效
 *    - 有效：同步 isAuthenticated = true，放行
 *    - 无效：同步 isAuthenticated = false，弹登录框，阻止导航
 * 4. 不需要鉴权的路由 → 静默同步登录状态（不阻止导航、不弹登录框），5 分钟内节流
 */
router.beforeEach(async (to, _from, next) => {
  // 移动端访问首页时重定向到移动版首页
  if (to.name === 'Home' && isMobileDevice()) {
    next({ name: 'HomeMobile', replace: true })
    return
  }
  // PC端访问移动版首页时重定向到PC首页
  if (to.name === 'HomeMobile' && !isMobileDevice()) {
    next({ name: 'Home', replace: true })
    return
  }

  // 动态路由只需加载一次，与登录状态无关
  if (!store.state.routesLoaded) {
    try {
      await store.dispatch('loadDynamicRoutes', router)
      next({ ...to, replace: true })
    } catch (err) {
      console.error('[router] 加载动态路由失败', err)
      // 即使接口失败也标记路由已加载，确保首页正常展示
      store.commit('SET_ROUTES_LOADED', true)
      // 首页不需要依赖动态路由接口，正常放行
      if (to.name === 'Home' || to.name === 'HomeMobile') {
        next()
      } else {
        next({ name: 'Home' })
      }
    }
    return
  }

  // 每次页面切换时静默刷新路由菜单数据（更新权限状态），不阻塞导航
  store.dispatch('refreshDynamicMenus')

  // 已登录用户访问登录页，如果带 resumeUpload=1 参数则放行（简历上传流程），否则跳转首页
  if (to.name === 'Login' && store.state.isAuthenticated) {
    if (to.query.resumeUpload === '1') {
      next()
    } else {
      next({ name: 'Home' })
    }
    return
  }

  // 不需要登录即可访问的页面白名单（首页、岗位列表/详情、校招公告列表/详情等）
  const publicPages: string[] = [
    'Home', 'HomeMobile', 'Login', 'SuperRjtfoewjksfewjLogin',
    'Jobs', 'JobDetail', 'Announcement', 'AnnouncementDetail',
    'MentorDetail', 'PrivacyPolicy',
  ]
  const isPublicPage = publicPages.includes(to.name as string)

  // 非白名单页面需要鉴权 — 通过接口校验登录状态
  if (!isPublicPage) {
    try {
      const res = await checkLogin()
      lastCheckTime = Date.now()
      if (res.code === '0' && res.data === true) {
        // Cookie 有效，同步前端状态
        store.commit('SET_AUTHENTICATED', true)

        // Agent 页面需要额外的会员权限判断
        if (to.name === 'Agent') {
          try {
            if (!store.state.memberStatus) {
              const memberRes = await fetchMemberStatus()
              if (memberRes.code === '0' && memberRes.data) {
                store.commit('SET_MEMBER_STATUS', memberRes.data)
              }
            }
            const status = store.state.memberStatus
            if (status && status.isMember && (status.memberType === 1 || status.memberType === 2)) {
              next()
            } else {
              store.commit('SET_SHOW_MEMBER_ACCESS_DIALOG', true)
              next(false)
            }
          } catch {
            store.commit('SET_SHOW_MEMBER_ACCESS_DIALOG', true)
            next(false)
          }
          return
        }

        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
  }

  // 白名单页面 — 静默同步登录状态（节流：5 分钟内不重复请求）
  if (Date.now() - lastCheckTime > CHECK_INTERVAL) {
    checkLogin()
      .then((res) => {
        lastCheckTime = Date.now()
        if (res.code === '0' && res.data === true) {
          store.commit('SET_AUTHENTICATED', true)
        } else {
          store.commit('SET_AUTHENTICATED', false)
        }
      })
      .catch(() => {
        store.commit('SET_AUTHENTICATED', false)
      })
  }

  next()
})

// 友盟统计 - SPA 路由切换上报页面浏览（PV）
router.afterEach((to) => {
  const _czc = (window as any)._czc || []
  _czc.push(['_trackPageview', to.fullPath, document.referrer])
})

export default router
