import { NextResponse } from 'next/server'
import { prisma } from '@/lib/prisma'
import { safeHandler, requireAuth, AuthError } from '@/lib/auth'

export const GET = safeHandler(async (_req: Request, { params }: { params: Promise<{ id: string }> }) => {
  await requireAuth()
  const { id } = await params

  const booking = await prisma.booking.findUnique({
    where: { id },
    include: {
      query: {
        select: { queryNo: true, leadName: true },
      },
      itineraryDays: {
        orderBy: { dayNumber: 'asc' },
        include: {
          items: {
            orderBy: { sortOrder: 'asc' },
          },
        },
      },
      bookingItems: {
        orderBy: { sortOrder: 'asc' },
      },
      payments: {
        orderBy: { paymentDate: 'desc' },
      },
      fundAllocations: {
        include: {
          supplier: { select: { name: true } },
        },
        orderBy: { allocatedDate: 'desc' },
      },
    },
  })

  if (!booking) throw new AuthError('Booking not found', 404)

  return NextResponse.json(booking)
})

export const PUT = safeHandler(async (req: Request, { params }: { params: Promise<{ id: string }> }) => {
  await requireAuth()
  const { id } = await params
  const data = await req.json()

  const booking = await prisma.booking.update({
    where: { id },
    data: {
      status: data.status,
      startDate: data.startDate ? new Date(data.startDate) : undefined,
      endDate: data.endDate ? new Date(data.endDate) : undefined,
      totalAmount: data.totalAmount !== undefined ? parseFloat(data.totalAmount) : undefined,
      paidAmount: data.paidAmount !== undefined ? parseFloat(data.paidAmount) : undefined,
      notes: data.notes !== undefined ? data.notes : undefined,
      currency: data.currency,
    },
  })

  return NextResponse.json(booking)
})

export const DELETE = safeHandler(async (_req: Request, { params }: { params: Promise<{ id: string }> }) => {
  await requireAuth(['ADMIN'])
  const { id } = await params

  const booking = await prisma.booking.findUnique({ where: { id } })
  if (!booking) throw new AuthError('Booking not found', 404)
  if (booking.status !== 'CANCELLED') {
    throw new AuthError('Only cancelled bookings can be deleted', 400)
  }

  await prisma.booking.delete({ where: { id } })
  return NextResponse.json({ message: 'Deleted' })
})
