import { CommandGroup } from "./command-group.js";
import { CommandMatch } from "./command.js";
import { BotCommandScopeChat, Context, NextFunction } from "./deps.node.js";
import { SetMyCommandsParams } from "./mod.js";
import { BotCommandEntity } from "./types.js";
import { JaroWinklerOptions } from "./utils/jaro-winkler.js";
import { SetBotCommandsOptions } from "./utils/set-bot-commands.js";
export interface CommandsFlavor<C extends Context = Context> extends Context {
    /**
     * Sets the provided commands for the current chat.
     * Cannot be called on updates that don't have a `chat` property.
     *
     * [!IMPORTANT]
     * Calling this method with upperCased command names registered, will throw
     * @see https://core.telegram.org/bots/api#botcommand
     * @see https://core.telegram.org/method/bots.setBotCommands
     *
     * @example
     * ```typescript
     *  bot.hears("sudo", (ctx) =>
     *      ctx.setMyCommands(userCommands, adminCommands));
     *  bot.hears("logout", (ctx) =>
     *      ctx.setMyCommands(userCommands));
     *  bot.hears("example", (ctx) =>
     *      ctx.setMyCommands([aCommands, bCommands, cCommands]));
     * ```
     *
     * @param commands List of available commands
     * @returns Promise with the result of the operations
     */
    setMyCommands: (commands: CommandGroup<C> | CommandGroup<C>[], options?: SetBotCommandsOptions) => Promise<void>;
    /**
     * Returns the nearest command to the user input.
     * If no command is found, returns `null`.
     *
     * @param commands List of available commands
     * @param options Options for the Jaro-Winkler algorithm
     * @returns The nearest command or `null`
     */
    getNearestCommand: (commands: CommandGroup<C> | CommandGroup<C>[], options?: Omit<Partial<JaroWinklerOptions>, "language">) => string | null;
    /**
     * @param commands
     * @returns command entities hydrated with the custom prefixes
     */
    getCommandEntities: (commands: CommandGroup<C> | CommandGroup<C>[]) => BotCommandEntity[];
    /**
     * The matched command and the rest of the input.
     *
     * When matched command is a RegExp, a `match` property exposes the result of the RegExp match.
     */
    commandMatch: CommandMatch;
}
/**
 * Installs the commands flavor into the context.
 */
export declare function commands<C extends Context>(): (ctx: CommandsFlavor<C>, next: NextFunction) => Promise<void>;
/**
 * Static class for getting and manipulating {@link SetMyCommandsParams}.
 * The main function is {@link from}
 */
export declare class MyCommandParams {
    /**
       * Merges and serialize one or more Commands instances into a single array
       * of commands params that can be used to set the commands menu displayed to the user.
       * @example
          ```ts
          const adminCommands = new CommandGroup();
          const userCommands = new CommandGroup();
          adminCommands
              .command("do a",
                       "a description",
                       (ctx) => ctx.doA());
          userCommands
              .command("do b",
                       "b description",
                       (ctx) => ctx.doB());
          const mergedParams =
              MyCommandParams.from([a, b], someChatId);
          ```
       * @param commands An array of one or more Commands instances.
       * @returns an array of {@link SetMyCommandsParams} grouped by language
       */
    static from<C extends Context>(commands: CommandGroup<C>[], chat_id: BotCommandScopeChat["chat_id"]): {
        commandsParams: SetMyCommandsParams[];
        uncompliantCommands: import("./command-group.js").UncompliantCommand[];
    };
    /**
     * Iterates over an array of CommandsParams
     * merging their respective {@link SetMyCommandsParams.commands}
     * when they are from the same language and scope
     *
     * @param params a flattened array of commands params coming from one or more Commands instances
     * @returns an array containing all commands grouped by language
     */
    private static merge;
}
