/**
 * 身分组实例
 */
declare class Role {
  /**
   * 创建身分组
   * @param name 身份组名称，必须是唯一的并且不能含有@#[]{}<>()/|$%^&*!~`"'+=?\n\t\r\f\v
   * @param displayName 身份组显示名称(默认和name一样)
   */
  constructor(name: string, displayName?: string)

  /** 身份组名称 */
  name: string

  /** 身份组显示名称 */
  displayName: string

  /** 身份组优先级，越大越优先 */
  priority: number

  /** 身份组拥有的权限 */
  permissions: { name: string; enabled: boolean; extra: object }[]

  /** 身份组成员的Xuid */
  members: string[]

  /**
   * 检查身份组实例是否有效
   */
  isValid(): boolean

  /**
   * 检查身份组是否有指定成员
   * @param xuid 成员(玩家)的Xuid
   */
  hasMember(xuid: string): boolean

  /**
   * 添加成员到身份组
   * @param xuid 成员(玩家)的Xuid
   */
  addMember(xuid: string): void

  /**
   * 从身份组中移除成员
   * @param xuid 成员(玩家)的Xuid
   */
  removeMember(xuid: string): void

  /**
   * 检查身份组是否有指定权限
   * @param name 权限名称
   * @returns 是否有该权限
   */
  hasPermission(name: string): boolean

  /**
   * 设置身份组权限
   * @param name 权限名称，必须已经注册在PermInfoList中
   * @param enabled 权限是否开启
   * @param extraData 权限的额外数据
   */
  setPermission(name: string, enabled: boolean, extraData?: object): void

  /**
   * 移除身份组中的权限
   * @param name 权限名称
   */
  removePermission(name: string): void

  /**
   * 检查权限是否存在于身份组中
   * @param name 权限是否已经存在于身份组中
   *
   * 注意: 不同于hasPermission，这个方法会返回true只要权限已经存在于身份组，但权限不一定开启。
   */
  permissionExists(name: string): boolean
}

declare namespace Permission {
  /**
   * Get a role
   * @param name 身份组名称
   * @returns 身份组实例
   */
  function getRole(name: string): Role

  /**
   * Get or create a role
   * @param name 身份组名称，必须是唯一的并且不能含有@#[]{}<>()/|$%^&*!~`"'+=?\n\t\r\f\v
   * @returns 身份组实例
   */
  function getOrCreateRole(name: string): Role

  /**
   * 检查身份组是否存在
   * @param name 身份组名称
   */
  function roleExists(name: string): boolean

  /**
   * 删除身份组
   * @param name 身份组名称
   */
  function deleteRole(name: string): void

  /**
   * 注册权限
   * @param name 权限名，唯一且不包含空格或\t\n\r\f\v，形如namespace:name(至少有一个 `:`)
   * @param desc 权限描述
   */
  function registerPermission(name: string, desc: string): void

  /**
   * 检查权限是否存在
   * @param name 权限名称
   */
  function permissionExists(name: string): boolean

  /**
   * 检查玩家是否有指定权限
   * @param xuid 玩家Xuid
   * @param permName 权限名称
   */
  function checkPermission(xuid: string, permName: string): boolean

  /**
   * 检查玩家是否是指定身份组的成员
   * @param xuid 玩家Xuid
   * @param roleName 身份组名称
   */
  function isMemberOf(xuid: string, roleName: string): boolean

  /**
   * 获取玩家的身份组列表
   * @param xuid 玩家Xuid
   * @returns 此玩家的身份组列表
   */
  function getPlayerRoles(xuid: string): Role[]

  /**
   * 获取玩家的权限列表
   * @param xuid 玩家Xuid
   */
  function getPlayerPermissions(xuid: string): object[]

  /**
   * 保存数据
   */
  function saveData(): void
}
