import { CommandType, QueryType, EventType, CommandData, CommandResult, QueryParams, QueryResult, EventData, IMessageHandler, ICommand, IQuery, IEvent } from '../types';
import { TypeBus } from '../core/TypeBus';
/** ================================================================================
 * Builder for creating and registering command handlers with TypeBus-CQRS.
    ================================================================================  */
export declare class TypedCommandBuilder {
    /**
     * Creates and registers a command handler.
     * @template TCommandMap - Command map type
     * @template T - Command type key
     * @param {TypeBus<TCommandMap, any, any>} bus - The TypeBus-CQRS instance.
     * @param {T} commandType - The command type.
     * @param {(data: CommandData<TCommandMap, T>, aggregateId: string, metadata?: Record<string, any>) => Promise<CommandResult<TCommandMap, T>>} handlerLogic - The handler logic.
     * @returns {object} Command executor and handler meta.
     */
    static create<TCommandMap extends Record<string, any> = any, T extends CommandType<TCommandMap> = CommandType<TCommandMap>>(bus: TypeBus<TCommandMap, any, any>, commandType: T, handlerLogic: (data: CommandData<TCommandMap, T>, aggregateId: string, metadata?: Record<string, any>) => Promise<CommandResult<TCommandMap, T>>): {
        execute(data: CommandData<TCommandMap, T>, aggregateId: string, metadata?: Record<string, any>): Promise<CommandResult<TCommandMap, T>>;
        type: T;
        handler: IMessageHandler<ICommand<TCommandMap, T>, CommandResult<TCommandMap, T>>;
    };
}
/** ================================================================================
 * Builder for creating and registering query handlers with TypeBus-CQRS.
    ================================================================================  */
export declare class TypedQueryBuilder {
    /**
     * Creates and registers a query handler.
     * @template TQueryMap - Query map type
     * @template T - Query type key
     * @param {TypeBus<any, TQueryMap, any>} bus - The TypeBus-CQRS instance.
     * @param {T} queryType - The query type.
     * @param {(params: QueryParams<TQueryMap, T>, metadata?: Record<string, any>) => Promise<QueryResult<TQueryMap, T>>} handlerLogic - The handler logic.
     * @returns {object} Query executor and handler meta.
     */
    static create<TQueryMap extends Record<string, any> = any, T extends QueryType<TQueryMap> = QueryType<TQueryMap>>(bus: TypeBus<any, TQueryMap, any>, queryType: T, handlerLogic: (params: QueryParams<TQueryMap, T>, metadata?: Record<string, any>) => Promise<QueryResult<TQueryMap, T>>): {
        execute(params: QueryParams<TQueryMap, T>, metadata?: Record<string, any>): Promise<QueryResult<TQueryMap, T>>;
        type: T;
        handler: IMessageHandler<IQuery<TQueryMap, T>, QueryResult<TQueryMap, T>>;
    };
}
/** ================================================================================
 * Builder for creating and registering event handlers with TypeBus-CQRS.
    ================================================================================  */
export declare class TypedEventBuilder {
    /**
     * Creates and registers an event handler.
     * @template TEventMap - Event map type
     * @template T - Event type key
     * @param {TypeBus<any, any, TEventMap>} bus - The TypeBus-CQRS instance.
     * @param {T} eventType - The event type.
     * @param {(data: EventData<TEventMap, T>, aggregateId: string, version: number, metadata?: Record<string, any>) => Promise<void>} handlerLogic - The handler logic.
     * @returns {object} Event publisher and handler meta.
     */
    static create<TEventMap extends Record<string, any> = any, T extends EventType<TEventMap> = EventType<TEventMap>>(bus: TypeBus<any, any, TEventMap>, eventType: T, handlerLogic: (data: EventData<TEventMap, T>, aggregateId: string, version: number, metadata?: Record<string, any>) => Promise<void>): {
        publish(data: EventData<TEventMap, T>, aggregateId: string, version: number, metadata?: Record<string, any>): Promise<void>;
        type: T;
        handler: IMessageHandler<IEvent<TEventMap, T>, void>;
    };
}
/** ================================================================================
 * Builder for creating a batch of related commands, queries, and events.
    ================================================================================  */
export declare class BatchBuilder<TCommandMap extends Record<string, any> = any, TQueryMap extends Record<string, any> = any, TEventMap extends Record<string, any> = any> {
    private bus;
    private items;
    constructor(bus: TypeBus<TCommandMap, TQueryMap, TEventMap>);
    /**
     * Adds a command to the batch.
     * @template T - Command type key
     * @param {string} name - The name of the command.
     * @param {T} commandType - The command type.
     * @param {(data: CommandData<TCommandMap, T>, aggregateId: string, metadata?: Record<string, any>) => Promise<CommandResult<TCommandMap, T>>} handlerLogic - The handler logic.
     * @returns {BatchBuilder<TCommandMap, TQueryMap, TEventMap>}
     */
    addCommand<T extends CommandType<TCommandMap>>(name: string, commandType: T, handlerLogic: (data: CommandData<TCommandMap, T>, aggregateId: string, metadata?: Record<string, any>) => Promise<CommandResult<TCommandMap, T>>): this;
    /**
     * Adds a query to the batch.
     * @template T - Query type key
     * @param {string} name - The name of the query.
     * @param {T} queryType - The query type.
     * @param {(params: QueryParams<TQueryMap, T>, metadata?: Record<string, any>) => Promise<QueryResult<TQueryMap, T>>} handlerLogic - The handler logic.
     * @returns {BatchBuilder<TCommandMap, TQueryMap, TEventMap>}
     */
    addQuery<T extends QueryType<TQueryMap>>(name: string, queryType: T, handlerLogic: (params: QueryParams<TQueryMap, T>, metadata?: Record<string, any>) => Promise<QueryResult<TQueryMap, T>>): this;
    /**
     * Adds an event handler to the batch.
     * @template T - Event type key
     * @param {string} name - The name of the event handler.
     * @param {T} eventType - The event type.
     * @param {(data: EventData<TEventMap, T>, aggregateId: string, version: number, metadata?: Record<string, any>) => Promise<void>} handlerLogic - The handler logic.
     * @returns {BatchBuilder<TCommandMap, TQueryMap, TEventMap>}
     */
    addEventHandler<T extends EventType<TEventMap>>(name: string, eventType: T, handlerLogic: (data: EventData<TEventMap, T>, aggregateId: string, version: number, metadata?: Record<string, any>) => Promise<void>): this;
    /**
     * Builds the batch and returns an object with all executors.
     * @returns {object}
     */
    build(): Record<string, any>;
}
/** ================================================================================
 * Fluent API builder for TypeBus-CQRS.
    ================================================================================  */
export declare class FluentBuilder<TCommandMap extends Record<string, any> = any, TQueryMap extends Record<string, any> = any, TEventMap extends Record<string, any> = any> {
    private bus;
    constructor(bus: TypeBus<TCommandMap, TQueryMap, TEventMap>);
    /**
     * Creates a command with fluent API.
     * @template T - Command type key
     * @param {T} commandType - The command type.
     * @returns {object} Fluent command builder.
     */
    command<T extends CommandType<TCommandMap>>(commandType: T): {
        handle: (handlerLogic: (data: CommandData<TCommandMap, T>, aggregateId: string, metadata?: Record<string, any>) => Promise<CommandResult<TCommandMap, T>>) => {
            execute(data: CommandData<TCommandMap, T>, aggregateId: string, metadata?: Record<string, any> | undefined): Promise<CommandResult<TCommandMap, T>>;
            type: T;
            handler: IMessageHandler<ICommand<TCommandMap, T>, CommandResult<TCommandMap, T>>;
        };
    };
    /**
     * Creates a query with fluent API.
     * @template T - Query type key
     * @param {T} queryType - The query type.
     * @returns {object} Fluent query builder.
     */
    query<T extends QueryType<TQueryMap>>(queryType: T): {
        handle: (handlerLogic: (params: QueryParams<TQueryMap, T>, metadata?: Record<string, any>) => Promise<QueryResult<TQueryMap, T>>) => {
            execute(params: QueryParams<TQueryMap, T>, metadata?: Record<string, any> | undefined): Promise<QueryResult<TQueryMap, T>>;
            type: T;
            handler: IMessageHandler<IQuery<TQueryMap, T>, QueryResult<TQueryMap, T>>;
        };
    };
    /**
     * Creates an event handler with fluent API.
     * @template T - Event type key
     * @param {T} eventType - The event type.
     * @returns {object} Fluent event builder.
     */
    event<T extends EventType<TEventMap>>(eventType: T): {
        handle: (handlerLogic: (data: EventData<TEventMap, T>, aggregateId: string, version: number, metadata?: Record<string, any>) => Promise<void>) => {
            publish(data: EventData<TEventMap, T>, aggregateId: string, version: number, metadata?: Record<string, any> | undefined): Promise<void>;
            type: T;
            handler: IMessageHandler<IEvent<TEventMap, T>, void>;
        };
    };
    /**
     * Creates a batch builder.
     * @returns {BatchBuilder<TCommandMap, TQueryMap, TEventMap>}
     */
    batch(): BatchBuilder<TCommandMap, TQueryMap, TEventMap>;
}
/**
 * Creates and registers a command handler.
 * @template TCommandMap - Command map type
 * @template T - Command type key
 * @param {TypeBus<TCommandMap, any, any>} bus - The TypeBus-CQRS instance.
 * @param {T} commandType - The command type.
 * @param {(data: CommandData<TCommandMap, T>, aggregateId: string, metadata?: Record<string, any>) => Promise<CommandResult<TCommandMap, T>>} handlerLogic - The handler logic.
 * @returns {object} Command executor.
 */
export declare function createCommand<TCommandMap extends Record<string, any> = any, T extends CommandType<TCommandMap> = CommandType<TCommandMap>>(bus: TypeBus<TCommandMap, any, any>, commandType: T, handlerLogic: (data: CommandData<TCommandMap, T>, aggregateId: string, metadata?: Record<string, any>) => Promise<CommandResult<TCommandMap, T>>): {
    execute(data: CommandData<TCommandMap, T>, aggregateId: string, metadata?: Record<string, any> | undefined): Promise<CommandResult<TCommandMap, T>>;
    type: T;
    handler: IMessageHandler<ICommand<TCommandMap, T>, CommandResult<TCommandMap, T>>;
};
/**
 * Creates and registers a query handler.
 * @template TQueryMap - Query map type
 * @template T - Query type key
 * @param {TypeBus<any, TQueryMap, any>} bus - The TypeBus-CQRS instance.
 * @param {T} queryType - The query type.
 * @param {(params: QueryParams<TQueryMap, T>, metadata?: Record<string, any>) => Promise<QueryResult<TQueryMap, T>>} handlerLogic - The handler logic.
 * @returns {object} Query executor.
 */
export declare function createQuery<TQueryMap extends Record<string, any> = any, T extends QueryType<TQueryMap> = QueryType<TQueryMap>>(bus: TypeBus<any, TQueryMap, any>, queryType: T, handlerLogic: (params: QueryParams<TQueryMap, T>, metadata?: Record<string, any>) => Promise<QueryResult<TQueryMap, T>>): {
    execute(params: QueryParams<TQueryMap, T>, metadata?: Record<string, any> | undefined): Promise<QueryResult<TQueryMap, T>>;
    type: T;
    handler: IMessageHandler<IQuery<TQueryMap, T>, QueryResult<TQueryMap, T>>;
};
/**
 * Creates and registers an event handler.
 * @template TEventMap - Event map type
 * @template T - Event type key
 * @param {TypeBus<any, any, TEventMap>} bus - The TypeBus-CQRS instance.
 * @param {T} eventType - The event type.
 * @param {(data: EventData<TEventMap, T>, aggregateId: string, version: number, metadata?: Record<string, any>) => Promise<void>} handlerLogic - The handler logic.
 * @returns {object} Event publisher.
 */
export declare function createEventHandler<TEventMap extends Record<string, any> = any, T extends EventType<TEventMap> = EventType<TEventMap>>(bus: TypeBus<any, any, TEventMap>, eventType: T, handlerLogic: (data: EventData<TEventMap, T>, aggregateId: string, version: number, metadata?: Record<string, any>) => Promise<void>): {
    publish(data: EventData<TEventMap, T>, aggregateId: string, version: number, metadata?: Record<string, any> | undefined): Promise<void>;
    type: T;
    handler: IMessageHandler<IEvent<TEventMap, T>, void>;
};
/**
 * Creates a fluent API builder.
 * @template TCommandMap - Command map type
 * @template TQueryMap - Query map type
 * @template TEventMap - Event map type
 * @param {TypeBus<TCommandMap, TQueryMap, TEventMap>} bus - The TypeBus-CQRS instance.
 * @returns {FluentBuilder<TCommandMap, TQueryMap, TEventMap>}
 */
export declare function createFluentBuilder<TCommandMap extends Record<string, any> = any, TQueryMap extends Record<string, any> = any, TEventMap extends Record<string, any> = any>(bus: TypeBus<TCommandMap, TQueryMap, TEventMap>): FluentBuilder<TCommandMap, TQueryMap, TEventMap>;
//# sourceMappingURL=TypedBuilders.d.ts.map