import { timingSafeEqual } from 'node:crypto'
import { NextRequest, NextResponse } from 'next/server'
import { getPermitProfileFeed } from '@/lib/adapters/flask'
import { reconcilePermitProfiles } from '@/lib/data/permit-profiles'
import { createAdminClient } from '@/lib/supabase/admin'

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

/** Run repeatedly until both feeds report has_more=false. Historical imports send no email. */
export async function POST(req: NextRequest) {
  const expected = process.env.CRON_SECRET || ''
  const supplied = req.headers.get('authorization') || ''
  const wanted = `Bearer ${expected}`
  const valid = expected.length >= 32 && Buffer.byteLength(supplied) === Buffer.byteLength(wanted)
    && timingSafeEqual(Buffer.from(supplied), Buffer.from(wanted))
  if (!valid) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
  const body = await req.json().catch(() => ({}))
  const feed = body?.feed === 'permit_extractions' ? 'permit_extractions' : body?.feed === 'orders' ? 'orders' : null
  if (!feed && body?.feed !== 'pending') return NextResponse.json({ error: 'feed must be orders, permit_extractions, or pending' }, { status: 400 })
  const admin = createAdminClient()
  if (body?.feed === 'pending') {
    const pending = await admin.from('permit_profile_observations').select('*').eq('status', 'pending').order('observed_at').limit(20)
    if (pending.error) return NextResponse.json({ error: 'Pending observations unavailable' }, { status: 503 })
    let processed = 0
    try {
      for (const item of pending.data || []) {
        await reconcilePermitProfiles(item)
        processed++
      }
    } catch (error) {
      console.error('permit_profile_retry', { processed, error: error instanceof Error ? error.message : 'unknown' })
      return NextResponse.json({ error: 'Pending profile retry failed', processed }, { status: 503 })
    }
    return NextResponse.json({ ok: true, feed: 'pending', processed, has_more: (pending.data || []).length === 20 })
  }
  if (!feed) return NextResponse.json({ error: 'Invalid feed' }, { status: 400 })
  const cursor = await admin.from('factory_profile_sync_cursors').select('last_id').eq('feed', feed).maybeSingle()
  if (cursor.error) return NextResponse.json({ error: 'Cursor unavailable' }, { status: 503 })
  const page = await getPermitProfileFeed(feed, cursor.data?.last_id)
  if (!page.ok || !page.data) return NextResponse.json({ error: 'Factory feed unavailable' }, { status: 503 })
  let processed = 0
  try {
    for (const item of page.data.items) {
      await reconcilePermitProfiles(item)
      processed++
    }
    if (page.data.next_cursor) {
      const update = await admin.from('factory_profile_sync_cursors').upsert({
        feed, last_id: page.data.next_cursor, updated_at: new Date().toISOString(),
      }, { onConflict: 'feed' })
      if (update.error) throw new Error('cursor_save_failed')
    }
  } catch (error) {
    console.error('permit_profile_sync', { feed, processed, error: error instanceof Error ? error.message : 'unknown' })
    return NextResponse.json({ error: 'Profile sync failed', processed }, { status: 503 })
  }
  return NextResponse.json({ ok: true, feed, processed, has_more: page.data.has_more })
}
