import { NextRequest, NextResponse } from 'next/server'
import { createAdminClient } from '@/lib/supabase/admin'
import { getSessionUser } from '@/lib/auth'
import { logTripEvent } from '@/lib/audit'

/** Accept a trip invitation: link the participant row to the signed-in user. */
export async function POST(req: NextRequest) {
  const user = await getSessionUser()
  if (!user) return NextResponse.json({ error: 'Sign in first.' }, { status: 401 })

  const { token } = (await req.json().catch(() => ({}))) as { token?: string }
  if (!token) return NextResponse.json({ error: 'Missing token.' }, { status: 400 })

  const admin = createAdminClient()
  const { data: invitation } = await admin
    .from('trip_invitations')
    .select('*')
    .eq('token', token)
    .maybeSingle()

  if (!invitation || new Date(invitation.expires_at).getTime() < Date.now()) {
    return NextResponse.json({ error: 'Invitation is invalid or expired.' }, { status: 404 })
  }
  if (invitation.accepted_at) {
    return NextResponse.json({ ok: true, trip_id: invitation.trip_id })
  }

  // Link (or create) the participant row for this user.
  if (invitation.participant_id) {
    await admin
      .from('trip_participants')
      .update({ user_id: user.id, status: 'active' })
      .eq('id', invitation.participant_id)
  } else {
    await admin.from('trip_participants').upsert(
      {
        trip_id: invitation.trip_id,
        user_id: user.id,
        email: invitation.email,
        name: user.name,
        role: invitation.role,
        status: 'active',
      },
      { onConflict: 'trip_id,email,role' },
    )
  }

  await admin
    .from('trip_invitations')
    .update({ accepted_at: new Date().toISOString(), accepted_by: user.id })
    .eq('id', invitation.id)

  await logTripEvent({
    tripId: invitation.trip_id,
    actorId: user.id,
    actorLabel: user.name || user.email,
    action: 'invitation_accepted',
    detail: { role: invitation.role },
  })

  return NextResponse.json({ ok: true, trip_id: invitation.trip_id })
}
