// Transporter SMTP nodemailer (singleton, lazy-init).
//
// Configuration via env vars (Ionos par defaut, mais marche avec n'importe quel
// SMTP authentifie). Le transporter est cree au premier envoi seulement, pour ne
// pas casser le build quand les vars manquent (dev local, CI).

import "server-only";
import nodemailer from "nodemailer";
import type { Transporter } from "nodemailer";

let cached: Transporter | null = null;

export type EmailEnv = {
  host: string;
  port: number;
  secure: boolean;
  user: string;
  password: string;
  fromEmail: string;
  fromName: string;
};

/** Lit et valide la config SMTP depuis l'env. Throw si incomplet (call site = serveur). */
function readEnv(): EmailEnv {
  const host = process.env.SMTP_HOST;
  const portRaw = process.env.SMTP_PORT;
  const secureRaw = process.env.SMTP_SECURE;
  const user = process.env.SMTP_USER;
  const password = process.env.SMTP_PASSWORD;
  const fromEmail = process.env.SMTP_FROM_EMAIL ?? user;
  const fromName = process.env.SMTP_FROM_NAME ?? "Novelia";

  const missing: string[] = [];
  if (!host) missing.push("SMTP_HOST");
  if (!portRaw) missing.push("SMTP_PORT");
  if (!user) missing.push("SMTP_USER");
  if (!password) missing.push("SMTP_PASSWORD");
  if (missing.length > 0) {
    throw new Error(
      `Configuration SMTP incomplete : variables manquantes ${missing.join(", ")}. ` +
        `Voir .env.production.example.`,
    );
  }

  const port = Number.parseInt(portRaw!, 10);
  if (Number.isNaN(port) || port <= 0) {
    throw new Error(`SMTP_PORT invalide : "${portRaw}".`);
  }

  // Si SMTP_SECURE non defini : true par defaut sur 465 (SSL), false sinon (STARTTLS).
  const secure =
    secureRaw !== undefined ? secureRaw === "true" : port === 465;

  return {
    host: host!,
    port,
    secure,
    user: user!,
    password: password!,
    fromEmail: fromEmail!,
    fromName,
  };
}

export function getTransporter(): Transporter {
  if (cached) return cached;
  const env = readEnv();
  cached = nodemailer.createTransport({
    host: env.host,
    port: env.port,
    secure: env.secure,
    auth: {
      user: env.user,
      pass: env.password,
    },
    // Pool : reutilise les connexions SMTP pour les envois en rafale (ex : envoi
    // notification + confirmation sur le meme submit form). Sinon Ionos peut
    // throttle / rate-limit.
    pool: true,
    maxConnections: 3,
    maxMessages: 50,
  });
  return cached;
}

export function getFromAddress(): string {
  const env = readEnv();
  return `"${env.fromName}" <${env.fromEmail}>`;
}

/** Verifie la connexion SMTP (utile en setup ou healthcheck). Retourne true si OK. */
export async function verifySmtp(): Promise<boolean> {
  try {
    const transporter = getTransporter();
    await transporter.verify();
    return true;
  } catch (err) {
    console.error("[email] SMTP verify failed:", err);
    return false;
  }
}
