import { NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
import { requireParticipant } from '@/lib/api-guard'
import { createTripVoiceSession } from '@/lib/adapters/flask'
import { syncTripToHha } from '@/lib/integrations/hha-trip-sync'
import { logTripAiEvent, tripAiRequestId } from '@/lib/observability/trip-ai-log'

const schema = z.object({
  browser_id: z.string().trim().min(1).max(200),
  language: z.enum(['en', 'es', 'ru', 'ro']),
})

export async function POST(req: NextRequest, ctx: { params: Promise<{ id: string }> }) {
  const requestId = tripAiRequestId(req)
  const startedAt = Date.now()
  const { id: tripId } = await ctx.params
  await logTripAiEvent('voice_token_received', { request_id: requestId, trip_id: tripId })
  const guard = await requireParticipant(tripId)
  if (!guard.ok) {
    await logTripAiEvent('voice_token_denied', {
      request_id: requestId,
      trip_id: tripId,
      status: 'denied',
      http_status: guard.response.status,
    })
    return guard.response
  }

  const parsed = schema.safeParse(await req.json().catch(() => ({})))
  if (!parsed.success) {
    await logTripAiEvent('voice_token_validation_failed', {
      request_id: requestId,
      trip_id: tripId,
      status: 'error',
    })
    return NextResponse.json({ error: 'Invalid voice session request.' }, { status: 400 })
  }

  const sync = await syncTripToHha(tripId, requestId)
  await logTripAiEvent('pre_voice_sync_completed', {
    request_id: requestId,
    trip_id: tripId,
    status: sync.ok ? 'ok' : 'error',
    matched_all_orders: sync.matchedAllOrders,
    error_type: sync.ok ? undefined : sync.error,
  })
  if (!sync.ok) {
    return NextResponse.json({ error: 'Trip data could not be prepared for voice.' }, { status: 502 })
  }

  const result = await createTripVoiceSession({
    workspace_trip_id: tripId,
    browser_id: parsed.data.browser_id,
    name: guard.participant.name || guard.user.email || 'Workspace user',
    language: parsed.data.language,
    request_id: requestId,
  })
  if (!result.ok || !result.data) {
    await logTripAiEvent('voice_token_failed', {
      request_id: requestId,
      trip_id: tripId,
      status: 'error',
      language: parsed.data.language,
      error_type: result.error,
      duration_ms: Date.now() - startedAt,
    })
    return NextResponse.json(
      { error: result.error || 'Voice service is unavailable.' },
      { status: 502 },
    )
  }
  await logTripAiEvent('voice_token_completed', {
    request_id: requestId,
    trip_id: tripId,
    language: parsed.data.language,
    room_name: result.data.room_name,
    session_id: result.data.session_id,
    duration_ms: Date.now() - startedAt,
  })
  return NextResponse.json(result.data)
}
