import { AppContext, TAppType } from './core';
/**
 * Дополнительные опции для предзагрузчика
 */
export interface IOptions {
    /**
     * Пользователь Telegram, которому будет отправлено изображение для получения токена
     */
    telegramUseId?: string | number;
}
/**
 * Класс, предназначенный для предварительной загрузки медиаресурсов (изображений, звуков) для различных платформ.
 *
 * Этот класс позволяет загрузить файлы на серверы платформ и закэшировать их токены *до* начала обработки
 * пользовательских запросов, что помогает сократить время обработки пользовательского запроса при
 * первичной отправке медиафайлов в ответе.
 *
 * @example
 * // В точке входа приложения (например, index.ts)
 * import { Preload } from 'umbot/preload';
 *
 * // Предположим, appContext уже инициализирован
 * const preload = new Preload(appContext);
 *
 * // Загрузить изображения для Алисы и ВК
 * const imagePromises = preload.loadImages(['/path/to/img1.jpg', '/path/to/img2.png'], [T_ALISA, T_VK]);
 * // Загрузить звуки только для Маруси
 * const soundPromises = preload.loadSounds(['/path/to/sound1.mp3'], [T_MARUSIA]);
 *
 * // Запустить загрузку (все промисы выполняются параллельно)
 * try {
 *   await Promise.all(imagePromises);
 *   console.log('Изображения предзагружены');
 *   await Promise.all(soundPromises);
 *   console.log('Звуки предзагружены');
 * } catch (error) {
 *   console.error('Ошибка при предзагрузке:', error);
 * }
 *
 * // Теперь приложение готово к работе, и первые вызовы с медиа будут быстрыми
 * bot.start('localhost', 3000);
 */
export declare class Preload {
    private _appContext;
    private readonly _controller;
    /**
     * Создает экземпляр класса Preload.
     *
     * @param {AppContext} [appContext] - Контекст приложения, необходимый для доступа к БД и конфигурации.
     *                                   Может быть установлен позже через `setAppContext`.
     */
    constructor(appContext?: AppContext);
    /**
     * Устанавливает контекст приложения.
     *
     * @param {AppContext} [appContext] - Контекст приложения.
     */
    setAppContext(appContext?: AppContext): void;
    /**
     * Возвращает список платформ, для которых в конфигурации `AppContext` указаны токены.
     * Если передан массив `platforms`, результат фильтруется по этому списку.
     *
     * @param {TAppType[]} [platforms] - Массив типов платформ для фильтрации.
     * @returns {TAppType[]} Массив доступных платформ.
     */
    protected _getPlatforms(platforms?: TAppType[]): TAppType[];
    /**
     * Возвращает внутренний тип изображения, используемый в `ImageTokens`, для указанной платформы.
     *
     * @param {TAppType} platform - Тип платформы.
     * @returns {number | undefined} Тип изображения для `ImageTokens` или `undefined`, если платформа не поддерживается
     *                               или не требует предзагрузки (например, Telegram).
     */
    protected _getImageType(platform: TAppType): string | undefined;
    /**
     * Возвращает внутренний тип звука, используемый в `SoundTokens`, для указанной платформы.
     *
     * @param {TAppType} platform - Тип платформы.
     * @returns {number | undefined} Тип звука для `SoundTokens` или `undefined`, если платформа не поддерживается
     *                               или не требует предзагрузки (например, Telegram).
     */
    protected _getSoundType(platform: TAppType): string | undefined;
    /**
     * Подготавливает промисы для удаления изображений с серверов платформ и из базы данных.
     *
     * Этот метод *не запускает* выполнение промисов. Для выполнения удаления необходимо
     * использовать `Promise.all()` или `Promise.allSettled()` с возвращаемым массивом.
     *
     * @param {string[]} images - Массив путей к файлам изображений для удаления.
     * @param {TAppType[]} [platforms] - Массив типов платформ для фильтрации. Если не указан, обрабатываются все доступные.
     * @returns {Promise<boolean>[]} Массив промисов, каждый из которых разрешается `true` при успешном удалении
     *                              или `false` при ошибке.
     */
    removeImages(images: string[], platforms?: TAppType[]): Promise<boolean>[];
    /**
     * Подготавливает промисы для удаления звуков с серверов платформ и из базы данных.
     *
     * Этот метод *не запускает* выполнение промисов. Для выполнения удаления необходимо
     * использовать `Promise.all()` или `Promise.allSettled()` с возвращаемым массивом.
     *
     * @param {string[]} sounds - Массив путей к файлам звуков для удаления.
     * @param {TAppType[]} [platforms] - Массив типов платформ для фильтрации. Если не указан, обрабатываются все доступные.
     * @returns {Promise<boolean>[]} Массив промисов, каждый из которых разрешается `true` при успешном удалении
     *                              или `false` при ошибке.
     */
    removeSounds(sounds: string[], platforms?: TAppType[]): Promise<boolean>[];
    /**
     * Подготавливает промисы для загрузки и кэширования изображений для указанных платформ.
     *
     * Этот метод *не запускает* выполнение промисов. Для выполнения загрузки необходимо
     * использовать `Promise.all()` или `Promise.allSettled()` с возвращаемым массивом.
     *
     * @param {string[]} images - Массив путей к файлам изображений для загрузки.
     * @param {TAppType[]} [platforms] - Массив типов платформ для фильтрации. Если не указан, обрабатываются все доступные.
     * @param opts - Дополнительные опции для загрузки. Так как в Telegram не получить токен без отправки файла пользователю, можно отправить файл произвольному пользователю, который будет передан в свойстве.
     * @returns {Promise<(string | null)[]>[]} Массив промисов, каждый из которых разрешается токеном изображения
     *                                        или `null` в случае ошибки или если платформа не поддерживается.
     */
    loadImages(images: string[], platforms?: TAppType[], opts?: IOptions): Promise<string | null>[];
    /**
     * Подготавливает промисы для загрузки и кэширования звуков для указанных платформ.
     *
     * Этот метод *не запускает* выполнение промисов. Для выполнения загрузки необходимо
     * использовать `Promise.all()` или `Promise.allSettled()` с возвращаемым массивом.
     *
     * @param {string[]} sounds - Массив путей к файлам звуков для загрузки.
     * @param {TAppType[]} [platforms] - Массив типов платформ для фильтрации. Если не указан, обрабатываются все доступные.
     * @param opts - Дополнительные опции для загрузки. Так как в телеграм не получить токен без отправки файла пользователю, можно отправить файл произвольному пользователю, который будет передан в свойстве.
     * @returns {Promise<(string | null)[]>[]} Массив промисов, каждый из которых разрешается токеном звука
     *                                        или `null` в случае ошибки или если платформа не поддерживается.
     */
    loadSounds(sounds: string[], platforms?: TAppType[], opts?: IOptions): Promise<string | null>[];
}
