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

export const GET = safeHandler(async (req: Request) => {
  await requireAuth()
  const { searchParams } = new URL(req.url)
  const search = searchParams.get('search') || ''

  const payments = await prisma.payment.findMany({
    where: search ? {
      paymentNo: { contains: search, mode: 'insensitive' },
    } : undefined,
    include: {
      booking: {
        select: { bookingNo: true },
      },
    },
    orderBy: { createdAt: 'desc' },
  })

  return NextResponse.json(payments)
})

export const POST = safeHandler(async (req: Request) => {
  await requireAuth()
  const data = await req.json()

  // Find or create number series for payments
  let series = await prisma.numberSeries.findFirst({ where: { module: 'PAYMENT', docType: 'PAYMENT' } })
  if (!series) {
    series = await prisma.numberSeries.create({
      data: { prefix: 'PAY', module: 'PAYMENT', docType: 'PAYMENT', nextNumber: 1, format: '{PREFIX}-{YEAR}-{NUM:4}' }
    })
  }
  const year = new Date().getFullYear()
  const paymentNo = `${series.prefix}-${year}-${String(series.nextNumber).padStart(4, '0')}`

  const payment = await prisma.payment.create({
    data: {
      paymentNo,
      bookingId: data.bookingId,
      amount: parseFloat(data.amount),
      currency: data.currency || 'USD',
      paymentDate: data.paymentDate ? new Date(data.paymentDate) : new Date(),
      dueDate: data.dueDate ? new Date(data.dueDate) : null,
      method: data.method || null,
      referenceNo: data.referenceNo || null,
      status: data.status || 'PENDING',
      installmentNo: data.installmentNo ? parseInt(data.installmentNo) : null,
      notes: data.notes || null,
    },
  })

  // Increment the number series
  await prisma.numberSeries.update({ where: { id: series.id }, data: { nextNumber: { increment: 1 } } })

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

  return NextResponse.json(payment, { status: 201 })
})
