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

const testRideSchema = z.object({
  fullName: z.string().min(2),
  phone: z.string().min(7),
  email: z.string().email().optional().or(z.literal("")),
  branch: z.string().min(1),
  scooter: z.string().min(1),
  date: z.string().min(1),
  time: z.string().min(1),
  message: z.string().optional(),
});

export async function POST(request: Request) {
  const parsed = testRideSchema.safeParse(await request.json());

  if (!parsed.success) {
    return NextResponse.json(
      { success: false, error: "Please check the booking details." },
      { status: 400 },
    );
  }

  if (!process.env.DATABASE_URL) {
    return NextResponse.json(
      { success: false, error: "Database is not configured." },
      { status: 503 },
    );
  }

  try {
    const [branch, scooter] = await Promise.all([
      prisma.branch.findUnique({ where: { slug: parsed.data.branch } }),
      prisma.scooter.findUnique({ where: { slug: parsed.data.scooter } }),
    ]);
    const preferredDate = new Date(`${parsed.data.date}T00:00:00.000Z`);

    if (!branch || !scooter) {
      return NextResponse.json(
        { success: false, error: "Selected branch or scooter is not available." },
        { status: 400 },
      );
    }

    if (Number.isNaN(preferredDate.getTime())) {
      return NextResponse.json(
        { success: false, error: "Please select a valid date." },
        { status: 400 },
      );
    }

    const booking = await prisma.testRideBooking.create({
      data: {
        fullName: parsed.data.fullName,
        phone: parsed.data.phone,
        email: parsed.data.email || null,
        branchId: branch.id,
        scooterId: scooter.id,
        preferredDate,
        preferredTime: parsed.data.time,
        message: parsed.data.message || null,
      },
    });

    return NextResponse.json({ success: true, bookingId: booking.id });
  } catch (error) {
    console.error("Failed to create test ride booking", error);
    return NextResponse.json(
      { success: false, error: "Unable to submit booking right now." },
      { status: 500 },
    );
  }
}
