import { NextResponse } from "next/server";
import { prisma } from "@/lib/db";

/**
 * Newsletter signup endpoint.
 * Persists to NewsletterSubscriber. Idempotent: re-subscribing an unsubscribed email
 * flips status back to "subscribed" without creating a duplicate row.
 */
export async function POST(req: Request) {
  let body: { email?: string; source?: string };
  try {
    body = await req.json();
  } catch {
    return NextResponse.json({ ok: false, error: "Invalid JSON" }, { status: 400 });
  }

  const email = (body.email ?? "").trim().toLowerCase();
  if (!email || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
    return NextResponse.json({ ok: false, error: "Email không hợp lệ" }, { status: 400 });
  }

  const source = (body.source ?? "inline").slice(0, 32);
  const ip =
    req.headers.get("x-forwarded-for")?.split(",")[0]?.trim() ||
    req.headers.get("x-real-ip") ||
    null;
  const ua = req.headers.get("user-agent") || null;

  try {
    await prisma.newsletterSubscriber.upsert({
      where: { email },
      create: {
        email,
        source,
        status: "subscribed",
        confirmedAt: new Date(),
        ipAddress: ip,
        userAgent: ua,
      },
      update: {
        status: "subscribed",
        unsubscribedAt: null,
        // keep original source; only refresh confirm + activity metadata
        confirmedAt: new Date(),
        ipAddress: ip,
        userAgent: ua,
      },
    });
  } catch (e) {
    console.error("[newsletter] upsert failed:", e);
    return NextResponse.json(
      { ok: false, error: "Không lưu được, thử lại sau." },
      { status: 500 },
    );
  }

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