import { Context, type FilteredContext } from '../context';
import type { Middleware, MiddlewareFn, MiddlewareList, MiddlewareObj, NextFn } from '../middleware';
import type { UpdateType } from '../network/api';
import type { Guard, MaybeArray, MaybePromise } from '../types';
import type { AsyncPredicate, DispatchResult, Predicate } from './modules';
import type { TriggerFn, Triggers } from './modules/triggers';
export type { AsyncPredicate, DispatchResult, Predicate, TriggerFn, Triggers, };
type UpdateFilter<Ctx extends Context> = UpdateType | Guard<Ctx['update']>;
/** Собирает цепочку обработчиков. Каждый обработчик продолжает её вызовом `next()`. */
export declare class Composer<Ctx extends Context> implements MiddlewareObj<Ctx> {
    private handler;
    constructor(...middlewares: MiddlewareList<Ctx>);
    /** Возвращает собранный обработчик для подключения к другой цепочке. */
    middleware(): MiddlewareFn<Ctx>;
    /** Добавляет обработчики в конец текущей цепочки. */
    use(...middlewares: MiddlewareList<Ctx>): this;
    /** Выполняет обработчики для событий указанных типов или прошедших type guard. */
    on<Filter extends UpdateType | Guard<Ctx['update']>>(filters: MaybeArray<Filter>, ...middlewares: MiddlewareList<FilteredContext<Ctx, Filter>>): this;
    /** Выполняет обработчики для команды в текстовом сообщении. */
    command(commands: Triggers<FilteredContext<Ctx, 'message_created'>>, ...middlewares: MiddlewareList<FilteredContext<Ctx, 'message_created'>>): this;
    /** Выполняет обработчики, когда текст сообщения совпал с триггером. */
    hears(triggers: Triggers<FilteredContext<Ctx, 'message_created'>>, ...middlewares: MiddlewareList<FilteredContext<Ctx, 'message_created'>>): this;
    /** Выполняет обработчики, когда `payload` нажатой кнопки совпал с триггером. */
    action(triggers: Triggers<FilteredContext<Ctx, 'message_callback'>>, ...middlewares: MiddlewareList<FilteredContext<Ctx, 'message_callback'>>): this;
    /** Проверяет событие по типу или type guard и уточняет тип Context. */
    filter<Filter extends UpdateFilter<Ctx>>(filters: MaybeArray<Filter>, ...middlewares: MiddlewareList<FilteredContext<Ctx, Filter>>): MiddlewareFn<Ctx>;
    /**
     * Прекращает обработку события, когда условие выполнено.
     * В противном случае вызывает следующий обработчик.
     */
    drop(predicate: Predicate<Ctx>): this;
    /**
     * Одновременно запускает переданный обработчик и оставшуюся цепочку.
     * Если одна из веток завершится с ошибкой, `fork` также завершится с ошибкой.
     */
    fork(middleware: Middleware<Ctx>): this;
    /**
     * Выполняет обработчик как дополнительное действие, а затем продолжает цепочку.
     * Подходит, например, для логирования или сбора метрик перед обработчиком.
     */
    tap(middleware: Middleware<Ctx>): this;
    /**
     * Выбирает обработчик отдельно для каждого события.
     * Выбор может зависеть от сессии, прав пользователя или других данных Context.
     */
    lazy(factory: (ctx: Ctx) => MaybePromise<Middleware<Ctx>>): this;
    /**
     * Выполняет только одну из двух веток по результату условия.
     * Выбранная ветка сама решает, продолжать ли общую цепочку через `next()`.
     */
    branch(predicate: boolean | Predicate<Ctx>, onTrue: Middleware<Ctx>, onFalse: Middleware<Ctx>): this;
    /**
     * Выполняет переданные обработчики, когда условие возвращает true.
     * Иначе сразу продолжает основную цепочку.
     */
    optional(predicate: Predicate<Ctx>, ...middlewares: MiddlewareList<Ctx>): this;
    /**
     * Выбирает обработчик по имени маршрута, вычисленному для текущего Context.
     * Маршрут может дополнить `ctx.state`; неизвестный маршрут обрабатывает `fallback`.
     */
    dispatch<Handlers extends Record<PropertyKey, Middleware<Ctx>>>(route: (ctx: Ctx) => MaybePromise<DispatchResult<keyof Handlers> | null | undefined>, handlers: Handlers, fallback?: Middleware<Ctx>): this;
    /** Сокращение для команды `/help`. */
    help(...middlewares: MiddlewareList<FilteredContext<Ctx, 'message_created'>>): this;
    /** Сокращение для команды `/settings`. */
    settings(...middlewares: MiddlewareList<FilteredContext<Ctx, 'message_created'>>): this;
    static flatten<C extends Context>(middleware: Middleware<C>): MiddlewareFn<C>;
    static unwrap<C extends Context>(middleware: Middleware<C>): MiddlewareFn<C>;
    static concat<C extends Context>(first: MiddlewareFn<C>, andThen: MiddlewareFn<C>): MiddlewareFn<C>;
    static pass<C extends Context>(ctx: C, next: NextFn): Promise<void>;
    static passThrough<C extends Context = Context>(): MiddlewareFn<C>;
    static compose<C extends Context>(middlewares: MiddlewareList<C>): MiddlewareFn<C>;
    /** Одновременно запускает переданный обработчик и оставшуюся цепочку. */
    static fork<C extends Context>(middleware: Middleware<C>): MiddlewareFn<C>;
    /** Выполняет дополнительное действие перед переходом к `next()`. */
    static tap<C extends Context>(middleware: Middleware<C>): MiddlewareFn<C>;
    /** Выбирает обработчик во время обработки каждого события. */
    static lazy<C extends Context>(factory: (ctx: C) => MaybePromise<Middleware<C>>): MiddlewareFn<C>;
    static log(logger: (message: string) => void): MiddlewareFn<Context>;
    /** Передаёт ошибки из указанной цепочки в `errorHandler`. */
    static catch<C extends Context>(errorHandler: (error: unknown, ctx: C) => MaybePromise<void>, ...middlewares: MiddlewareList<C>): MiddlewareFn<C>;
    /** Выполняет одну из двух веток в зависимости от условия. */
    static branch<C extends Context>(predicate: boolean | Predicate<C>, onTrue: Middleware<C>, onFalse: Middleware<C>): MiddlewareFn<C>;
    /** Выполняет цепочку при true и сразу вызывает `next()` при false. */
    static optional<C extends Context>(predicate: Predicate<C>, ...middlewares: MiddlewareList<C>): MiddlewareFn<C>;
    /** Прекращает обработку события при выполнении условия. */
    static drop<C extends Context>(predicate: Predicate<C>): MiddlewareFn<C>;
    /** Выбирает именованный обработчик или использует `fallback`. */
    static dispatch<C extends Context, Handlers extends Record<PropertyKey, Middleware<C>>>(route: (ctx: C) => MaybePromise<DispatchResult<keyof Handlers> | null | undefined>, handlers: Handlers, fallback?: Middleware<C>): MiddlewareFn<C>;
    static reply(...args: Parameters<Context['reply']>): MiddlewareFn<Context>;
}
