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 query = await prisma.query.findUnique({
    where: { id },
    include: {
      tripSource: { select: { name: true } },
      assignedTo: { select: { name: true } },
    },
  })
  if (!query) throw new AuthError('Query not found', 404)
  return NextResponse.json(query)
})

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

  const query = await prisma.query.update({
    where: { id },
    data: {
      ...data,
      adults: data.adults !== undefined ? parseInt(data.adults) : undefined,
      children: data.children !== undefined ? parseInt(data.children) : undefined,
      infants: data.infants !== undefined ? parseInt(data.infants) : undefined,
      nights: data.nights !== undefined ? (data.nights ? parseInt(data.nights) : null) : undefined,
      budget: data.budget !== undefined ? (data.budget ? parseFloat(data.budget) : null) : undefined,
      travelStartDate: data.travelStartDate !== undefined ? (data.travelStartDate ? new Date(data.travelStartDate) : null) : undefined,
      travelEndDate: data.travelEndDate !== undefined ? (data.travelEndDate ? new Date(data.travelEndDate) : null) : undefined,
      tripSourceId: data.tripSourceId !== undefined ? (data.tripSourceId || null) : undefined,
      assignedToId: data.assignedToId !== undefined ? (data.assignedToId || null) : undefined,
    },
  })

  return NextResponse.json(query)
})

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

  const query = await prisma.query.findUnique({ where: { id } })
  if (!query) throw new AuthError('Query not found', 404)
  if (query.stage !== 'NEW') throw new AuthError('Only queries in NEW stage can be deleted', 400)

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