import { IStorage } from '../core';
import { CreateApiClientOptions, ExtractParamsType, ExtractResultType } from './types/api.interface';
import { CreateEndpoint, Endpoint as EndpointType, EndpointConfig } from './types/endpoint.interface';
import { QueryOptions, QueryResult } from './types/query.interface';
type EndpointsResult<F> = F extends (create: any) => Promise<infer R> ? R : never;
type EndpointsMap<EndpointsFn> = {
    [K in keyof EndpointsResult<EndpointsFn>]: EndpointType<ExtractParamsType<EndpointsResult<EndpointsFn>[K]>, ExtractResultType<EndpointsResult<EndpointsFn>[K]>>;
};
export declare class ApiClient<EndpointsFn extends (create: CreateEndpoint) => Promise<Record<string, EndpointConfig<any, any>>>> {
    /** Хранилище запросов */
    private queryStorage;
    /** Флаг завершённой инициализации */
    private _initialized;
    /** Промис текущей инициализации (для дедупликации параллельных вызовов) */
    private _initPromise;
    /** Снапшот для гидрации, отложенный до завершения init (если hydrate вызван раньше) */
    private _pendingHydration;
    private readonly cacheableHeaderKeys;
    private readonly globalCacheConfig;
    private readonly baseQueryConfig;
    private readonly storageExternal;
    private readonly globalRetryConfig;
    private readonly createEndpoints;
    /** Реестр эндпоинтов */
    private endpoints;
    constructor(options: Omit<CreateApiClientOptions, 'endpoints'> & {
        endpoints: EndpointsFn;
    });
    init(): Promise<this>;
    private _doInit;
    private initializeEndpoints;
    private ensureInitialized;
    /**
     * Получает все эндпоинты с улучшенной типизацией
     * @returns Типизированный объект эндпоинтов
     */
    getEndpoints(): EndpointsMap<EndpointsFn>;
    /**
     * Выполняет запрос к API с типизацией и обработкой ошибок
     * @param endpointName Имя эндпоинта (с подсказками TypeScript)
     * @param params Параметры запроса (с типизацией)
     * @param options Опции запроса
     * @returns Promise с типизированным результатом запроса
     */
    request<K extends keyof EndpointsResult<EndpointsFn> & string>(endpointName: K, params: ExtractParamsType<EndpointsResult<EndpointsFn>[K]>, options?: QueryOptions): Promise<QueryResult<ExtractResultType<EndpointsResult<EndpointsFn>[K]>, Error>>;
    /**
     * Снимок кэша для дегидрации (SSR: сервер → HTML → клиент).
     *
     * Возвращает всё состояние кэш-хранилища (записи API с абсолютными `expiresAt`,
     * поэтому TTL переживает перенос на клиент). Симметрично `dehydrateModule` для
     * synapse-модулей. Типичный серверный рецепт: `await api.request(...)` для
     * прогрева → `await api.dehydrate()` → сериализовать в HTML.
     */
    dehydrate(): Promise<Record<string, any>>;
    /**
     * Гидрация кэша снапшотом с сервера.
     *
     * - Вызванная ДО `init()` — снапшот запоминается и применяется сразу после
     *   создания хранилища (init не перезатрёт серверное состояние).
     * - Вызванная ПОСЛЕ `init()` — немедленно заменяет состояние кэша и
     *   перестраивает индекс тегов.
     *
     * После гидрации первый `request()`/`getCachedSync()` с теми же параметрами
     * попадёт в кэш — на клиенте не будет повторного сетевого запроса.
     */
    hydrate(state: Record<string, any>): Promise<this>;
    /**
     * Доступ к экземпляру хранилища кэша (для ручных сценариев SSR/отладки).
     */
    getStorage(): IStorage | null;
    destroy(): Promise<void>;
}
export {};
