/**
 * 权限检查工具
 * 用于前端路由守卫和组件级权限控制
 */

import { authManager } from './auth'

// 缓存团队成员关系
const teamMembershipCache = new Map<number, boolean>()
// 缓存课程访问权限
const courseAccessCache = new Map<number, boolean>()

// 缓存过期时间（5分钟）
const CACHE_TTL = 5 * 60 * 1000
let lastCacheUpdate = 0

/**
 * 清除权限缓存
 */
export function clearPermissionCache() {
  teamMembershipCache.clear()
  courseAccessCache.clear()
  lastCacheUpdate = 0
}

/**
 * 检查缓存是否过期
 */
function isCacheExpired(): boolean {
  return Date.now() - lastCacheUpdate > CACHE_TTL
}

/**
 * 更新缓存时间戳
 */
function updateCacheTimestamp() {
  lastCacheUpdate = Date.now()
}

/**
 * 检查用户是否属于指定团队
 * @param teamId 团队ID
 */
export async function checkTeamMembership(teamId: number): Promise<boolean> {
  // 管理员可以访问所有团队
  if (authManager.isAdmin()) {
    return true
  }

  // 检查缓存
  if (!isCacheExpired() && teamMembershipCache.has(teamId)) {
    return teamMembershipCache.get(teamId)!
  }

  try {
    const currentUser = authManager.getCurrentUser()
    if (!currentUser) {
      return false
    }

    // 检查用户的团队列表
    const userTeams = currentUser.teams || []
    const isMember = userTeams.some((team: any) => team.id === teamId)

    // 更新缓存
    teamMembershipCache.set(teamId, isMember)
    updateCacheTimestamp()

    return isMember
  } catch (error) {
    console.error('检查团队成员身份失败:', error)
    return false
  }
}

/**
 * 检查用户是否可以访问指定课程
 * @param courseId 课程ID
 */
export async function checkCourseAccess(courseId: number): Promise<boolean> {
  // 管理员和经理可以访问所有课程
  if (authManager.isAdmin() || authManager.isManager()) {
    return true
  }

  // 检查缓存
  if (!isCacheExpired() && courseAccessCache.has(courseId)) {
    return courseAccessCache.get(courseId)!
  }

  try {
    // 简化检查：学员可以访问所有已发布的课程
    // 后端会在 API 层面做更细粒度的权限控制
    // 这里暂时放行，让后端决定是否返回 403
    const hasAccess = true

    // 更新缓存
    courseAccessCache.set(courseId, hasAccess)
    updateCacheTimestamp()

    return hasAccess
  } catch (error) {
    console.error('检查课程访问权限失败:', error)
    return false
  }
}

/**
 * 检查用户是否有某个权限
 * @param permission 权限代码
 */
export function hasPermission(permission: string): boolean {
  return authManager.hasPermission(permission)
}

/**
 * 检查用户是否有任意一个权限
 * @param permissions 权限代码列表
 */
export function hasAnyPermission(permissions: string[]): boolean {
  return authManager.hasAnyPermission(permissions)
}

/**
 * 检查用户是否有所有权限
 * @param permissions 权限代码列表
 */
export function hasAllPermissions(permissions: string[]): boolean {
  return authManager.hasAllPermissions(permissions)
}

/**
 * 获取用户的所有权限
 */
export function getUserPermissions(): string[] {
  return authManager.getUserPermissions()
}

/**
 * 权限检查结果接口
 */
export interface PermissionCheckResult {
  allowed: boolean
  reason?: string
}

/**
 * 综合权限检查
 * @param options 检查选项
 */
export async function checkPermission(options: {
  teamId?: number
  courseId?: number
  userId?: number
  permissions?: string[]
  roles?: string[]
}): Promise<PermissionCheckResult> {
  const { teamId, courseId, userId, permissions, roles } = options

  // 检查角色
  if (roles && roles.length > 0) {
    const userRole = authManager.getUserRole()
    if (!userRole || (!roles.includes(userRole) && !authManager.isAdmin())) {
      return { allowed: false, reason: '角色权限不足' }
    }
  }

  // 检查权限
  if (permissions && permissions.length > 0) {
    if (!hasAnyPermission(permissions)) {
      return { allowed: false, reason: '缺少必要权限' }
    }
  }

  // 检查用户ID（只能访问自己的数据）
  if (userId !== undefined) {
    const currentUser = authManager.getCurrentUser()
    if (!authManager.isAdmin() && currentUser?.id !== userId) {
      return { allowed: false, reason: '无权访问其他用户数据' }
    }
  }

  // 检查团队成员身份
  if (teamId !== undefined) {
    const isMember = await checkTeamMembership(teamId)
    if (!isMember) {
      return { allowed: false, reason: '不是该团队成员' }
    }
  }

  // 检查课程访问权限
  if (courseId !== undefined) {
    const hasAccess = await checkCourseAccess(courseId)
    if (!hasAccess) {
      return { allowed: false, reason: '无权访问该课程' }
    }
  }

  return { allowed: true }
}

export default {
  clearPermissionCache,
  checkTeamMembership,
  checkCourseAccess,
  hasPermission,
  hasAnyPermission,
  hasAllPermissions,
  getUserPermissions,
  checkPermission,
}
