using TeleWave.Domain.Notifications;
namespace TeleWave.Application.Common.Interfaces;
/// Кнопка инлайн-клавиатуры: подпись и что вернётся в callback.
public sealed record TelegramButton(string Text, string CallbackData);
/// Обновление от Telegram — только то, что нам нужно от его модели.
public sealed record TelegramUpdate(
long UpdateId,
long? ChatId,
string? Text,
string? From,
/// Идентификатор нажатия: на него надо ответить, иначе кнопка «крутится» у зрителя.
string? CallbackId,
string? CallbackData,
long? CallbackMessageId
);
/// Кто мы для Telegram — ответ getMe, по нему проверяется токен.
public sealed record TelegramBotInfo(long Id, string Username);
///
/// Порт к Bot API. Держим ровно те вызовы, что нужны боту расписания: узнать себя, получить
/// обновления, ответить сообщением с кнопками и переключить вебхук.
///
/// Настройки (токен, прокси) реализация читает сама на каждый вызов: админ меняет их в рантайме,
/// и держать клиента, собранного на старте, значило бы требовать перезапуск контейнера.
///
public interface ITelegramApi
{
Task GetMeAsync(
TelegramSettings settings,
CancellationToken cancellationToken
);
Task> GetUpdatesAsync(
TelegramSettings settings,
long offset,
CancellationToken cancellationToken
);
Task SendMessageAsync(
TelegramSettings settings,
long chatId,
string text,
IReadOnlyList>? keyboard,
CancellationToken cancellationToken
);
/// Переписывает уже отправленное сообщение — так меню подписок обновляется на месте.
Task EditMessageAsync(
TelegramSettings settings,
long chatId,
long messageId,
string text,
IReadOnlyList>? keyboard,
CancellationToken cancellationToken
);
/// Гасит «часики» на нажатой кнопке; текст — всплывающая подсказка.
Task AnswerCallbackAsync(
TelegramSettings settings,
string callbackId,
string? text,
CancellationToken cancellationToken
);
///
/// Разбирает тело вебхука в то же обновление, что приходит опросом: разговор с ботом один,
/// и знать про две модели ему незачем. null — тело не разобралось.
///
Task ReadUpdateAsync(Stream body, CancellationToken cancellationToken);
Task SetWebhookAsync(TelegramSettings settings, CancellationToken cancellationToken);
Task DeleteWebhookAsync(TelegramSettings settings, CancellationToken cancellationToken);
}