import { NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
import { addCartItem } from '@/lib/data/purchases'
import { resolveRoutingProduct } from '@/lib/data/routing-products'
import { requireCartAccess } from '@/lib/purchase-api'

const schema = z.object({
  permit_id: z.string().uuid(),
  product_code: z.string().trim().min(1).max(64),
  quantity: z.number().int().min(1).max(5).optional(),
})

/** Add a route to the trip's cart. The client never sends a price (task §4.1, §6). */
export async function POST(req: NextRequest, ctx: { params: Promise<{ id: string }> }) {
  const { id } = await ctx.params
  const guard = await requireCartAccess(id)
  if (!guard.ok) return guard.response
  const parsed = schema.safeParse(await req.json().catch(() => null))
  if (!parsed.success) return NextResponse.json({ error: 'Invalid request.' }, { status: 400 })

  const resolution = await resolveRoutingProduct(parsed.data.product_code)
  if (!resolution.ok) {
    if (resolution.reason === 'catalog_unavailable') return NextResponse.json({ error: 'Routing products are not available yet.' }, { status: 503 })
    if (resolution.reason === 'inactive_product') return NextResponse.json({ error: 'That routing product is no longer offered.' }, { status: 400 })
    return NextResponse.json({ error: 'Unknown routing product.' }, { status: 400 })
  }

  const result = await addCartItem({
    trip: guard.trip,
    userId: guard.user.id,
    actorLabel: guard.actorLabel,
    permitId: parsed.data.permit_id,
    productCode: resolution.product.product_code,
    quantity: parsed.data.quantity,
    product: resolution.product,
  })
  if (!result.ok) return NextResponse.json({ error: result.error }, { status: result.status })
  return NextResponse.json({ ok: true, cart: result.cart })
}
