import nodemailer from "nodemailer";
import { env } from "../config/env.js";
import { query } from "../db/pool.js";
import { recordAppEvent } from "./app-log.js";

interface OutboxEmail {
  id: number;
  recipient: string;
  subject: string;
  body: string;
}

export function isSmtpConfigured(): boolean {
  return Boolean(env.SMTP_HOST && env.SMTP_FROM);
}

function createTransport() {
  return nodemailer.createTransport({
    host: env.SMTP_HOST,
    port: env.SMTP_PORT,
    secure: env.SMTP_SECURE,
    auth: env.SMTP_USER || env.SMTP_PASS
      ? { user: env.SMTP_USER, pass: env.SMTP_PASS }
      : undefined,
  });
}

export async function sendOutboxEmail(email: OutboxEmail): Promise<boolean> {
  if (!isSmtpConfigured()) return false;

  try {
    const transporter = createTransport();
    await transporter.sendMail({
      from: env.SMTP_FROM,
      to: email.recipient,
      subject: email.subject,
      text: email.body,
    });

    await query(
      "UPDATE email_outbox SET status = 'sent', sent_at = NOW() WHERE id = $1",
      [email.id]
    );
    await recordAppEvent({
      level: "info",
      source: "mail.smtp",
      message: "SMTP delivery succeeded",
      details: { outboxId: email.id, recipient: email.recipient },
    });
    return true;
  } catch (err) {
    await query(
      "UPDATE email_outbox SET status = 'failed' WHERE id = $1",
      [email.id]
    );
    await recordAppEvent({
      level: "error",
      source: "mail.smtp",
      message: err instanceof Error ? err.message : "SMTP delivery failed",
      details: { outboxId: email.id, recipient: email.recipient },
    });
    return false;
  }
}

export async function sendPendingOutboxEmail(id: number): Promise<boolean | null> {
  const rows = await query<OutboxEmail>(
    "SELECT id, recipient, subject, body FROM email_outbox WHERE id = $1 LIMIT 1",
    [id]
  );
  const email = rows[0];
  if (!email) return null;
  return sendOutboxEmail(email);
}
