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 operations = await prisma.dailyOperation.findMany({
    include: {
      booking: {
        select: { bookingNo: true },
      },
      driver: {
        select: { id: true, name: true, phone: true },
      },
    },
    orderBy: [
      { date: 'desc' },
      { startTime: 'asc' },
    ],
  })

  return NextResponse.json(operations)
})

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

  let driverData: { driverName: string | null; driverPhone: string | null; vehicleNo: string | null; vehicleType: string | null } = {
    driverName: data.driverName || null,
    driverPhone: data.driverPhone || null,
    vehicleNo: data.vehicleNo || null,
    vehicleType: data.vehicleType || null,
  }

  if (data.driverId) {
    const driver = await prisma.driver.findUnique({
      where: { id: data.driverId },
      select: { name: true, phone: true, vehicle: { select: { registrationNo: true, vehicleType: true } } },
    })
    if (driver) {
      driverData = {
        driverName: driver.name,
        driverPhone: driver.phone,
        vehicleNo: driver.vehicle?.registrationNo || data.vehicleNo || null,
        vehicleType: driver.vehicle?.vehicleType || data.vehicleType || null,
      }
    }
  }

  const operation = await prisma.dailyOperation.create({
    data: {
      bookingId: data.bookingId,
      date: new Date(data.date),
      operationType: data.operationType,
      title: data.title,
      description: data.description || null,
      startTime: data.startTime || null,
      endTime: data.endTime || null,
      fromLocation: data.fromLocation || null,
      toLocation: data.toLocation || null,
      driverId: data.driverId || null,
      driverName: driverData.driverName,
      driverPhone: driverData.driverPhone,
      vehicleNo: driverData.vehicleNo,
      vehicleType: driverData.vehicleType,
      paxCount: data.paxCount ? parseInt(data.paxCount) : null,
      guestName: data.guestName || null,
      status: data.status || 'SCHEDULED',
      notes: data.notes || null,
    },
  })

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