import { timingSafeEqual } from 'node:crypto'
import { NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
import { createAdminClient } from '@/lib/supabase/admin'
import { processWorkspacePermit } from '@/lib/data/permit-processing'
import { publicOrigin } from '@/lib/app-url'

export const runtime = 'nodejs'
export const maxDuration = 300

const schema = z.object({ permit_id: z.string().uuid().optional(), enqueue: z.boolean().default(false) })

/** Process one due job per invocation. Existing imports are opt-in and silent. */
export async function POST(req: NextRequest) {
  const expected = process.env.CRON_SECRET || ''
  const supplied = req.headers.get('authorization') || ''
  const valid = expected.length >= 32 && Buffer.byteLength(supplied) === Buffer.byteLength(`Bearer ${expected}`)
    && timingSafeEqual(Buffer.from(supplied), Buffer.from(`Bearer ${expected}`))
  if (!valid) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
  const parsed = schema.safeParse(await req.json().catch(() => ({})))
  if (!parsed.success) return NextResponse.json({ error: 'Invalid request' }, { status: 400 })
  const input = parsed.data
  if (input.enqueue) {
    if (!input.permit_id) return NextResponse.json({ error: 'permit_id is required' }, { status: 400 })
    const admin = createAdminClient()
    const { data: permit } = await admin.from('permits').select('id,document_id').eq('id', input.permit_id).single()
    if (!permit?.document_id) return NextResponse.json({ error: 'Permit file not found' }, { status: 404 })
    const { error } = await admin.from('permit_processing_jobs').upsert({
      permit_id: permit.id, notify_contacts: false,
    }, { onConflict: 'permit_id', ignoreDuplicates: true })
    if (error) return NextResponse.json({ error: 'Permit queue unavailable' }, { status: 503 })
    return NextResponse.json({ ok: true, queued: true })
  }
  const result = await processWorkspacePermit({ permitId: input.permit_id, origin: publicOrigin(req) })
  return NextResponse.json(result, { status: result.ok ? 200 : 503 })
}
