import { pool, query } from "../db/pool.js";
import { renderTikeTrackEmailTemplate } from "../lib/email-template.js";
import { sendOutboxEmail } from "../lib/mailer.js";

const adminRows = await query<{ id: number; email: string; name: string }>(`
  SELECT id, email, name
  FROM users
  WHERE role = 'admin'
    AND deleted_at IS NULL
    AND status = 'active'
  ORDER BY id ASC
  LIMIT 1
`);
const admin = adminRows[0];

if (!admin) {
  throw new Error("No hay un administrador activo al que enviar la prueba.");
}

const testReference = new Intl.DateTimeFormat("es-ES", {
  dateStyle: "short",
  timeStyle: "medium",
  timeZone: "Europe/Madrid",
}).format(new Date());
const subject = `Prueba de diseño de correo de TikeTrack — ${testReference}`;
const body = [
  `Hola ${admin.name},`,
  "",
  "Este es un correo de prueba para comprobar la nueva maquetación de TikeTrack.",
  "El diseño se adapta a los visores de correo en modo claro y oscuro.",
  "",
  "Puedes acceder a TikeTrack en https://tiketrack.com.",
].join("\n");
const htmlBody = renderTikeTrackEmailTemplate({
  preheader: "Prueba de la nueva maquetación de correo de TikeTrack.",
  eyebrow: "Correo de prueba",
  title: `Hola ${admin.name}, esta es la nueva plantilla`,
  introHtml: "<p>Hemos preparado esta prueba para revisar la legibilidad, la imagen de cabecera y el comportamiento en modo claro y oscuro.</p>",
  action: { label: "Abrir TikeTrack", url: "https://tiketrack.com" },
  detailRows: [
    { label: "Diseño", value: "Plantilla de avisos TikeTrack" },
    { label: "Visor", value: "Compatible con modo claro y oscuro" },
  ],
  outroHtml: "<p>Los enlaces de web y contacto llevan a tiketrack.com, tal como se ha solicitado.</p>",
});

try {
  const outboxRows = await query<{ id: number }>(
    `INSERT INTO email_outbox (user_id, recipient, subject, body, html_body)
     VALUES ($1, $2, $3, $4, $5)
     RETURNING id`,
    [admin.id, admin.email, subject, body, htmlBody]
  );
  const outboxId = outboxRows[0]?.id;
  if (!outboxId) throw new Error("No se pudo crear el correo de prueba.");

  const sent = await sendOutboxEmail({
    id: outboxId,
    recipient: admin.email,
    subject,
    body,
    htmlBody,
  });
  if (!sent) throw new Error("El servidor SMTP no ha podido enviar el correo de prueba.");
  console.log(`Correo de prueba enviado al administrador (outbox ${outboxId}).`);
} finally {
  await pool.end();
}
