/// <reference path="../../index.d.ts" />

/**
 * ### 🎯 指令对象
 *
 * 通过对接 BDS 内置的命令系统，你注册的命令可以由玩家、控制台、命令方块、NPC等各种游戏中可以执行命令的对象所使用，\
 * 在 addon 中，也可以使用这里所注册的命令。
 *
 * 通过指令对象，你可以为这个命令注册各式各样的形式、功能。
 *
 * 该类**没有构造函数**，请使用{@linkcode mc.newCommand()}创建
 *
 * @see [🎯 命令注册API](https://docs.litebds.com/zh-Hans/#/LLSEPluginDevelopment/GameAPI/Command)
 */
declare class Command {
  readonly name: string

  readonly registered: boolean

  /**
   * ### 设置指令别名
   *
   * @param alias 指令别名
   *
   * @returns 是否成功设置
   */
  setAlias(alias: string): boolean

  /**
   * ### 新增一个指令枚举选项
   *
   * @param name 枚举名，用于设置参数时区分枚举
   * @param values 枚举的有效值
   *
   * @returns 是否成功设置
   */
  setEnum(name: string, values: string[]): boolean

  /**
   * ### 新增一个必选参数
   *
   * @param name 参数名，用于执行指令时识别参数
   * @param type 命令参数类型
   * @param enumName 枚举名（仅 `ParamType` 为 `Enum` 时有效，用于区分枚举选项）
   * @param identifier 参数标识，特殊情况下用于唯一识别参数，一般可用 `enumName` 或 `name` 代替
   * @param enumOptions 参数选项，设置为 `1` 可在指令提示中展开枚举选项，如 `<action : TagChangeAction>` 会变成 `<add|remove>`
   *
   * @returns 是否成功设置
   */
  mandatory(
    name: string,
    type: ParamType,
    enumName?: string,
    enumOptions?: number,
  ): boolean

  mandatory(
    name: string,
    type: ParamType,
    enumName?: string,
    identifier?: string,
    enumOptions?: number,
  ): boolean

  /**
   * ### 新增一个可选参数
   *
   * @param name 参数名，用于执行指令时识别参数
   * @param type 命令参数类型
   * @param enumName 枚举名（仅 `ParamType` 为 `Enum` 时有效，用于区分枚举选项）
   * @param identifier 参数标识，特殊情况下用于唯一识别参数，一般可用 `enumName` 或 `name` 代替
   * @param enumOptions 参数选项，设置为 `1` 可在指令提示中展开枚举选项，如 `<action : TagChangeAction>` 会变成 `<add|remove>`
   *
   * @returns 是否成功设置
   */
  optional(
    name: string,
    type: ParamType,
    enumName?: string,
    identifier?: string,
    enumOptions?: number,
  ): boolean

  setSoftEnum(arg1: string, arg2: string[]): string

  addSoftEnumValues(arg1: string, arg2: string[]): boolean

  removeSoftEnumValues(arg1: string, arg2: string[]): boolean

  getSoftEnumValues(arg1: string): string[]

  getSoftEnumNames(): string[]

  /**
   * ### 新增一条指令重载
   *
   * **编者注**：必须在调用{@linkcode Command.setup()}前调用此函数，否则会报错
   *
   * 指令重载是 BDS 区分不同指令形式的方法，每一种不同的指令形式对应着一种指令重载。
   *
   * 如你所见，指令重载中提供的各项参数名组成了一种新的指令形式
   *
   * @param params 参数标识符，重载所用到的参数列表，可用 参数标识符、枚举名、参数名。
   *
   * 注意不能使用无法区分具体参数的标识符，如两个参数都叫 `action` 但枚举选项不同，此时应该使用枚举名而不是参数名
   *
   * @returns  是否成功设置
   */
  overload(params?: string[]): boolean

  /**
   * ### 设置指令回调
   *
   * @param callback 注册的这个命令被执行时，接口自动调用的回调函数。
   *
   * @returns 是否成功设置
   */
  setCallback(
    callback: (
      cmd: Command,
      origin: CommandOrigin,
      output: CommandOutput,
      result: any,
    ) => void,
  ): boolean

  /**
   * ### 安装指令
   *
   * **编者注**：请在调用此函数前调用{@linkcode Command.overload()}，否则会报错
   *
   * @returns 是否成功安装
   */
  setup(): boolean
}
