/**
 * 共享类型守卫工具
 *
 * 提供通用的运行时类型检查函数，供所有模块复用。
 * 避免各模块重复定义 isRecord 等工具函数。
 */

import { Permissions, type Permission } from "@/shared/types/permissions"

/**
 * 判断值是否为非 null 对象（Record）。
 *
 * 用作 JSON 解析结果的类型收窄，避免使用 `as` 断言。
 */
export const isRecord = (v: unknown): v is Record<string, unknown> =>
  typeof v === "object" && v !== null

/**
 * 所有合法权限值的只读集合，用于运行时校验。
 */
const PERMISSION_VALUES: ReadonlySet<string> = new Set(Object.values(Permissions))

/**
 * 类型守卫：判断值是否为合法的 Permission 字符串。
 *
 * 替代 `value as Permission` 断言，确保运行时安全。
 */
export function isPermission(value: unknown): value is Permission {
  return typeof value === "string" && PERMISSION_VALUES.has(value)
}

/**
 * 安全转换：将 unknown 转为 Permission | null。
 * 合法返回值，非法返回 null。
 */
export function toPermission(value: unknown): Permission | null {
  return isPermission(value) ? value : null
}
