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

type Params = { params: Promise<{ id: string }> }

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

  const tour = await prisma.sICTour.findUnique({
    where: { id },
    include: {
      bookings: {
        include: {
          booking: {
            select: {
              bookingNo: true,
              query: { select: { leadName: true } },
            },
          },
        },
        orderBy: { createdAt: 'desc' },
      },
    },
  })

  if (!tour) throw new AuthError('SIC Tour not found', 404)
  return NextResponse.json(tour)
})

export const PUT = safeHandler(async (req: Request, { params }: Params) => {
  await requireAuth(['ADMIN', 'OPERATIONS'])
  const { id } = await params
  const data = await req.json()

  const tour = await prisma.sICTour.update({
    where: { id },
    data: {
      name: data.name,
      startDate: data.startDate ? new Date(data.startDate) : undefined,
      endDate: data.endDate ? new Date(data.endDate) : undefined,
      maxCapacity: data.maxCapacity,
      description: data.description ?? undefined,
      currency: data.currency ?? undefined,
      pricePerPerson: data.pricePerPerson ?? undefined,
      templateData: data.templateData ?? undefined,
      status: data.status ?? undefined,
    },
  })

  return NextResponse.json(tour)
})

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

  const bookingCount = await prisma.sICTourBooking.count({ where: { sicTourId: id } })
  if (bookingCount > 0) {
    throw new AuthError('Cannot delete tour with linked bookings. Remove all bookings first.', 400)
  }

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