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 payment = await prisma.payment.findUnique({
    where: { id },
    include: {
      booking: { select: { bookingNo: true } },
    },
  })
  if (!payment) throw new AuthError('Payment not found', 404)

  return NextResponse.json(payment)
})

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

  const payment = await prisma.payment.update({
    where: { id },
    data: {
      amount: data.amount !== undefined ? parseFloat(data.amount) : undefined,
      paymentDate: data.paymentDate ? new Date(data.paymentDate) : undefined,
      dueDate: data.dueDate !== undefined ? (data.dueDate ? new Date(data.dueDate) : null) : undefined,
      method: data.method !== undefined ? (data.method || null) : undefined,
      referenceNo: data.referenceNo !== undefined ? (data.referenceNo || null) : undefined,
      status: data.status || undefined,
      installmentNo: data.installmentNo !== undefined ? (data.installmentNo ? parseInt(data.installmentNo) : null) : undefined,
      notes: data.notes !== undefined ? (data.notes || null) : undefined,
      currency: data.currency || undefined,
    },
  })

  // Update booking paidAmount
  const total = await prisma.payment.aggregate({
    where: { bookingId: payment.bookingId, status: { not: 'REFUNDED' } },
    _sum: { amount: true },
  })
  await prisma.booking.update({
    where: { id: payment.bookingId },
    data: { paidAmount: total._sum.amount || 0 },
  })

  return NextResponse.json(payment)
})

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

  const payment = await prisma.payment.findUnique({ where: { id } })
  if (!payment) throw new AuthError('Payment not found', 404)
  if (payment.status !== 'PENDING') throw new AuthError('Only PENDING payments can be deleted', 400)

  await prisma.payment.delete({ where: { id } })

  // Update booking paidAmount
  const total = await prisma.payment.aggregate({
    where: { bookingId: payment.bookingId, status: { not: 'REFUNDED' } },
    _sum: { amount: true },
  })
  await prisma.booking.update({
    where: { id: payment.bookingId },
    data: { paidAmount: total._sum.amount || 0 },
  })

  return NextResponse.json({ message: 'Deleted' })
})
