import { default as minimist } from 'minimist';
import { Assistant, ConversationContext } from '../interfaces';

export interface OptionParams {
    alias?: string;
    type?: 'string' | 'boolean';
    description?: string;
}
export declare class Option {
    name: string;
    alias?: string | undefined;
    type?: 'string' | 'boolean' | undefined;
    description: string | undefined;
    assistant: Assistant;
    constructor(name: string, opts?: OptionParams);
    toString(): string;
}
export interface CommandOptions {
    summary?: string | undefined;
    description?: string | undefined;
    required?: boolean;
    disabled?: boolean;
    raw?: boolean;
    default?: boolean;
}
export type ActionHandler = (ctx: ConversationContext, args: minimist.ParsedArgs & {
    raw: string[];
}) => Promise<unknown> | unknown;
export declare class Command {
    #private;
    /**
     * 命令名称
     */
    name: string;
    /**
     * 是否需要输入项
     */
    required: boolean;
    /**
     * 是否禁用
     */
    disabled?: boolean;
    /**
     * 是否默认命令
     */
    default?: boolean;
    /**
     * 父级指令
     */
    parent?: Command;
    constructor(name: string, options?: CommandOptions);
    get commands(): Map<string, Command>;
    summary(): string | undefined;
    summary(summary: string): Command;
    usage(): string;
    addCommand(command: Command): this;
    /**
     * @param name - 命令名称
     * @param options - 命令配置
     */
    add(cmd: Command): Command;
    add(name: string, options?: CommandOptions): Command;
    /**
     * @param name - 命令名称
     * @param options - 命令配置
     */
    register(name: string, action: ActionHandler): Command;
    register(name: string, options: CommandOptions, action: ActionHandler): Command;
    /**
     * @param name - 参数名
     * @param opts - 参数
     */
    option(name: string, opts?: OptionParams): this;
    /**
     * @param  argv - 原始参数
     * @returns 解析好的参数
     */
    protected parseArgs(argv: string[]): minimist.ParsedArgs & {
        raw: string[];
    };
    /**
     * @param handler - 处理函数
     * @returns
     */
    action(handler: ActionHandler): Promise<this>;
    /**
     * @param argv - 原始参数
     * @param params - 回应参数
     * @example
     *
     * ```sh
     * $ /mj --help
     * ```
     */
    parse(ctx: ConversationContext, argv: string[]): Promise<void> | void;
}
