import { NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
import { createAdminClient } from '@/lib/supabase/admin'
import { getSessionUser } from '@/lib/auth'
import { isMissingColumn } from '@/lib/db-compat'
import { isLanguageCode, resolveLanguagePrefs } from '@/lib/domain/languages'

/**
 * Save the user's agent-chat languages (Task 71). Nash: "It should stick to
 * your profile" — so this lives on `profiles`, not on a trip.
 *
 * Body: { languages: string[], primary: string }. The server re-validates:
 * only the four launch languages, no duplicates, never empty, primary must be
 * enabled. The same normalisation the readers use (resolveLanguagePrefs).
 */
const schema = z.object({
  languages: z.array(z.string()).min(1).max(4),
  primary: z.string(),
})

export async function POST(req: NextRequest) {
  const user = await getSessionUser()
  if (!user) return NextResponse.json({ error: 'Sign in first.' }, { status: 401 })

  const parsed = schema.safeParse(await req.json().catch(() => ({})))
  if (!parsed.success) return NextResponse.json({ error: 'Invalid languages.' }, { status: 400 })
  const { languages, primary } = parsed.data

  if (!languages.every(isLanguageCode) || !isLanguageCode(primary)) {
    return NextResponse.json({ error: 'Unknown language.' }, { status: 400 })
  }
  const prefs = resolveLanguagePrefs({ chat_languages: languages, primary_language: primary })
  if (prefs.primary !== primary) {
    return NextResponse.json(
      { error: 'The default language must be one of your enabled languages.' },
      { status: 400 },
    )
  }

  const admin = createAdminClient()
  // Profile rows are upserted at sign-in; upsert here too so a first save on
  // a fresh account never fails on a missing row.
  const { error } = await admin.from('profiles').upsert(
    {
      id: user.id,
      email: user.email,
      full_name: user.name,
      default_role: user.role,
      chat_languages: prefs.languages,
      primary_language: prefs.primary,
    },
    { onConflict: 'id' },
  )

  if (isMissingColumn(error, 'chat_languages', 'primary_language')) {
    return NextResponse.json(
      { error: 'Saving chat languages needs database migration 0011.' },
      { status: 503 },
    )
  }
  if (error) return NextResponse.json({ error: 'Could not save your languages.' }, { status: 500 })

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