/**
 * notifier.js – Alertas por email (cookie caída, DataDome persistente, etc.).
 *
 * Fire-and-forget: NUNCA bloquea ni tumba una respuesta del API si el email
 * falla. Con cooldown por tipo de alerta para no spamear si Garena sigue
 * caída (1 email cada 6 horas máximo por razón).
 *
 * Config en config-private.php → ver comentarios en config.js.
 */

import nodemailer from 'nodemailer';
import {
  SMTP_HOST,
  SMTP_PORT,
  SMTP_USER,
  SMTP_PASS,
  ALERT_EMAIL_TO,
  EMAIL_ALERTS_CONFIGURED,
} from '../config.js';

const COOLDOWN_MS = 6 * 60 * 60 * 1000; // 6 horas por razón
const __lastSentAt = new Map(); // reason → timestamp

let __transport = null;
function getTransport() {
  if (!__transport) {
    __transport = nodemailer.createTransport({
      host: SMTP_HOST,
      port: SMTP_PORT,
      secure: SMTP_PORT === 465,
      auth: { user: SMTP_USER, pass: SMTP_PASS },
    });
  }
  return __transport;
}

/**
 * Envía la alerta si hay configuración y no hubo una igual hace poco.
 * Devuelve true solo si el envío se disparó (para logging del llamador).
 */
export async function sendAlert(reasonKey, subject, bodyText) {
  if (!EMAIL_ALERTS_CONFIGURED) return false;

  const last = __lastSentAt.get(reasonKey) || 0;
  if (Date.now() - last < COOLDOWN_MS) return false;

  __lastSentAt.set(reasonKey, Date.now());
  try {
    await getTransport().sendMail({
      from: `FF Store Alertas <${SMTP_USER}>`,
      to: ALERT_EMAIL_TO,
      subject,
      text: bodyText,
    });
    return true;
  } catch (err) {
    // Reintentable: si falló el envío, permitimos reintentar antes del cooldown.
    __lastSentAt.set(reasonKey, Date.now() - COOLDOWN_MS + 5 * 60 * 1000);
    console.error('[notifier] fallo enviando alerta:', err.message);
    return false;
  }
}

/** Alerta específica: cookie de Garena dejó de funcionar. */
export function notifyCookieDown(detail = '') {
  return sendAlert(
    'cookie-down',
    '🚨 Cookie de PagoStore/Garena caída — acción requerida',
    [
      'La cookie de Garena dejó de funcionar o DataDome está bloqueando las consultas.',
      '',
      `Detalle: ${detail || 'sin detalle'}`,
      `Hora: ${new Date().toLocaleString('es-DO')}`,
      '',
      'Qué hacer:',
      '1. Regenera full-cookies.json con: npm run cookie',
      '2. Si DataDome sigue bloqueando, espera unos minutos o revisa el flag del solver en /admin.',
    ].join('\n'),
  );
}
