import * as React from "react";
import { NextResponse } from "next/server";
import { z } from "zod";
import { sendMail, headerSafe, mailRecipient, MailNotConfiguredError } from "@/lib/mail";
import { renderEmail, NewsletterInternalEmail, NewsletterWelcomeEmail } from "@/emails";

// SMTP (nodemailer) requires the Node.js runtime.
export const runtime = "nodejs";

const schema = z.object({
  email: z.email(),
  // Honeypot — accept any value; a non-empty value marks a bot (dropped below).
  company: z.string().optional(),
});

export async function POST(req: Request) {
  let body: unknown;
  try {
    body = await req.json();
  } catch {
    return NextResponse.json({ ok: false, error: "Invalid request." }, { status: 400 });
  }

  const parsed = schema.safeParse(body);
  if (!parsed.success) {
    return NextResponse.json(
      { ok: false, error: "Please enter a valid email address." },
      { status: 400 },
    );
  }

  if (parsed.data.company) return NextResponse.json({ ok: true });

  const { email } = parsed.data;

  // 1. Deliver subscriber notification to the team
  const internalSubject = headerSafe(`New newsletter subscriber: ${email}`);
  try {
    const { html: internalHtml, text: internalText } = await renderEmail(
      React.createElement(NewsletterInternalEmail, {
        email,
        subscribedAt: new Date().toUTCString(),
      })
    );

    await sendMail({
      to: mailRecipient(),
      subject: internalSubject,
      text: internalText,
      html: internalHtml,
      replyTo: email,
    });
    console.log(`[newsletter] subscriber emailed to ${mailRecipient()} — ${email}`);
  } catch (err) {
    if (err instanceof MailNotConfiguredError) {
      console.warn(
        `[newsletter] SMTP not configured — subscriber NOT emailed to ${mailRecipient()}. Set SMTP_* env. Email:`,
        email,
      );
    } else {
      console.error(`[newsletter] email send FAILED to ${mailRecipient()}:`, err, { email });
    }
    return NextResponse.json({ ok: true });
  }

  // 2. Deliver branded welcome confirmation to the subscriber
  try {
    const welcomeSubject = headerSafe("Welcome to Quto AI Insights");
    const { html: welcomeHtml, text: welcomeText } = await renderEmail(
      React.createElement(NewsletterWelcomeEmail, { email })
    );

    await sendMail({
      to: email,
      subject: welcomeSubject,
      text: welcomeText,
      html: welcomeHtml,
    });
    console.log(`[newsletter] welcome confirmation emailed to ${email}`);
  } catch (err) {
    console.warn(`[newsletter] welcome confirmation email to ${email} skipped or failed:`, err);
  }

  return NextResponse.json({ ok: true });
}
