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 queries = await prisma.query.findMany({
    where: search ? {
      OR: [
        { queryNo: { contains: search, mode: 'insensitive' } },
        { leadName: { contains: search, mode: 'insensitive' } },
        { leadEmail: { contains: search, mode: 'insensitive' } },
      ],
    } : undefined,
    include: {
      tripSource: { select: { name: true } },
      assignedTo: { select: { name: true } },
    },
    orderBy: { date: 'desc' },
  })

  return NextResponse.json(queries)
})

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

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

  // Lead auto-distribution: if no assignedToId, auto-assign based on settings
  let assignedToId = data.assignedToId || null
  if (!assignedToId) {
    const settings = await prisma.companySettings.findUnique({ where: { id: 'default' } })
    const mode = settings?.leadDistributionMode || 'MANUAL'

    if (mode === 'ROUND_ROBIN') {
      const salesUsers = await prisma.user.findMany({
        where: { role: 'SALES', isActive: true },
        orderBy: { createdAt: 'asc' },
        select: { id: true },
      })
      if (salesUsers.length > 0) {
        const lastId = settings?.lastAssignedUserId
        const lastIdx = lastId ? salesUsers.findIndex(u => u.id === lastId) : -1
        const nextIdx = (lastIdx + 1) % salesUsers.length
        assignedToId = salesUsers[nextIdx].id
        await prisma.companySettings.update({
          where: { id: 'default' },
          data: { lastAssignedUserId: assignedToId },
        })
      }
    } else if (mode === 'LOAD_BALANCED') {
      const salesUsers = await prisma.user.findMany({
        where: { role: 'SALES', isActive: true },
        select: { id: true, _count: { select: { queriesAssigned: { where: { stage: { in: ['NEW', 'IN_PROGRESS', 'QUOTED'] } } } } } },
      })
      if (salesUsers.length > 0) {
        salesUsers.sort((a, b) => a._count.queriesAssigned - b._count.queriesAssigned)
        assignedToId = salesUsers[0].id
      }
    }
  }

  const query = await prisma.query.create({
    data: {
      ...data,
      queryNo,
      adults: data.adults ? parseInt(data.adults) : 2,
      children: data.children ? parseInt(data.children) : 0,
      infants: data.infants ? parseInt(data.infants) : 0,
      nights: data.nights ? parseInt(data.nights) : null,
      budget: data.budget ? parseFloat(data.budget) : null,
      travelStartDate: data.travelStartDate ? new Date(data.travelStartDate) : null,
      travelEndDate: data.travelEndDate ? new Date(data.travelEndDate) : null,
      tripSourceId: data.tripSourceId || null,
      assignedToId,
      createdById: userId,
    },
  })

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

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