using Telegram.Bot;
using Telegram.Bot.Types.Enums;
using Telegram.Bot.Types.ReplyMarkups;

namespace GmRelay.Bot.Infrastructure.Telegram;

/// <summary>
/// Handles editing batch messages that may be either text or photo messages.
/// When the batch was created with SendPhoto (image + caption), we need
/// EditMessageCaption instead of EditMessageText.
/// </summary>
public static class BatchMessageEditor
{
    /// <summary>
    /// Edits a batch message, automatically detecting whether it is a text or photo message.
    /// Tries EditMessageText first; on failure falls back to EditMessageCaption.
    /// </summary>
    public static async Task EditBatchMessageAsync(
        ITelegramBotClient bot,
        long chatId,
        int messageId,
        string text,
        InlineKeyboardMarkup? replyMarkup,
        CancellationToken ct = default)
    {
        try
        {
            await bot.EditMessageText(
                chatId: chatId,
                messageId: messageId,
                text: text,
                parseMode: ParseMode.Html,
                replyMarkup: replyMarkup,
                cancellationToken: ct);
        }
        catch (global::Telegram.Bot.Exceptions.ApiRequestException ex)
            when (ex.Message.Contains("there is no text in the message", StringComparison.OrdinalIgnoreCase))
        {
            // The batch message is a photo — use EditMessageCaption instead.
            // Caption is limited to 1024 chars; if text exceeds that, truncate gracefully.
            var caption = text.Length <= 1024 ? text : text[..1021] + "...";
            await bot.EditMessageCaption(
                chatId: chatId,
                messageId: messageId,
                caption: caption,
                parseMode: ParseMode.Html,
                replyMarkup: replyMarkup,
                cancellationToken: ct);
        }
    }
}
