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); } catch (Exception ex) { _logger.LogWarning(ex, "ν…”λ ˆκ·Έλž¨ μ•Œλ¦Ό 전솑 쀑 였λ₯˜ λ°œμƒ"); } } public async Task NotifyStatusChangedAsync(int inquiryId, string name, string phone, string serviceType, string previousStatus, string newStatus, 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() .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); } catch (Exception ex) { _logger.LogWarning(ex, "ν…”λ ˆκ·Έλž¨ μƒνƒœ λ³€κ²½ μ•Œλ¦Ό 쀑 였λ₯˜ λ°œμƒ"); } } private static string FormatStatus(string status) => status switch { "new" => "μ‹ κ·œ", "contacted" => "연락함", "completed" => "μ™„λ£Œ", _ => status }; }