import { NextResponse } from "next/server";
import { prisma } from "@/lib/prisma";
import { z } from "zod";
import { sendSocioLeadEmail } from "@/lib/send-socio-lead-email";

const UF_LIST = [
  "AC",
  "AL",
  "AP",
  "AM",
  "BA",
  "CE",
  "DF",
  "ES",
  "GO",
  "MA",
  "MT",
  "MS",
  "MG",
  "PA",
  "PB",
  "PR",
  "PE",
  "PI",
  "RJ",
  "RN",
  "RS",
  "RO",
  "RR",
  "SC",
  "SP",
  "SE",
  "TO",
] as const;

const schema = z.object({
  name: z.string().min(2), // Nome completo
  dateOfBirth: z.string().min(6), // yyyy-mm-dd (input type=date)
  email: z.string().email(),
  phone: z.string().min(6),
  address: z.string().min(2),
  addressNumber: z.string().min(1),
  neighborhood: z.string().min(1),
  city: z.string().min(1),
  uf: z.enum(UF_LIST),

  planId: z.string().min(1),

  message: z.string().optional(),
});

export async function POST(req: Request) {
  try {
    const json = await req.json();
    const data = schema.parse(json);

    const plan = await prisma.socioPlan.findUnique({ where: { id: data.planId } });
    if (!plan || !plan.active) {
      return NextResponse.json({ error: "Plano inválido" }, { status: 400 });
    }

    const dob = new Date(data.dateOfBirth);
    if (Number.isNaN(dob.getTime())) {
      return NextResponse.json({ error: "Data de nascimento inválida" }, { status: 400 });
    }

    await prisma.socioLead.create({
      data: {
        name: data.name,
        email: data.email,
        phone: data.phone,
        message: data.message ?? null,
        plan: plan.name,
        planId: plan.id,
        planName: plan.name,
        dateOfBirth: dob,
        address: data.address,
        addressNumber: data.addressNumber,
        neighborhood: data.neighborhood,
        city: data.city,
        uf: data.uf,
      },
    });

    await sendSocioLeadEmail({
      name: data.name,
      dateOfBirth: dob,
      email: data.email,
      phone: data.phone,
      address: data.address,
      addressNumber: data.addressNumber,
      neighborhood: data.neighborhood,
      city: data.city,
      uf: data.uf,
      planName: plan.name,
      message: data.message ?? null,
    });

    return NextResponse.json({ ok: true });
  } catch (e) {
    if (e instanceof z.ZodError) {
      return NextResponse.json({ error: e.flatten() }, { status: 400 });
    }
    if (e instanceof Error) {
      return NextResponse.json({ error: e.message || "Erro ao enviar" }, { status: 500 });
    }
    return NextResponse.json({ error: "Erro ao enviar" }, { status: 500 });
  }
}
