using Microsoft.Extensions.Logging; using MotoresArgentinosV2.Core.Interfaces; using Microsoft.Extensions.Configuration; namespace MotoresArgentinosV2.Infrastructure.Services; public class NotificationService : INotificationService { private readonly IEmailService _emailService; private readonly ILogger _logger; private readonly string _frontendUrl; public NotificationService(IEmailService emailService, ILogger logger, IConfiguration config) { _emailService = emailService; _logger = logger; // Leemos la URL del appsettings o usamos localhost como fallback _frontendUrl = config["AppSettings:FrontendUrl"]?.Split(',')[0].Trim() ?? "http://localhost:5173"; } // ─── Shell del correo ────────────────────────────────────────────────────── /// /// Genera el HTML completo del correo con header, contenido y footer. /// Si se provee unsubscribeUrl, agrega el enlace de baja en el footer. /// private string GetEmailShell(string title, string content, string? unsubscribeUrl = null) { // Footer de baja: solo se muestra si el correo tiene categoría de preferencia var unsubscribeBlock = string.IsNullOrEmpty(unsubscribeUrl) ? string.Empty : $@"

¿No querés recibir más este tipo de correos? Darte de baja

"; return $@"

Motores Argentinos

{title}

{content}

Motores Argentinos - La Plata, Buenos Aires, Argentina

{unsubscribeBlock}
"; } // ─── Implementaciones ────────────────────────────────────────────────────── /// /// Notificación de nuevo mensaje de chat. Categoría: mensajes. /// public async Task SendChatNotificationEmailAsync( string toEmail, string fromUser, string message, int adId, string? unsubscribeUrl = null) { string subject = "Tienes un nuevo mensaje - Motores Argentinos"; string content = $@"

Hola,

{fromUser} te ha enviado un mensaje sobre el aviso #{adId}:

""{message}""

Ingresa a tu cuenta para responder.

VER MENSAJES
"; await _emailService.SendEmailAsync(toEmail, subject, GetEmailShell("Nuevo Mensaje", content, unsubscribeUrl)); } /// /// Aviso de cambio de estado del aviso. Categoría: sistema. /// public async Task SendAdStatusChangedEmailAsync( string toEmail, string adTitle, string status, string? reason = null, string? unsubscribeUrl = null) { string subject = "Estado de tu aviso - Motores Argentinos"; string color = status.ToUpper() == "APROBADO" ? "#10b981" : "#ef4444"; string content = $@"

Hola,

Te informamos que el estado de tu aviso ""{adTitle}"" ha cambiado a:

{status}
{(string.IsNullOrEmpty(reason) ? "" : $"

Motivo: {reason}

")}

Gracias por confiar en nosotros.

"; await _emailService.SendEmailAsync(toEmail, subject, GetEmailShell("Cambio de Estado", content, unsubscribeUrl)); } /// /// Alerta de seguridad crítica. SIN enlace de baja (siempre se envía). /// public async Task SendSecurityAlertEmailAsync(string toEmail, string actionDescription) { string subject = "Alerta de Seguridad - Motores Argentinos"; string content = $@"

¡Alerta de Seguridad!

Te informamos que se ha realizado la siguiente acción crítica en tu cuenta:

Acción: {actionDescription}

Si no fuiste tú, te recomendamos cambiar tu contraseña inmediatamente y contactar a nuestro equipo de soporte.

Atentamente,
Equipo de Seguridad.

"; // Sin unsubscribeUrl: los correos de seguridad no tienen baja await _emailService.SendEmailAsync(toEmail, subject, GetEmailShell("Alerta de Seguridad", content)); } /// /// Aviso de próximo vencimiento. Categoría: sistema. /// public async Task SendExpirationWarningEmailAsync( string toEmail, string userName, string adTitle, DateTime expirationDate, string? unsubscribeUrl = null) { string subject = "Tu aviso está por vencer - Motores Argentinos"; string content = $@"

Hola {userName},

Te recordamos que tu publicación ""{adTitle}"" finalizará el día {expirationDate:dd/MM/yyyy}.

Para asegurar que tu vehículo siga visible y no pierdas potenciales compradores, te recomendamos renovarlo ahora.

RENOVAR AVISO
"; await _emailService.SendEmailAsync(toEmail, subject, GetEmailShell("Aviso por Vencer", content, unsubscribeUrl)); } /// /// Aviso de vencimiento consumado. Categoría: sistema. /// public async Task SendAdExpiredEmailAsync( string toEmail, string userName, string adTitle, string? unsubscribeUrl = null) { string subject = "Tu aviso ha finalizado - Motores Argentinos"; string content = $@"

Hola {userName},

Tu aviso ""{adTitle}"" ha llegado al fin de su vigencia y ya no es visible en los listados.

Si aún no vendiste tu vehículo, puedes republicarlo fácilmente desde tu panel de gestión.

REPUBLICAR AHORA
"; await _emailService.SendEmailAsync(toEmail, subject, GetEmailShell("Aviso Finalizado", content, unsubscribeUrl)); } /// /// Resumen semanal de rendimiento del aviso. Categoría: rendimiento. /// public async Task SendWeeklyPerformanceEmailAsync( string toEmail, string userName, string adTitle, int views, int favorites, string? unsubscribeUrl = null) { string subject = "Resumen semanal de tu aviso - Motores Argentinos"; string content = $@"

Hola {userName},

Aquí tienes el rendimiento de tu aviso ""{adTitle}"" en los últimos 7 días:

👁️ {views} Visitas
{favorites} Favoritos
"; await _emailService.SendEmailAsync(toEmail, subject, GetEmailShell("Rendimiento Semanal", content, unsubscribeUrl)); } /// /// Recordatorio de carrito abandonado. Categoría: marketing. /// public async Task SendPaymentReminderEmailAsync( string toEmail, string userName, string adTitle, string link, string? unsubscribeUrl = null) { string subject = "Finaliza la publicación de tu aviso - Motores Argentinos"; string content = $@"

Hola {userName},

Tu aviso del ""{adTitle}"" está casi listo, pero aún no es visible para los compradores.

Solo falta confirmar el pago para activarlo. ¡No pierdas oportunidades de venta!

FINALIZAR PUBLICACIÓN
"; await _emailService.SendEmailAsync(toEmail, subject, GetEmailShell("Acción Requerida", content, unsubscribeUrl)); } /// /// Recibo de pago transaccional. SIN enlace de baja (siempre se envía). /// public async Task SendPaymentReceiptEmailAsync( string toEmail, string userName, string adTitle, decimal amount, string operationCode) { string subject = "Comprobante de Pago - Motores Argentinos"; string content = $@"

Hola {userName},

Hemos recibido tu pago correctamente. Aquí tienes el detalle de la operación:

Concepto: Publicación Aviso Clasificado

Vehículo: {adTitle}

Operación: {operationCode}

Fecha: {DateTime.Now:dd/MM/yyyy HH:mm}


Total: ${amount:N2}

Tu aviso ha pasado a la etapa de moderación y será activado a la brevedad.

"; // Sin unsubscribeUrl: los comprobantes de pago son transaccionales obligatorios await _emailService.SendEmailAsync(toEmail, subject, GetEmailShell("Recibo de Pago", content)); } /// /// Recordatorio de mensajes sin leer. Categoría: mensajes. /// public async Task SendUnreadMessagesReminderEmailAsync( string toEmail, string userName, int unreadCount, string? unsubscribeUrl = null) { string subject = "Tienes mensajes sin leer - Motores Argentinos"; string content = $@"

Hola {userName},

Tienes {unreadCount} mensaje{(unreadCount > 1 ? "s" : "")} sin leer en tu bandeja de entrada.

Es importante responder a los interesados o moderadores para mantener la actividad de tu cuenta.

IR A MIS MENSAJES
"; await _emailService.SendEmailAsync(toEmail, subject, GetEmailShell("Mensajes Pendientes", content, unsubscribeUrl)); } }