/**
 * Tenant locale settings route — timezone-handling (wave-11 leaf-E).
 * Mounted at /api/settings/locale.
 *
 * PATCH / → update tenant operations timezone (settings:modules:write)
 */
import { Hono } from 'hono'
import { z } from 'zod'
import type { AppEnv } from '../../types'
import { authMiddleware } from '../../middleware/auth'
import { requirePermission } from '../../middleware/guards'
import { createDb, getTenantTimezone, setTenantTimezone } from '@zync/db/queries'
import { isValidTimezone } from '@zync/types'

export const updateTenantLocaleSchema = z.object({
  timezone: z
    .string()
    .refine(isValidTimezone, { message: 'Invalid IANA timezone' })
    .optional(),
})

export const settingsLocaleRoute = new Hono<AppEnv>()

settingsLocaleRoute.use('*', authMiddleware)

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

  const db = c.get('db') ?? createDb(c.env)
  const timezone = await getTenantTimezone(db, session.tid)
  return c.json({ timezone }, 200)
})

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

  const body = await c.req.json().catch(() => null)
  const parsed = updateTenantLocaleSchema.safeParse(body)
  if (!parsed.success) {
    return c.json({ error: 'Validation failed', issues: parsed.error.issues }, 400)
  }

  if (parsed.data.timezone === undefined) {
    return c.json({ error: 'No updatable field supplied' }, 422)
  }

  const db = c.get('db') ?? createDb(c.env)
  const result = await setTenantTimezone(db, session.tid, session.sub, parsed.data.timezone)
  return c.json({ timezone: result.defaultTimezone }, 200)
})
