import { NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
import { createHash, randomBytes } from 'node:crypto'
import { getSessionUser } from '@/lib/auth'
import { createAdminClient } from '@/lib/supabase/admin'
import { sendPlatformEmail } from '@/lib/email/send'
import { publicOrigin } from '@/lib/app-url'
import { logSecurityEvent } from '@/lib/security/events'
import { clientIp } from '@/lib/security/rate-limit'

/**
 * Secure intake invitation links (2026-09-22, §15): a freight broker invites a
 * known carrier / dispatcher by email. The link carries a token tied to the
 * broker page, the email and a 14-day expiry; following it (and confirming
 * the email with a code) gives the lowest-friction, highest-trust path.
 */
const schema = z.object({ email: z.string().trim().email().max(200), name: z.string().trim().max(120).optional() })

export async function POST(req: NextRequest) {
  const user = await getSessionUser()
  if (!user) return NextResponse.json({ error: 'Sign in first.' }, { status: 401 })
  if (user.role !== 'broker' && user.role !== 'admin') return NextResponse.json({ error: 'Only a freight broker can send intake invitations.' }, { status: 403 })
  const parsed = schema.safeParse(await req.json().catch(() => ({})))
  if (!parsed.success) return NextResponse.json({ error: 'Enter a valid email address.' }, { status: 400 })
  const admin = createAdminClient()
  const { data: page } = await admin.from('broker_pages').select('id, slug, display_name').eq('owner_id', user.id).maybeSingle()
  if (!page) return NextResponse.json({ error: 'Your intake page is not set up yet — open the Broker Dashboard once.' }, { status: 404 })
  const email = parsed.data.email.toLowerCase()
  const token = randomBytes(24).toString('base64url')
  const { error } = await admin.from('intake_invitations').insert({ broker_page_id: page.id, email, email_normalized: email, token_hash: createHash('sha256').update(token).digest('hex'), invited_by_user_id: user.id, invited_by_label: user.name || user.email, expires_at: new Date(Date.now() + 14 * 86_400_000).toISOString() })
  if (error) return NextResponse.json({ error: /does not exist|schema cache/i.test(error.message) ? 'Intake invitations need database migration 0029.' : error.message }, { status: 400 })
  const link = `${publicOrigin(req)}/intake/${page.slug}?invite=${token}`
  const sent = await sendPlatformEmail({ templateKey: 'broker_intake_invitation', to: email, data: { broker_name: page.display_name, invited_by: user.name || user.email, invited_by_email: user.email, intake_link: link, user_name: parsed.data.name ?? '' }, actorUserId: user.id, clean: true })
  await logSecurityEvent({ event: 'login_success', userId: user.id, actorUserId: user.id, actorLabel: user.name || user.email, ip: clientIp(req.headers), detail: { kind: 'intake_invitation_sent', to: email, page: page.slug, email_status: sent.status } })
  return NextResponse.json({ ok: true, link, email_status: sent.status })
}
