/**
 * PATCH /api/preferences — system-i18n.
 *
 * Updates the authenticated user's locale preference in user_preferences.
 * No audit log required for preference changes (non-sensitive mutation).
 *
 * Security:
 * - Protected by authMiddleware (mounted in routes/index.ts).
 * - Validates locale against the SUPPORTED_LOCALES allow-list (Zod enum).
 * - Returns 401 if no active session; 400 on invalid payload.
 */
import { Hono } from 'hono'
import { z } from 'zod'
import { createDb, setUserLocale, setUserTimezone } from '@zync/db/queries'
import { isValidTimezone } from '@zync/types'
import type { AppEnv } from '../types'
import { authMiddleware } from '../middleware/auth'

const patchPreferencesSchema = z.object({
  locale: z.enum(['en', 'he']).optional(),
  timezone: z.string().refine(isValidTimezone, { message: 'Invalid IANA timezone' }).optional(),
}).refine(
  (value) => value.locale !== undefined || value.timezone !== undefined,
  { message: 'At least one preference is required' },
)

export const preferencesRoute = new Hono<AppEnv>()

preferencesRoute.use('*', authMiddleware)

preferencesRoute.patch('/', async (c) => {
  const session = c.get('session')
  if (!session || session.type !== 'user' || !session.tid) {
    return c.json({ error: 'Unauthorized' }, 401)
  }

  const parsed = patchPreferencesSchema.safeParse(await c.req.json())
  if (!parsed.success) {
    return c.json({ error: 'Invalid request', details: parsed.error.flatten() }, 400)
  }

  const db = createDb(c.env)
  if (parsed.data.locale !== undefined) {
    await setUserLocale(db, session.sub, session.tid, parsed.data.locale)
  }
  if (parsed.data.timezone !== undefined) {
    await setUserTimezone(db, session.sub, session.tid, parsed.data.timezone)
  }

  return c.json({
    locale: parsed.data.locale ?? null,
    timezone: parsed.data.timezone ?? null,
  }, 200)
})
