/* AI_CHANGELOG
| 日期 | Prompt | 变更 |
|------|--------|------|
| 2026-03-23 | 角色路由+页面权限守卫 | 新建公共权限守卫模块：ROLE_TABS/ROLE_HOME/PAGE_ROLES 映射、getVisibleTabs/getRoleHome/syncVisibleTabs/checkPageAccess 函数 |
| 2026-03-27 | 权限改造 W5 | 重写为权限码驱动：删除硬编码 PAGE_ROLES/ROLE_TABS/ROLE_HOME，改为从后端 permissions 动态计算页面/tab/首页可见性 |
*/
/**
 * 页面权限守卫 — 基于后端权限码的动态准入控制
 *
 * CHANGE 2026-03-27 | 权限改造
 * 后端为权限唯一真相源，前端根据 /api/xcx/me 返回的 permissions[] 动态决定：
 * - 页面可见性（PAGE_PERMISSION_MAP）
 * - tab 可见性（getVisibleTabs）
 * - 默认首页（getPermissionHome）
 */

import { request } from './request'

/**
 * 页面 → 所需权限码映射
 * 未列出的页面 = approved 即可访问（notes/chat/my-profile/dev-tools）
 */
const PAGE_PERMISSION_MAP: Record<string, string> = {
  // 任务体系 → view_tasks
  'pages/task-list/task-list': 'view_tasks',
  'pages/task-detail/task-detail': 'view_tasks',
  'pages/performance/performance': 'view_tasks',
  'pages/performance-records/performance-records': 'view_tasks',
  // 看板子页 → 各自权限码
  'pages/board-finance/board-finance': 'view_board_finance',
  'pages/board-customer/board-customer': 'view_board_customer',
  'pages/board-coach/board-coach': 'view_board_coach',
  // 详情页跟对应看板走
  'pages/customer-detail/customer-detail': 'view_board_customer',
  'pages/customer-service-records/customer-service-records': 'view_board_customer',
  'pages/coach-detail/coach-detail': 'view_board_coach',
}

/**
 * 根据权限码列表获取可见 tab
 * - 有 view_tasks → 显示 task tab
 * - 有 view_board 或任一 view_board_* → 显示 board tab
 * - my tab 始终显示
 */
export function getVisibleTabs(permissions: string[]): string[] {
  const tabs: string[] = []
  if (permissions.includes('view_tasks')) tabs.push('task')
  if (
    permissions.includes('view_board') ||
    permissions.includes('view_board_finance') ||
    permissions.includes('view_board_customer') ||
    permissions.includes('view_board_coach')
  ) {
    tabs.push('board')
  }
  tabs.push('my')
  return tabs
}

/**
 * 根据权限码列表获取默认首页
 *
 * CHANGE 2026-03-27 | 优先级调整：有看板权限优先去看板，纯任务角色才去 task-list
 * - coach（只有 view_tasks）→ task-list
 * - staff/head_coach/manager（有看板权限）→ 第一个可见看板页
 */
export function getPermissionHome(permissions: string[]): string {
  // 看板优先：按 finance > customer > coach 选第一个有权限的
  if (permissions.includes('view_board_finance')) return '/pages/board-finance/board-finance'
  if (permissions.includes('view_board_customer')) return '/pages/board-customer/board-customer'
  if (permissions.includes('view_board_coach')) return '/pages/board-coach/board-coach'
  // 无看板权限但有任务权限 → task-list（coach 场景）
  if (permissions.includes('view_tasks')) return '/pages/task-list/task-list'
  return '/pages/my-profile/my-profile'
}

/** 向后兼容：旧代码中 getRoleHome 的调用点 */
export function getRoleHome(_role: string | undefined): string {
  const app = getApp<IAppOption>()
  const perms = app.globalData.permissions || []
  return getPermissionHome(perms)
}

/**
 * 同步 globalData 中的 visibleTabs 和 permissions，并主动刷新 tab-bar
 */
export function syncPermissions(permissions: string[]): void {
  const app = getApp<IAppOption>()
  app.globalData.permissions = permissions
  app.globalData.visibleTabs = getVisibleTabs(permissions)

  // CHANGE 2026-03-27 | 主动刷新 tab-bar 组件
  // checkAuthStatus 异步完成时 tab-bar 可能已 attached 但读到了旧的 visibleTabs
  try {
    const pages = getCurrentPages()
    if (pages.length > 0) {
      const currentPage = pages[pages.length - 1] as any
      const tabBar = currentPage.getTabBar?.()
      if (tabBar && typeof tabBar._refreshTabs === 'function') {
        tabBar._refreshTabs()
      }
    }
  } catch {
    // getCurrentPages 在 onLaunch 早期可能不可用，静默忽略
  }
}

/** 向后兼容：旧代码中 syncVisibleTabs 的调用点 */
export function syncVisibleTabs(_role: string | undefined): void {
  // 由 syncPermissions 统一处理，此函数保留为空操作
  // 实际同步在 checkPageAccess 中通过 syncPermissions 完成
}

/**
 * 获取当前用户可见的看板二级 tab 列表
 * 用于看板页面动态显示/隐藏 finance/customer/coach tab
 */
export function getVisibleBoardTabs(): string[] {
  const app = getApp<IAppOption>()
  const perms = app.globalData.permissions || []
  const tabs: string[] = []
  if (perms.includes('view_board_finance')) tabs.push('finance')
  if (perms.includes('view_board_customer')) tabs.push('customer')
  if (perms.includes('view_board_coach')) tabs.push('coach')
  return tabs
}

/**
 * 页面权限守卫 — 在页面 onShow 中调用
 *
 * 返回 true 表示可以继续渲染，false 表示已跳转（页面应 return）。
 *
 * 检查顺序：
 * 1. 无 token → 跳登录页
 * 2. 请求 /api/xcx/me 获取最新状态、角色、权限码
 * 3. disabled → 清 token + 跳登录页（强制登出）
 * 4. 非 approved → 跳对应状态页
 * 5. 权限码不满足当前页面要求 → 跳默认首页
 */
export async function checkPageAccess(pagePath: string): Promise<boolean> {
  const token = wx.getStorageSync('token')
  if (!token) {
    wx.reLaunch({ url: '/pages/login/login' })
    return false
  }

  try {
    const data = await request({
      url: '/api/xcx/me',
      method: 'GET',
      needAuth: true,
    })

    const app = getApp<IAppOption>()
    const permissions: string[] = data.permissions || []

    app.globalData.authUser = {
      userId: data.userId,
      status: data.status,
      nickname: data.nickname,
      avatarUrl: data.avatarUrl || undefined,
      role: data.role || undefined,
    }
    wx.setStorageSync('userId', data.userId)
    wx.setStorageSync('userStatus', data.status)
    if (data.role) wx.setStorageSync('userRole', data.role)

    // CHANGE 2026-03-27 | 权限码驱动：同步权限和 tab 可见性
    syncPermissions(permissions)

    // 状态检查
    switch (data.status) {
      case 'disabled':
        wx.removeStorageSync('token')
        wx.removeStorageSync('refreshToken')
        app.globalData.token = undefined
        app.globalData.refreshToken = undefined
        wx.reLaunch({ url: '/pages/login/login' })
        return false
      case 'new':
        wx.reLaunch({ url: '/pages/apply/apply' })
        return false
      case 'pending':
        wx.reLaunch({ url: '/pages/reviewing/reviewing' })
        return false
      case 'rejected':
        wx.reLaunch({ url: '/pages/no-permission/no-permission' })
        return false
    }

    // approved — 基于权限码检查页面访问权限
    const requiredPerm = PAGE_PERMISSION_MAP[pagePath]
    if (requiredPerm && !permissions.includes(requiredPerm)) {
      // 无权限，跳到有权限的默认首页
      wx.reLaunch({ url: getPermissionHome(permissions) })
      return false
    }

    // approved 但无角色/无权限：放行 my-profile，其余跳 my-profile
    if (requiredPerm && permissions.length === 0) {
      if (pagePath === 'pages/my-profile/my-profile') return true
      wx.reLaunch({ url: '/pages/my-profile/my-profile' })
      return false
    }

    return true
  } catch {
    // 网络错误不阻塞（401 由 request.ts 处理）
    return true
  }
}
