import { NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
import { createAdminClient } from '@/lib/supabase/admin'
import { parseLeadsCsv } from '@/lib/domain/pilot-leads-csv'
import { importPilotLeads, pilotNetworkAvailable } from '@/lib/data/pilot-network'
import { migrationMissing, requireInternal } from '../_guard'

/**
 * Full-dataset import entry point (§27): CSV text with name, company, phone,
 * email, state, capabilities. Dry run first, then commit. Duplicates merge
 * (§28). Logged in import_runs / import_records.
 */
const schema = z.object({ csv: z.string().min(1).max(20_000_000), source_system: z.string().trim().min(1).max(120), source_reference: z.string().trim().max(300).optional(), dry_run: z.boolean() })

export async function POST(req: NextRequest) {
  const guard = await requireInternal()
  if (!guard.ok) return guard.response
  const parsed = schema.safeParse(await req.json().catch(() => ({})))
  if (!parsed.success) return NextResponse.json({ error: 'Invalid request.' }, { status: 400 })
  const admin = createAdminClient()
  if (!(await pilotNetworkAvailable(admin))) return migrationMissing()
  const { rows, errors } = parseLeadsCsv(parsed.data.csv)
  if (rows.length === 0) return NextResponse.json({ error: errors[0] ?? 'No rows found. Expected columns: name, company, phone, email, state, capabilities.' }, { status: 400 })
  const result = await importPilotLeads(rows, { sourceSystem: parsed.data.source_system, sourceReference: parsed.data.source_reference ?? null, triggeredBy: guard.actor.label, actorId: guard.actor.id, dryRun: parsed.data.dry_run }, admin)
  return NextResponse.json({ ok: true, result, parse_errors: errors })
}
