/**
 * Settings KB routes — settings-kb (wave-14).
 *
 * GET  /api/settings/kb  — return tenant KB settings
 * PATCH /api/settings/kb — update tenant KB settings
 *
 * Both routes require `users:manage` permission.
 */
import { Hono } from 'hono'
import { z } from 'zod'
import {
  createDb,
  getKbSettings,
  upsertKbSettings,
  KbDefaultSpaceCrossTenantError,
} from '@zync/db/queries'
import type { AppEnv } from '../types'
import { authMiddleware } from '../middleware/auth'
import { requirePermission } from '../middleware/guards'

const patchKbSettingsSchema = z.object({
  kb_require_review: z.boolean().optional(),
  kb_versioning_enabled: z.boolean().optional(),
  kb_default_space_id: z.string().uuid().nullable().optional(),
})

export const settingsKbRoute = new Hono<AppEnv>()

settingsKbRoute.use('*', authMiddleware)

// GET /api/settings/kb
settingsKbRoute.get('/', requirePermission('users:manage'), async (c) => {
  const session = c.get('session')
  if (!session || session.type !== 'user' || !session.tid) {
    return c.json({ error: 'Unauthorized' }, 401)
  }

  const db = createDb(c.env)
  const settings = await getKbSettings(db, session.tid)
  return c.json(settings, 200)
})

// PATCH /api/settings/kb
settingsKbRoute.patch('/', requirePermission('users:manage'), async (c) => {
  const session = c.get('session')
  if (!session || session.type !== 'user' || !session.tid) {
    return c.json({ error: 'Unauthorized' }, 401)
  }

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

  const db = createDb(c.env)
  try {
    const updated = await upsertKbSettings(db, session.tid, parsed.data)
    return c.json(updated, 200)
  } catch (err) {
    if (err instanceof KbDefaultSpaceCrossTenantError) {
      return c.json({ error: err.message }, 422)
    }
    throw err
  }
})
