using System.Net.Http.Json;
using Microsoft.Extensions.Options;

namespace foodmarket.Api.Integrations.Telegram;

/// <summary>Минимальный клиент Telegram Bot API — нужен только sendMessage.
/// Token читается из конфига <c>Telegram:BotToken</c> (можно через env
/// <c>Telegram__BotToken</c>). Если токен не задан — клиент тихо отключён,
/// <see cref="IsEnabled"/> = false; <see cref="SendMessageAsync"/> возвращает
/// false. Это позволяет не блокировать запуск сервиса в Dev/CI, где бота нет.</summary>
public sealed class TelegramOptions
{
    public string? BotToken { get; set; }
    /// <summary>Username бота без @ — для построения deep-link
    /// `https://t.me/{BotUsername}?start={token}`.</summary>
    public string? BotUsername { get; set; }
}

public interface ITelegramBotClient
{
    bool IsEnabled { get; }
    string? BotUsername { get; }
    /// <summary>Возвращает true если успешно отправили. На сетевую ошибку
    /// либо неверный ChatId логируем warning и возвращаем false, чтобы
    /// caller'у не приходилось ловить исключение.</summary>
    Task<bool> SendMessageAsync(long chatId, string text, CancellationToken ct = default);
}

public sealed class TelegramBotClient : ITelegramBotClient
{
    private readonly HttpClient _http;
    private readonly TelegramOptions _opts;
    private readonly ILogger<TelegramBotClient> _log;

    public TelegramBotClient(HttpClient http, IOptions<TelegramOptions> opts, ILogger<TelegramBotClient> log)
    {
        _http = http;
        _opts = opts.Value;
        _log = log;
    }

    public bool IsEnabled => !string.IsNullOrWhiteSpace(_opts.BotToken);
    public string? BotUsername => _opts.BotUsername;

    public async Task<bool> SendMessageAsync(long chatId, string text, CancellationToken ct = default)
    {
        if (!IsEnabled)
        {
            _log.LogDebug("Telegram disabled (no token) — skipping sendMessage to {ChatId}", chatId);
            return false;
        }
        try
        {
            var url = $"https://api.telegram.org/bot{_opts.BotToken}/sendMessage";
            // parse_mode=HTML позволяет жирные/курсив для сводки; text сюда
            // должен идти HtmlEncode'нутым (см. OwnerDailySummaryJob).
            var resp = await _http.PostAsJsonAsync(url, new
            {
                chat_id = chatId,
                text,
                parse_mode = "HTML",
                disable_web_page_preview = true,
            }, ct);
            if (!resp.IsSuccessStatusCode)
            {
                var body = await resp.Content.ReadAsStringAsync(ct);
                _log.LogWarning("Telegram sendMessage {ChatId} → {Status}: {Body}", chatId, (int)resp.StatusCode, body);
                return false;
            }
            return true;
        }
        catch (Exception ex)
        {
            _log.LogWarning(ex, "Telegram sendMessage exception (chatId={ChatId})", chatId);
            return false;
        }
    }
}
