import { IVkApi, IVkDocSave, IVkParams, IVkParamsUsersGet, IVkPhotosSave, IVKSendMessage, IVkUploadFile, IVkUploadServer, IVkUsersGet, TVkDocType, TVkPeerId } from './interfaces';
import { AppContext, Request } from '../../../index';
/**
 * Класс для взаимодействия с API ВКонтакте
 * Предоставляет методы для отправки сообщений, загрузки файлов и работы с другими функциями API
 * @see (https://vk.ru/dev/bots_docs) Смотри тут
 *
 * @example
 * ```ts
 * import { VkRequest } from './api/VkRequest';
 *
 * // Создание экземпляра
 * const vk = new VkRequest();
 * vk.initToken('your-vk-token');
 *
 * // Отправка простого сообщения
 * await vk.messagesSend(12345, 'Привет!');
 *
 * // Отправка сообщения с клавиатурой
 * const keyboard = {
 *   one_time: true,
 *   buttons: [[{
 *     action: {
 *       type: 'text',
 *       label: 'Кнопка',
 *       payload: '{"button": 1}'
 *     },
 *     color: 'primary'
 *   }]]
 * };
 *
 * await vk.messagesSend(12345, 'Выберите действие:', {
 *   keyboard: JSON.stringify(keyboard)
 * });
 *
 * // Загрузка и отправка фото
 * const server = await vk.photosGetMessagesUploadServer(12345);
 * if (server) {
 *   const upload = await vk.upload(server.upload_url, 'path/to/photo.jpg');
 *   if (upload) {
 *     const photo = await vk.photosSaveMessagesPhoto(
 *       upload.photo,
 *       upload.server,
 *       upload.hash
 *     );
 *     if (photo) {
 *       await vk.messagesSend(12345, 'Фото:', {
 *         attachments: [`photo${photo.owner_id}_${photo.id}`]
 *       });
 *     }
 *   }
 * }
 * ```
 */
export declare class VkRequest {
    #private;
    /**
     * Экземпляр класса для выполнения HTTP-запросов
     */
    protected _request: Request;
    /**
     * Текст последней возникшей ошибки
     */
    protected _error: object | string | null;
    /**
     * Токен доступа к VK API
     */
    token: string | null;
    /**
     * Флаг для прямой передачи содержимого файла
     * По умолчанию: false
     */
    isAttachContent: boolean;
    /**
     * Контекст приложения.
     */
    protected _appContext: AppContext;
    /**
     * Создает экземпляр класса для работы с API ВКонтакте
     * Устанавливает токен из конфигурации приложения, если он доступен
     */
    constructor(appContext: AppContext);
    /**
     * Инициализирует токен доступа к VK API
     * @param token Токен доступа к VK API
     */
    initToken(token: string): void;
    /**
     * Выполняет вызов метода VK API
     * @param method Название метода VK API
     * @returns Результат выполнения метода или null при ошибке
     */
    call<T extends IVkApi>(method: string): Promise<T | null>;
    /**
     * Загружает файл на сервера ВКонтакте
     * @param url URL для загрузки файла
     * @param file Путь к файлу или его содержимое
     * @returns Информация о загруженном файле или null при ошибке
     *
     * @remarks
     * Для фотографий возвращает:
     * - photo: строка, содержащая информацию о фото
     * - server: строка, идентификатор сервера
     * - hash: строка, хеш загруженного файла
     *
     * Для документов возвращает:
     * - file: строка, информация о загруженном файле
     *
     * @example
     * ```ts
     * // Загрузка фото
     * const server = await vk.photosGetMessagesUploadServer(12345);
     * if (server) {
     *   const upload = await vk.upload(server.upload_url, 'photo.jpg');
     *   if (upload) {
     *     const photo = await vk.photosSaveMessagesPhoto(
     *       upload.photo,
     *       upload.server,
     *       upload.hash
     *     );
     *   }
     * }
     *
     * // Загрузка документа
     * const server = await vk.docsGetMessagesUploadServer(12345, 'doc');
     * if (server) {
     *   const upload = await vk.upload(server.upload_url, 'document.pdf');
     *   if (upload) {
     *     const doc = await vk.docsSave(
     *       upload.file,
     *       'Документ',
     *       'тег1,тег2'
     *     );
     *   }
     * }
     * ```
     */
    upload(url: string, file: string): Promise<IVkUploadFile | null>;
    /**
     * Отправляет сообщение пользователю или в чат
     * @param peerId Идентификатор получателя:
     * - ID пользователя (например, "12345")
     * - ID чата: 2000000000 + chat_id (например, для чата 1: 2000000001)
     * - ID сообщества: -ID сообщества (например, "-123456789")
     * @param message Текст сообщения
     * @param params Дополнительные параметры:
     * - random_id: уникальный ID для избежания повторов
     * - attachment: медиавложения в формате "<type><owner_id>_<media_id>"
     *   Примеры:
     *   - Фото: "photo123456_789"
     *   - Документ: "doc123456_789"
     *   - Аудио: "audio123456_789"
     *   - Видео: "video123456_789"
     * - keyboard: клавиатура в JSON формате или строкой
     * - template: шаблон карусели в JSON формате или строкой
     *
     * @example
     * ```ts
     * // Простое сообщение
     * await vk.messagesSend(12345, 'Привет!');
     *
     * // Сообщение с вложениями
     * await vk.messagesSend(12345, 'Фото:', {
     *   attachments: ['photo123_456', 'doc123_456']
     * });
     *
     * // Сообщение с клавиатурой
     * const keyboard = {
     *   one_time: true,
     *   buttons: [[{
     *     action: {
     *       type: 'text',
     *       label: 'Кнопка',
     *       payload: '{"button": 1}'
     *     },
     *     color: 'primary'
     *   }]]
     * };
     * await vk.messagesSend(12345, 'Выберите:', {
     *   keyboard: JSON.stringify(keyboard)
     * });
     *
     * // Сообщение с каруселью
     * const template = {
     *   type: 'carousel',
     *   elements: [{
     *     title: 'Заголовок',
     *     description: 'Описание',
     *     photo_id: '-123456_789',
     *     buttons: [{
     *       action: {
     *         type: 'text',
     *         label: 'Кнопка',
     *         payload: '{"button": 1}'
     *       }
     *     }]
     *   }]
     * };
     * await vk.messagesSend(12345, '', {
     *   template: JSON.stringify(template)
     * });
     * ```
     *
     * @returns Информация об отправленном сообщении или null при ошибке
     */
    messagesSend(peerId: TVkPeerId, message: string, params?: IVkParams | null): Promise<IVKSendMessage | null>;
    /**
     * Получает информацию о пользователе или списке пользователей
     * @param userId ID пользователя или массив ID
     * @param params Дополнительные параметры запроса
     * @returns Информация о пользователях или null при ошибке
     */
    usersGet(userId: TVkPeerId | string[], params?: IVkParamsUsersGet | null): Promise<IVkUsersGet | null>;
    /**
     * Получает URL для загрузки фотографий в сообщения
     * @param peerId ID получателя сообщения
     * @returns Данные для загрузки или null при ошибке
     */
    photosGetMessagesUploadServer(peerId: TVkPeerId): Promise<IVkUploadServer | null>;
    /**
     * Сохраняет загруженную фотографию в сообщениях
     * @param photo Идентификатор фотографии
     * @param server Идентификатор сервера
     * @param hash Хэш-сумма фотографии
     * @returns Информация о сохраненной фотографии или null при ошибке
     */
    photosSaveMessagesPhoto(photo: string, server: string, hash: string): Promise<IVkPhotosSave[] | null>;
    /**
     * Получает URL для загрузки документов в сообщения
     * @param peerId ID получателя сообщения
     * @param type Тип документа:
     * - 'doc': обычный документ (PDF, ZIP и т.д.)
     * - 'audio_message': голосовое сообщение
     * - 'graffiti': граффити
     * @returns Данные для загрузки или null при ошибке
     *
     * @example
     * ```ts
     * // Загрузка обычного документа
     * const server = await vk.docsGetMessagesUploadServer(12345, 'doc');
     *
     * // Загрузка голосового сообщения
     * const server = await vk.docsGetMessagesUploadServer(12345, 'audio_message');
     *
     * // Загрузка граффити
     * const server = await vk.docsGetMessagesUploadServer(12345, 'graffiti');
     * ```
     */
    docsGetMessagesUploadServer(peerId: TVkPeerId, type: TVkDocType): Promise<IVkUploadServer | null>;
    /**
     * Сохраняет загруженный документ
     * @param file Идентификатор документа
     * @param title Название документа
     * @param tags Теги документа
     * @returns Информация о сохраненном документе или null при ошибке
     */
    docsSave(file: string, title: string, tags?: string | null): Promise<IVkDocSave | null>;
    /**
     * Записывает информацию об ошибках в лог-файл
     * @param error Текст ошибки для логирования
     */
    protected _log(error?: string): void;
}
