// =============================================================================
// 企微IT智能服务台 — H5用户端路由配置
// =============================================================================
// 说明：定义页面路由映射，包含：
//   1. 首页路由 → ChatView 聊天页面
//   2. 登录路由 → Login 登降级登录页（本地开发用）
//   3. 企微拦截路由 → WeworkOnly 非企微环境展示
//   4. OAuth2 路由守卫（企微UA检测 → OAuth2认证）
// =============================================================================

import { createRouter, createWebHistory } from 'vue-router'

// v0.5.2 优化:ChatView 是 99% 用户唯一访问的页面,改用静态 import
// 之前用 () => import() 懒加载,首次访问要二次下载 301KB 的 ChatView chunk
// → 表现为白屏→突然全显示
import ChatView from '@/views/ChatView.vue'
// v0.5.4 BC/DR 应急页(身份检测 + H5 右栏)
import EmergencyDispatcher from '@/views/EmergencyDispatcher.vue'
import H5PreviewView from '@/views/H5PreviewView.vue'

// --------------------------------------------------------------------------
// 企微环境检测工具函数
// --------------------------------------------------------------------------
/**
 * 检测当前浏览器是否在企业微信 WebView 中。
 *
 * 企微浏览器的 User-Agent 包含 "wxwork" 标识（移动端和桌面端均包含）。
 * 例如：
 *   - 企微桌面端：Mozilla/5.0 ... wxwork/4.1.22 ...
 *   - 企微移动端：Mozilla/5.0 (iPhone ... MicroMessenger/7.x ... wxwork/3.x ...
 *
 * @returns true 表示在企微环境内
 */
function isWeworkEnv(): boolean {
  if (typeof navigator === 'undefined') return false
  return /wxwork/i.test(navigator.userAgent)
}

// 路由配置
const routes = [
  {
    path: '/',
    name: 'ChatView',
    // v0.5.2:首页静态引入,避免 301KB chunk 二次下载导致白屏
    component: ChatView,
    meta: { title: 'IT智能服务台', requiresAuth: true },
  },
  {
    path: '/login',
    name: 'Login',
    component: () => import('@/views/Login.vue'),
    meta: { title: '登录', requiresAuth: false },
  },
  {
    path: '/wework-only',
    name: 'WeworkOnly',
    component: () => import('@/views/WeworkOnly.vue'),
    meta: { title: '请在企业微信中打开', requiresAuth: false },
  },
  // v0.5.4 BC/DR 应急页(身份检测 + 员工右栏视图)
  {
    path: '/emergency',
    name: 'EmergencyDispatcher',
    component: EmergencyDispatcher,
    meta: { title: '应急身份检测', requiresAuth: false },
  },
  {
    path: '/h5-preview',
    name: 'H5Preview',
    component: H5PreviewView,
    meta: { title: '员工自助', requiresAuth: false },
  },
  // 404 兜底：未匹配的路径重定向到首页
  {
    path: '/:pathMatch(.*)*',
    redirect: '/',
  },
]

// 创建路由实例
// createWebHistory: 使用 HTML5 History 模式，基础路径 /itdesk/（与IT数据平台共享域名）
const router = createRouter({
  history: createWebHistory('/itdesk/'),
  routes,
})

// --------------------------------------------------------------------------
// 路由守卫 — 企微环境检测 + 认证检查
// --------------------------------------------------------------------------
router.beforeEach(async (to, _from, next) => {
  // v0.5.4 应急页(身份检测 + 预览页)不需要企微 OAuth2 认证
  // 由 EmergencyDispatcher 自己调企微 JS-SDK 检测角色
  if (
    to.name === 'WeworkOnly' ||
    to.name === 'Login' ||
    to.name === 'EmergencyDispatcher' ||
    to.name === 'H5Preview'
  ) {
    next()
    return
  }

  // ========================================================================
  // Portal Token 传递：从 URL 参数 ?token=xxx 读取并保存到 localStorage
  // Bug #4 修复：使用 window.location.pathname 构造完整路径（含 base），
  // 确保 history.replaceState 生成的 URL 与实际路由一致（避免 /itdesk/ 缺失）。
  // 同时立即清除 URL 中的 token 参数，减少 token 泄露窗口期。
  // ========================================================================
  const urlSearchParams = new URLSearchParams(window.location.search)
  const urlToken = (to.query.token as string) || urlSearchParams.get('token')
  if (urlToken) {
    // 保存 token 到 H5 端 localStorage key
    localStorage.setItem('h5_token', urlToken)

    // Bug #4 修复：从 URLSearchParams 中移除 token，立即用 history.replaceState 清除
    urlSearchParams.delete('token')
    const remainingSearch = urlSearchParams.toString()
    const cleanUrl = remainingSearch
      ? `${window.location.pathname}?${remainingSearch}`
      : window.location.pathname
    window.history.replaceState({}, '', cleanUrl)
  }

  // 动态导入 employee store（在 token 处理之后导入，确保 token 已存入 localStorage）
  const { useEmployeeStore } = await import('@/stores/employee')
  const employeeStore = useEmployeeStore()

  // 如果从 Portal 传入了 token，让 store 同步读取
  if (urlToken) {
    // token 已存入 localStorage，重新初始化 store 中的 token 状态
    employeeStore.$patch({ token: urlToken })
  }

  // ========================================================================
  // 第一道防线：企微环境检测（非企微环境 → 拦截）
  // ========================================================================
  // 生产环境强制企微内访问；开发环境（localhost）跳过检测
  const isLocalhost = /^localhost(:\d+)?$/.test(window.location.hostname) || window.location.hostname === '127.0.0.1'
  if (!isLocalhost && !isWeworkEnv()) {
    // 如果有 token（从 Portal 传入），允许直接进入
    if (employeeStore.isAuthenticated) {
      next()
      return
    }
    next({ name: 'WeworkOnly' })
    return
  }

  // 获取 URL 中的 code 参数（企微 OAuth2 回调）
  // 优先使用 Vue Router 的 route.query（更可靠，不受 nginx 重写影响）
  // 降级使用 window.location.search（兜底，防止某些场景下 route.query 未解析）
  const code = (to.query.code as string) || new URLSearchParams(window.location.search).get('code')

  // 情况一：URL 中有 code 参数（企微 OAuth2 回调）
  if (code) {
    try {
      await employeeStore.handleOAuthCallback(code)
      // 清除 URL 中的 code 和 state 参数（OAuth2 回调参数），保留其他必要参数
      // Bug #4 修复：同 Portal Token，使用 URLSearchParams + window.location.pathname 构造 clean URL
      const codeSearchParams = new URLSearchParams(window.location.search)
      codeSearchParams.delete('code')
      codeSearchParams.delete('state')
      const remainingCodeSearch = codeSearchParams.toString()
      const cleanCodeUrl = remainingCodeSearch
        ? `${window.location.pathname}?${remainingCodeSearch}`
        : window.location.pathname
      window.history.replaceState({}, '', cleanCodeUrl)
      next()
    } catch (error) {
      console.error('[Router] OAuth2 授权失败:', error)
      const corpId = import.meta.env.VITE_WECOM_CORP_ID || ''
      if (corpId) {
        employeeStore.redirectToOAuth()
      } else {
        next({ name: 'Login' })
      }
    }
    return
  }

  // 情况二：检查是否已认证（必须有有效 token）
  if (employeeStore.isAuthenticated) {
    next()
    return
  }

  // 情况三：未登录 → 跳转登录页或 OAuth2
  const corpId = import.meta.env.VITE_WECOM_CORP_ID || ''
  if (corpId) {
    employeeStore.redirectToOAuth()
  } else {
    next({ name: 'Login' })
  }
})

export default router
