/**
 * Основной класс приложения для создания мультиплатформенных приложений, которое будет работать с голосовыми навыками и чат-ботами одновременно.
 *
 * Предоставляет функциональность для:
 * - Управления конфигурацией приложения
 * - Работы с базой данных
 * - Обработки команд и интентов
 * - Логирования и сохранения данных
 *
 * Основные возможности:
 * - Поддержка множества платформ (Алиса, Маруся, Telegram, Viber, VK)
 * - Гибкая система конфигурации
 * - Управление командами и интентами
 * - Работа с базой данных
 * - Логирование и отладка
 *
 * @example
 * ```ts
 * import { AppContext } from 'umbot';
 * const appContext = new AppContext();
 * // Настройка конфигурации
 * appContext.setAppConfig({
 *   error_log: './logs',
 *   json: './data',
 *   isLocalStorage: true,
 *   // База данных опциональна
 *   db: {
 *     host: 'localhost',
 *     database: 'bot_db',
 *     user: 'admin',
 *     pass: 'password'
 *   }
 * });
 *
 * // Настройка параметров
 * appContext.setPlatformParams({
 *   welcome_text: 'Привет! Чем могу помочь?',
 *   help_text: 'Список доступных команд: ...',
 *   intents: [
 *     {
 *       name: 'greeting',
 *       slots: ['привет', 'здравствуй'],
 *       is_pattern: false
 *     },
 *     {
 *       name: 'numbers',
 *       slots: ['\\b\\d{3}\\b'],
 *       is_pattern: true // Явно указываем, что используем регулярное выражение
 *     }
 *   ]
 * });
 * ```
 */
import { IDatabaseAdapter, IDatabaseInfo, IPlatform } from './interfaces/IBot';
import { ILogger } from './interfaces/ILogger';
import { IAppConfig, IAppParam, TAppMode, THttpClient, TAppPlugin } from './interfaces/IAppContext';
import { CommandReg, ICommandParam, IGroupData, IStepParam } from './utils/CommandReg';
/**
 * Тип платформы: Автоопределение
 */
export declare const T_AUTO = "auto";
/**
 * Идентификатор интента приветствия
 */
export declare const WELCOME_INTENT_NAME = "welcome";
/**
 * Идентификатор интента помощи
 */
export declare const HELP_INTENT_NAME = "help";
/**
 * Внутренний класс для хранения состояния и конфигурации приложения.
 * Используется внутри Bot для хранения состояния и конфигурации
 *
 * @remarks
 * Разработчикам обычно НЕ нужно создавать экземпляры этого класса напрямую.
 * Вместо этого используйте методы класса {@link Bot}:
 * - `bot.getAppContext()` - получить доступ к контексту
 * - `bot.setAppConfig()` - настроить конфигурацию
 * - `bot.setPlatformParams()` - настроить параметры платформ
 *
 * Этот класс содержит:
 * - Конфигурацию приложения (IAppConfig)
 * - Параметры платформ (IAppParam)
 * - Регистрацию команд и интентов
 * - Логирование и метрики
 * - Подключение к БД
 *
 * @example
 * ```ts
 * // НЕ ТАК:
 * const appContext = new AppContext();
 *
 * // ТАК (правильно):
 * const bot = new Bot();
 * const appContext = bot.getAppContext(); // если нужен прямой доступ
 * ```
 */
export declare class AppContext<TDbInfo = IDatabaseInfo, TQuery = unknown> {
    #private;
    /**
     * Список подключенных платформ
     */
    platforms: IPlatform<TQuery>;
    /**
     * Список подключенных плагинов
     */
    plugins: TAppPlugin;
    /**
     * Информация по подключению к базе данных.
     */
    database: {
        /**
         * Адаптер для работы с базой данных
         */
        adapter?: IDatabaseAdapter;
        /**
         * Данные, необходимые адаптеру для работы
         */
        databaseInfo?: TDbInfo;
        /**
         * Флаг, определяющий вызывался метод для подключения к базе данных или нет
         */
        isSendConnect?: boolean;
    };
    /**
     * Все зарегистрированные команды и шаги
     */
    command: CommandReg;
    /**
     * Получение всех зарегистрированных команд
     */
    get commands(): Map<string, ICommandParam>;
    /**
     * Получение всех зарегистрированных шагов
     */
    get steps(): Map<string, IStepParam>;
    /**
     * Получение всех зарегистрированных команд, которые распределены по группам.
     * В группу добавляются только команды с регулярными выражениями.
     * Группы используются для оптимизации поиска нужной команды
     */
    get regexpGroup(): Map<string, IGroupData>;
    /**
     * Конфигурация приложения
     */
    appConfig: Required<IAppConfig>;
    /**
     * Параметры приложения
     */
    platformParams: IAppParam;
    /**
     * Кастомный HTTP-клиент для выполнения всех исходящих запросов фреймворка.
     * По умолчанию используется глобальный `fetch`.
     * Вы можете заменить его на любой совместимый клиент (например, axios, undici, got),
     * реализующий интерфейс:
     * ```ts
     * (input: RequestInfo, init?: RequestInit) => Promise<Response>
     * ```
     *      *  Это позволяет:
     * - добавлять retry-логику, таймауты, circuit breaker;
     * - внедрять tracing, метрики или логирование всех запросов;
     * - мокать сетевые вызовы в тестах;
     * - использовать альтернативные HTTP-библиотеки.
     * @example
     * ```ts
     * const bot = new Bot();
     * const ctx = bot.getAppContext();
     * ctx.httpClient = async (url, options) => {
     *   // добавляем таймаут 5 сек
     *   const controller = new AbortController();
     *   const id = setTimeout(() => controller.abort(), 5000);
     *   try {
     *     const res = await fetch(url, { ...options, signal: controller.signal });
     *     clearTimeout(id);
     *     return res;
     *   } catch (e) {
     *     clearTimeout(id);
     *     throw e;
     *   }
     * };
     *```
     */
    httpClient: THttpClient;
    /**
     * Определяет режим работы приложения
     */
    appMode: TAppMode;
    /**
     * Закрывает все подключения, для корректного завершения работы приложения
     */
    close(): Promise<void>;
    /**
     * Устанавливает конфигурацию приложения
     * @param {IAppConfig} config - Пользовательская конфигурация
     */
    setAppConfig(config: Partial<IAppConfig>): void;
    /**
     * Устанавливает параметры приложения
     * @param {IAppParam} params - Пользовательские параметры
     */
    setPlatformParams(params: IAppParam): void;
    /**
     * Позволяет установить свою реализацию для логирования
     * @param logger
     */
    setLogger(logger: ILogger | null): void;
    /**
     * Логирование информации
     * @param args
     */
    log(...args: unknown[]): void;
    /**
     * Логирование ошибки
     * @param str
     * @param meta
     */
    logError(str: string, meta?: Record<string, unknown>): void;
    /**
     * Возвращает флаг, который говорит о том необходимо собирать метрики или нет
     */
    get usedMetric(): boolean;
    /**
     * Логирование метрики
     * @param name - имя метрики
     * @param value - значение
     * @param label - Дополнительные метаданные
     */
    logMetric(name: string, value: unknown, label: Record<string, unknown>): void;
    /**
     * Логирование предупреждения
     * @param str
     * @param meta
     */
    logWarn(str: string, meta?: Record<string, unknown>): void;
    /**
     * Сохраняет данные в JSON файл
     * @param fileName - Имя файла
     * @param data - Данные для сохранения
     * @returns true в случае успешного сохранения
     */
    saveFileData(fileName: string, data: unknown): Promise<boolean>;
}
