import type { DataScope } from "@/shared/types/permissions"

/**
 * scope 校验错误码。
 * 调用方应使用 next-intl 翻译键 `grades.action.scopeError.{code}` 转为用户可见消息。
 */
export type ScopeCheckErrorCode = "class_taught" | "class_members" | "denied"

/**
 * 校验给定 classId 是否在用户 DataScope 范围内。
 * 返回错误码表示拒绝访问；返回 null 表示允许。
 *
 * - `all` / `children` / `grade_managed`: 允许（children/grade_managed 在数据层做行级过滤）
 * - `class_taught` / `class_members`: classId 必须在 scope.classIds 中
 * - `owned`: 永远拒绝（owned scope 无 class 上下文）
 *
 * 注意：本函数为纯同步函数，**不能**放在 "use server" 文件中直接 export，
 * 否则 Next.js 会将其视为 Server Action 并要求 async。故独立到此文件。
 *
 * P1-4 重构：返回错误码而非硬编码字符串，由调用方通过 i18n 翻译。
 */
export function assertClassInScope(
  scope: DataScope,
  classId: string,
): ScopeCheckErrorCode | null {
  if (scope.type === "all") return null
  if (scope.type === "children") return null
  if (scope.type === "grade_managed") return null
  if (scope.type === "class_taught") {
    return scope.classIds.includes(classId) ? null : "class_taught"
  }
  if (scope.type === "class_members") {
    return scope.classIds.includes(classId) ? null : "class_members"
  }
  return "denied"
}
