using SendGrid; using SendGrid.Helpers.Mail; namespace BCards.Web.Services; public class EmailService : IEmailService { private readonly ISendGridClient _sendGridClient; private readonly IConfiguration _configuration; private readonly ILogger _logger; public EmailService( ISendGridClient sendGridClient, IConfiguration configuration, ILogger logger) { _sendGridClient = sendGridClient; _configuration = configuration; _logger = logger; } public async Task SendModerationStatusAsync(string userEmail, string userName, string pageTitle, string status, string? reason = null, string? previewUrl = null) { var (subject, htmlContent) = status switch { "pending" => GetPendingModerationTemplate(userName, pageTitle, previewUrl), "approved" => GetApprovedTemplate(userName, pageTitle), "rejected" => GetRejectedTemplate(userName, pageTitle, reason), _ => throw new ArgumentException($"Unknown status: {status}") }; await SendEmailAsync(userEmail, subject, htmlContent); } public async Task SendModeratorNotificationAsync(string pageId, string pageTitle, string planType, string userName) { var moderatorEmail = _configuration["Moderation:ModeratorEmail"]; if (string.IsNullOrEmpty(moderatorEmail)) return; var priority = GetPriorityLabel(planType); var subject = $"[{priority}] Nova página para moderação - {pageTitle}"; var htmlContent = $@"

Nova página para moderação

Título: {pageTitle}

Usuário: {userName}

Plano: {planType}

Prioridade: {priority}

ID da Página: {pageId}

Moderar Página

"; await SendEmailAsync(moderatorEmail, subject, htmlContent); } public async Task SendEmailAsync(string to, string subject, string htmlContent) { try { var from = new EmailAddress( _configuration["SendGrid:FromEmail"] ?? "ricardo.carneiro@jobmaker.com.br", _configuration["SendGrid:FromName"] ?? "BCards"); var toEmail = new EmailAddress(to); var msg = MailHelper.CreateSingleEmail(from, toEmail, subject, null, htmlContent); var response = await _sendGridClient.SendEmailAsync(msg); if (response.StatusCode == System.Net.HttpStatusCode.Accepted) { _logger.LogInformation("Email sent successfully to {Email}", to); return true; } else { var content = await response.Body.ReadAsStringAsync(); _logger.LogWarning("Failed to send email to {Email}. Status: {StatusCode}", to, response.StatusCode); return false; } } catch (Exception ex) { _logger.LogError(ex, "Error sending email to {Email}", to); return false; } } private (string subject, string htmlContent) GetPendingModerationTemplate(string userName, string pageTitle, string? previewUrl) { var subject = "📋 Sua página está sendo analisada - bcards.site"; var previewButton = !string.IsNullOrEmpty(previewUrl) ? $"

Ver Preview

" : ""; var htmlContent = $@"

Olá {userName}!

Sua página '{pageTitle}' foi enviada para análise e estará disponível em breve!

🔍 Tempo estimado: 3-7 dias úteis

👀 Status: Em análise

Nossa equipe verifica se o conteúdo segue nossos termos de uso para manter a qualidade da plataforma.

{previewButton}

Você receberá outro email assim que sua página for aprovada ou se precisar de ajustes.

"; return (subject, htmlContent); } private (string subject, string htmlContent) GetApprovedTemplate(string userName, string pageTitle) { var subject = "✅ Sua página foi aprovada! - bcards.site"; var htmlContent = $@"

Parabéns {userName}! 🎉

Sua página '{pageTitle}' foi aprovada e já está no ar!

Status: Aprovada

🌐 Sua página está online!

Agora você pode:

  • Compartilhar sua página nas redes sociais
  • Adicionar o link na sua bio
  • Acompanhar as estatísticas no painel

Acessar Painel

"; return (subject, htmlContent); } private (string subject, string htmlContent) GetRejectedTemplate(string userName, string pageTitle, string? reason) { var subject = "⚠️ Sua página precisa de ajustes - bcards.site"; var reasonText = !string.IsNullOrEmpty(reason) ? $"

Motivo: {reason}

" : ""; var htmlContent = $@"

Olá {userName}

Sua página '{pageTitle}' não foi aprovada, mas você pode corrigir e reenviar!

Status: Necessita ajustes

{reasonText}

Para que sua página seja aprovada, certifique-se de que:

  • Não contém conteúdo proibido ou suspeito
  • Todos os links estão funcionando
  • As informações são precisas
  • Segue nossos termos de uso

Editar Página

"; return (subject, htmlContent); } private string GetPriorityLabel(string planType) => planType.ToLower() switch { "premium" => "ALTA", "professional" => "ALTA", "basic" => "MÉDIA", _ => "BAIXA" }; private string GetPriorityColor(string planType) => planType.ToLower() switch { "premium" => "#dc3545", "professional" => "#fd7e14", "basic" => "#ffc107", _ => "#6c757d" }; }