import nodemailer from "nodemailer";
import { env } from "@/config/env";

type MailPayload = {
  to: string;
  subject: string;
  text: string;
  html?: string;
};

const SMTP_TIMEOUT_MS = 15_000;

/** Public site URL for email links — omit localhost (Gmail often blocks those mails). */
export function publicFrontendUrl() {
  const raw = (env.FRONTEND_URL || "").trim().replace(/\/$/, "");
  if (!raw) return null;
  try {
    const u = new URL(raw);
    if (u.hostname === "localhost" || u.hostname === "127.0.0.1") return null;
    return raw;
  } catch {
    return null;
  }
}

export async function sendMail(payload: MailPayload) {
  if (!env.SMTP_HOST) {
    console.log("\n========== EMAIL (dev console) ==========");
    console.log(`To: ${payload.to}`);
    console.log(`Subject: ${payload.subject}`);
    console.log(payload.text);
    console.log("=========================================\n");
    return { delivered: false, mode: "console" as const, messageId: null as string | null };
  }

  try {
    const transporter = nodemailer.createTransport({
      host: env.SMTP_HOST,
      port: Number(env.SMTP_PORT || 587),
      secure: Number(env.SMTP_PORT || 587) === 465,
      connectionTimeout: SMTP_TIMEOUT_MS,
      greetingTimeout: SMTP_TIMEOUT_MS,
      socketTimeout: SMTP_TIMEOUT_MS,
      auth:
        env.SMTP_USER && env.SMTP_PASS
          ? { user: env.SMTP_USER, pass: env.SMTP_PASS }
          : undefined,
    });

    const fromAddress =
      env.EMAIL_FROM?.trim() ||
      (env.SMTP_USER ? `Safar Libya <${env.SMTP_USER}>` : "Safar Libya <noreply@safarlibya.com>");

    const info = await transporter.sendMail({
      from: fromAddress,
      replyTo: env.SMTP_USER || undefined,
      to: payload.to,
      subject: payload.subject,
      text: payload.text,
      html: payload.html,
      headers: {
        "X-Mailer": "Safar Libya",
      },
    });

    const messageId = typeof info.messageId === "string" ? info.messageId : null;
    console.log(
      `[email] SMTP accepted → ${payload.to} messageId=${messageId || "n/a"} subject="${payload.subject}"`,
    );
    return { delivered: true, mode: "smtp" as const, messageId };
  } catch (err) {
    console.error("[email] SMTP send failed, falling back to console", err);
    console.log("\n========== EMAIL (fallback console) ==========");
    console.log(`To: ${payload.to}`);
    console.log(`Subject: ${payload.subject}`);
    console.log(payload.text);
    console.log("==============================================\n");
    return { delivered: false, mode: "console" as const, messageId: null as string | null };
  }
}
