import { Observable } from 'rxjs';
import type { IStorage } from '../../core';
import { TypedAction } from '../effects';
import type { ActionExecutionOptions } from './standalone';
/**
 * Расширенное API для middleware
 */
export interface EnhancedMiddlewareAPI<T extends Record<string, any>> {
    getState: () => T | Promise<T>;
    dispatch: (action: Action) => Promise<any>;
    storage: IStorage<T>;
    actions$: Observable<Action>;
    actions: Record<string, DispatchFunction<any, any>>;
    watchers: Record<string, WatcherFunction<any>>;
    findActionByType: (actionType: string) => DispatchFunction<any, any> | undefined;
    findWatcherByType: (actionType: string) => WatcherFunction<any> | undefined;
}
/**
 * Расширенное определение middleware
 */
export interface EnhancedMiddleware<T extends Record<string, any> = any> {
    (api: EnhancedMiddlewareAPI<T>): (next: (action: Action) => Promise<any>) => (action: Action) => Promise<any>;
}
/**
 * Базовая структура действия
 */
export interface Action<T = unknown> {
    type: string;
    payload?: T;
    meta?: Record<string, any>;
}
/**
 * Параметры для создания действия
 */
export interface ActionDefinition<TParams, TResult> {
    /** Тип действия для идентификации в потоке и эффектах. Если не указан — будет выведен из имени поля при финализации `Dispatcher`. */
    type?: string;
    /** Функция, выполняющая действие и возвращающая результат (payload) */
    action: (params: TParams) => Promise<TResult> | TResult;
    /** Дополнительные метаданные (опционально) */
    meta?: Record<string, any>;
}
/**
 * Определение типа для watcher'а
 */
interface WatcherDefinition<T, R> {
    /** Тип watcher'а для идентификации в потоке. Если не указан — будет выведен из имени поля при финализации `Dispatcher`. */
    type?: string;
    selector: (state: T) => R;
    meta?: Record<string, any>;
    shouldTrigger?: (prev: R | undefined, current: R) => boolean;
    notifyAfterSubscribe?: boolean;
}
/**
 * Тип для функции watcher
 */
export interface WatcherFunction<R> {
    (): Observable<TypedAction<R>>;
    actionType: string;
    meta?: Record<string, any>;
    unsubscribe: VoidFunction;
}
/**
 * Расширенная функция диспетчеризации
 */
export interface DispatchFunction<TParams, TResult> {
    /** Функция для вызова действия с параметрами */
    (params: TParams): Promise<TResult>;
    /** Тип действия для использования в эффектах */
    actionType: string;
    /** Метаданные действия */
    meta?: Record<string, any>;
    /** Внутренний тип для идентификации */
    _type?: 'dispatch' | 'watchers';
}
/**
 * Тип для фабрики создателей действий
 */
type ActionCreatorFactory = <TParams = void, TResult = void>(config: ActionDefinition<TParams, TResult>, executionOptions?: ActionExecutionOptions<TParams, TResult>) => DispatchFunction<TParams, TResult>;
/**
 * Извлекает тип результата из функции диспетчера
 */
export type ExtractResultType<T> = T extends DispatchFunction<any, infer R> ? R : never;
/**
 * Извлекает типы из функции настройки действий
 */
export type ActionsResult<F> = F extends (create: ActionCreatorFactory, storage: any, ...args: any[]) => infer R ? R : Record<string, DispatchFunction<any, any>>;
/**
 * Параметры для Dispatcher
 */
interface DispatcherOptions<T extends Record<string, any>> {
    storage: IStorage<T>;
    middlewares?: EnhancedMiddleware<T>[];
}
/**
 * Внутренний движок диспетчера для интеграции хранилищ с реактивной системой.
 *
 * Прежнее имя — `Dispatcher`. Переименован в `DispatcherCore`, поскольку публичным
 * `Dispatcher` теперь является abstract class-based слой (`dispatcher.base.ts`),
 * который строится поверх этого движка.
 *
 * `TActionsFn` — фантомный слот для вывода форм экшенов (`ActionsResult`); сам движок
 * его не использует в рантайме.
 */
export declare class DispatcherCore<T extends Record<string, any>, TActionsFn extends (...args: any[]) => any = (...args: any[]) => Record<string, DispatchFunction<any, any>>> {
    private actions$;
    readonly actions: Observable<Action>;
    dispatch: Record<string, DispatchFunction<any, any>>;
    watchers: Record<string, WatcherFunction<any>>;
    private storage;
    private middlewareFunctions;
    private dispatchChain;
    private actionRegistry;
    private actionParams;
    private middlewareAPI;
    /**
     * Создает новый экземпляр Dispatcher
     */
    constructor(options: DispatcherOptions<T>);
    /**
     * Добавляет middleware в цепочку обработки
     */
    use(...middlewares: EnhancedMiddleware<T>[]): this;
    /**
     * Base executor: runs the registered action handler or passes through
     */
    private baseExecute;
    /**
     * Executes action through middleware chain and emits to actions$ (single emission point)
     */
    private executeChain;
    /**
     * Rebuilds the pre-composed middleware chain. Called once on use(), not on every dispatch.
     */
    private rebuildChain;
    /**
     * Получает все действия с улучшенной типизацией
     */
    getActions(): ActionsResult<TActionsFn>;
    /**
     * Находит действие по типу
     */
    findActionByType(actionType: string): DispatchFunction<any, any> | undefined;
    /**
     * Находит наблюдатель по типу
     */
    findWatcherByType(actionType: string): WatcherFunction<any> | undefined;
    /**
     * Уничтожает dispatcher: отписывает watchers, завершает поток действий, очищает состояние
     */
    destroy(): void;
    /**
     * Создает действие
     */
    createAction<TParams = void, TResult = void>(actionConfig: ActionDefinition<TParams, TResult>, executionOptions?: ActionExecutionOptions<TParams, TResult>): DispatchFunction<TParams, TResult>;
    /**
     * Создает watcher для отслеживания изменений в хранилище
     */
    createWatcher<R>(config: WatcherDefinition<T, R>): WatcherFunction<R>;
}
export {};
