/**
 * Модуль для упрощённого запуска приложения без boilerplate-кода.
 *
 * Предоставляет функцию {@link run}, которая автоматически инициализирует бота,
 * подключает платформы, настраивает базу данных и запускает сервер или тесты
 * в зависимости от выбранного режима (`dev`, `dev-online`, `prod`).
 *
 * Используйте этот модуль, если не требуется кастомная конфигурация HTTP-сервера
 * или сложная асинхронная инициализация.
 *
 * @packageDocumentation
 * @module build
 */
import { Bot, IAppConfig, IAppParam, TBotControllerClass, TPlugin } from './index';
import { IBotTestParams } from './test';
import { Server } from 'node:http';
/**
 * Режим работы приложения
 * @remarks
 * Определяет режим запуска и окружение приложения:
 * - dev: Запуск в режиме тестирования с использованием консоли в качестве тестового окружения.
 *   Удобно для локальной разработки и отладки.
 * - dev-online: Запуск в режиме тестирования с использованием webhook.
 *   Позволяет тестировать интеграции с внешними сервисами.
 * - prod: Запуск в релизном режиме для использования в продакшн среде.
 *   Все оптимизации включены, логирование минимально.
 */
export type TMode = 'dev' | 'dev-online' | 'prod';
/**
 * Настройки для приложения.
 */
export interface IConfig {
    /**
     * Конфигурация приложения.
     */
    appConfig?: IAppConfig;
    /**
     * Параметры приложения.
     */
    appParam?: IAppParam;
    /**
     * Контроллер, отвечающий за логику приложения.
     * В случае если контроллер не указан, то будет использоваться контроллер по умолчанию.
     */
    controller?: TBotControllerClass;
    /**
     * Параметры для тестового окружения. Стоит указывать когда mode = dev
     */
    testParams?: IBotTestParams;
    /**
     * Дополнительная логика для приложения, позволяющая дополнительно подключить различные плагины и адаптеры, добавить действие/шаг или выполнить любое другое действие по настройке приложения.
     * Стоит указывать когда нужно задать дополнительные настройки приложения.
     *
     * @example
     * ```ts
     * logic: (bot: Bot) => {
     *      bot.addCommand('my_command', ['my_slot'], (intent, bc) => { bc.text = 'OK'; }); // Добавляем команду
     * }
     * ```
     * @param bot
     */
    logic?: (bot: Bot) => void;
    /**
     * Список плагинов, которые будут подключены к приложению.
     * Стоит использовать, когда необходимо подключить различные платформы, адаптеры для работы с базой данных и тд.
     * По умолчанию включает все доступные платформы, и для работы с базой данных, будет использоваться либо `FileAdapter` (для работы с файловой базой), либо `MongoAdapter` (для MongoDb базы).
     * Необходимый адаптер будет подключен в зависимости от настроек приложения. Если были указаны настройки для подключения к базе данных, то будет использоваться `MongoAdapter`, в противном случае `FileAdapter`
     */
    plugins?: TPlugin[];
}
/**
 * Единая точка входа для запуска приложения — «из коробки» без boilerplate-кода.
 *
 * **Зачем это нужно?**
 * Вместо ручной инициализации (5-7 строк):
 * ```ts
 * const bot = new Bot();
 * bot.setAppConfig(config.appConfig || {});
 * bot.setPlatformParams(config.appParam);
 * bot.initBotController(config.controller);
 * bot.setAppMode('strict_prod');
 * bot.start(hostname, port);
 * ```
 *
 * Достаточно одного вызова:
 * ```ts
 * run(config, 'prod', '0.0.0.0', 8080);
 * ```
 *
 * **Когда использовать:**
 * - Стандартные сценарии запуска (локальная разработка, тестирование, продакшн)
 * - Когда используется встроенный HTTP-сервер фреймворка (`node:http.Server`)
 *
 * **Когда не использовать:**
 * - Нужен кастомный HTTP-сервер (Express, Fastify)
 * - Требуется сложная логика инициализации (асинхронная загрузка конфига и т.п.)
 *
 * @param config — конфигурация приложения (контроллер, параметры, плагины)
 * @param mode — режим работы ('dev' для консольных тестов, 'dev-online' для webhook-тестов, 'prod' для продакшна)
 * @param hostname — хост (по умолчанию 'localhost')
 * @param port — порт (по умолчанию 3000)
 * @returns В режиме 'dev' возвращает Promise<void>; в режимах 'dev-online' и 'prod' — объект Server (node:http.Server).
 *
 * @example
 * ```ts
 * // Запуск в режиме разработки
 * run({
 *   appConfig: { ... },
 *   appParam: { ... },
 *   controller: MyController,
 *   testParams: { ... }
 * }, 'dev');
 *
 * // Запуск в продакшн режиме
 * run({
 *   appConfig: { ... },
 *   appParam: { ... },
 *   controller: MyController
 * }, 'prod');
 * ```
 */
export declare function run(config: IConfig, mode?: TMode, hostname?: string, port?: number): Server | Promise<void>;
