using System.Net.Http.Json; using System.Text; using TaxBaik.Application.Services; namespace TaxBaik.Web.Services; public class TelegramInquiryNotificationService : IInquiryNotificationService { private readonly IHttpClientFactory _httpClientFactory; private readonly IConfiguration _configuration; private readonly ILogger _logger; private readonly string _baseUrl; public TelegramInquiryNotificationService(IHttpClientFactory httpClientFactory, IConfiguration configuration, ILogger logger) { _httpClientFactory = httpClientFactory; _configuration = configuration; _logger = logger; _baseUrl = (_configuration["App:PublicBaseUrl"] ?? "http://178.104.200.7/taxbaik").TrimEnd('/'); } public async Task NotifyCreatedAsync(int inquiryId, string name, string phone, string serviceType, string message, string? ipAddress, DateTime createdAtUtc, CancellationToken ct = default) { var botToken = _configuration["Telegram:BotToken"]; var chatId = _configuration["Telegram:ChatId"]; if (string.IsNullOrWhiteSpace(botToken) || string.IsNullOrWhiteSpace(chatId)) return; var adminLink = $"{_baseUrl}/admin/inquiries"; var summary = message.Length > 180 ? message[..180] + "..." : message; var createdAtKst = createdAtUtc.AddHours(9); var text = new StringBuilder() .AppendLine("๐Ÿ†• ์ƒˆ ๋ฌธ์˜๊ฐ€ ์ ‘์ˆ˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.") .AppendLine() .AppendLine($"๋ฌธ์˜ ๋ฒˆํ˜ธ: #{inquiryId}") .AppendLine($"์ œ๋ชฉ: {serviceType}") .AppendLine($"์ด๋ฆ„: {name}") .AppendLine($"์—ฐ๋ฝ์ฒ˜: {phone}") .AppendLine($"์ ‘์ˆ˜ ์‹œ๊ฐ: {createdAtKst:yyyy-MM-dd HH:mm:ss} KST") .AppendLine($"IP: {(string.IsNullOrWhiteSpace(ipAddress) ? "-" : ipAddress)}") .AppendLine() .AppendLine("๋‚ด์šฉ ์š”์•ฝ:") .AppendLine(summary) .AppendLine() .AppendLine($"๋‹ต๋ณ€ ๋ชฉ๋ก ๋งํฌ: {adminLink}") .ToString(); var client = _httpClientFactory.CreateClient(); var url = $"https://api.telegram.org/bot{botToken}/sendMessage"; var payload = new { chat_id = chatId, text, disable_web_page_preview = false }; try { var response = await client.PostAsJsonAsync(url, payload, ct); if (!response.IsSuccessStatusCode) { _logger.LogWarning("ํ…”๋ ˆ๊ทธ๋žจ ์•Œ๋ฆผ ์ „์†ก ์‹คํŒจ: {StatusCode}", response.StatusCode); } else { _logger.LogInformation("ํ…”๋ ˆ๊ทธ๋žจ ์ƒˆ ๋ฌธ์˜ ์•Œ๋ฆผ ์ „์†ก ์„ฑ๊ณต: #{InquiryId}", inquiryId); } } catch (Exception ex) { _logger.LogWarning(ex, "ํ…”๋ ˆ๊ทธ๋žจ ์•Œ๋ฆผ ์ „์†ก ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ"); } } public async Task NotifyStatusChangedAsync(int inquiryId, string name, string phone, string serviceType, string previousStatus, string newStatus, string? changedBy = null, CancellationToken ct = default) { var botToken = _configuration["Telegram:BotToken"]; var chatId = _configuration["Telegram:ChatId"]; if (string.IsNullOrWhiteSpace(botToken) || string.IsNullOrWhiteSpace(chatId)) return; var adminLink = $"{_baseUrl}/admin/inquiries"; var text = new StringBuilder() .AppendLine("โœ๏ธ ๋ฌธ์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.") .AppendLine() .AppendLine($"๋ฌธ์˜ ๋ฒˆํ˜ธ: #{inquiryId}") .AppendLine($"์ œ๋ชฉ: {serviceType}") .AppendLine($"์ด๋ฆ„: {name}") .AppendLine($"์—ฐ๋ฝ์ฒ˜: {phone}") .AppendLine($"์ƒํƒœ: {FormatStatus(previousStatus)} -> {FormatStatus(newStatus)}") .AppendLine($"๋ณ€๊ฒฝ์ž: {(string.IsNullOrWhiteSpace(changedBy) ? "-" : changedBy)}") .AppendLine() .AppendLine($"๋‹ต๋ณ€ ๋ชฉ๋ก ๋งํฌ: {adminLink}") .ToString(); var client = _httpClientFactory.CreateClient(); var url = $"https://api.telegram.org/bot{botToken}/sendMessage"; var payload = new { chat_id = chatId, text, disable_web_page_preview = false }; try { var response = await client.PostAsJsonAsync(url, payload, ct); if (!response.IsSuccessStatusCode) { _logger.LogWarning("ํ…”๋ ˆ๊ทธ๋žจ ์ƒํƒœ ๋ณ€๊ฒฝ ์•Œ๋ฆผ ์‹คํŒจ: {StatusCode}", response.StatusCode); } else { _logger.LogInformation("ํ…”๋ ˆ๊ทธ๋žจ ์ƒํƒœ ๋ณ€๊ฒฝ ์•Œ๋ฆผ ์ „์†ก ์„ฑ๊ณต: #{InquiryId}", inquiryId); } } catch (Exception ex) { _logger.LogWarning(ex, "ํ…”๋ ˆ๊ทธ๋žจ ์ƒํƒœ ๋ณ€๊ฒฝ ์•Œ๋ฆผ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ"); } } private static string FormatStatus(string status) => status switch { "new" => "์‹ ๊ทœ", "contacted" => "์—ฐ๋ฝํ•จ", "completed" => "์™„๋ฃŒ", _ => status }; }