import { NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
import { createAdminClient } from '@/lib/supabase/admin'
import { requirePermitRequester } from '@/lib/data/permit-request-drafts'
import type { PermitRequestDraft } from '@/types/db'

const schema = z.object({
  state_codes: z.array(z.string().trim().regex(/^[A-Za-z]{2}$/)).min(1).max(30),
  notes: z.string().trim().max(2000).optional().or(z.literal('')),
  document_ids: z.array(z.string().uuid()).max(20).optional(),
  notify: z.array(z.string().uuid()).max(20).optional(),
})

/**
 * Buy More Permits step 1 → draft (2026-09-29 task §9.4). Files are already
 * uploaded to the trip; this only remembers the form so nothing is lost while
 * the customer is on Synchron's secure card page. One pending draft per user
 * per trip: an existing pending draft is updated, never duplicated.
 */
export async function POST(req: NextRequest, ctx: { params: Promise<{ id: string }> }) {
  const { id: tripId } = await ctx.params
  const access = await requirePermitRequester(tripId)
  if (!access.ok) return access.response
  const { user } = access.guard

  const parsed = schema.safeParse(await req.json().catch(() => ({})))
  if (!parsed.success) return NextResponse.json({ error: 'Invalid request.' }, { status: 400 })
  const input = parsed.data

  const values = {
    state_codes: Array.from(new Set(input.state_codes.map((s) => s.toUpperCase()))),
    notes: input.notes || null,
    document_ids: input.document_ids ?? [],
    notify: input.notify ?? null,
    readiness_status: null as string | null,
    status: 'pending' as const,
  }

  const admin = createAdminClient()
  const { data: existing } = await admin
    .from('permit_request_drafts')
    .select('id')
    .eq('trip_id', tripId)
    .eq('user_id', user.id)
    .eq('status', 'pending')
    .maybeSingle()

  const query = existing?.id
    ? admin.from('permit_request_drafts').update(values).eq('id', existing.id).select().single()
    : admin.from('permit_request_drafts').insert({ trip_id: tripId, user_id: user.id, ...values }).select().single()
  const { data, error } = await query
  if (error || !data) return NextResponse.json({ error: 'Could not save the draft.' }, { status: 500 })

  return NextResponse.json({ ok: true, draft: data as PermitRequestDraft })
}
