/**
 * GET /api/chat/directory → { records: [{ id, name, email }] }
 *
 * Slim, purpose-built colleague list for the chat drawer: only chat-eligible
 * staff (IsSystemUser + IsChatEnabled + active), only id/name/email. This used
 * to reuse /api/admin/users, which returns EVERY ad_user row with all fields —
 * heavy enough that the drawer showed "Keine Kollegen" for seconds on open.
 * Gated to staff (chatAccess.gateFromEvent).
 *
 * Fast path filters on the custom IsChatEnabled column server-side; if that
 * OData filter is unsupported it falls back to the proven broad query and
 * filters IsChatEnabled in JS, so the list never comes back empty over a quirk.
 */

import { string } from 'alga-js'
import { gateFromEvent } from '../../utils/chatAccess'

const isChatEnabled = (u: any) => u?.IsChatEnabled === true || u?.isChatEnabled === true

const fetchDirectory = async (event: any, token: string): Promise<any[]> => {
  try {
    // Fast path: server-side filter to just chat-eligible staff + slim columns.
    const filter = string.urlEncode('isSystemUser eq true AND isChatEnabled eq true AND isActive eq true')
    const res: any = await event.context.fetch(
      `models/ad_user?$filter=${filter}&$select=AD_User_ID,Name,EMail&$orderby=${string.urlEncode('Name asc')}`,
      'GET', token, null
    )
    return res?.records || []
  } catch {
    // Fallback: proven broad query (no custom column), filter IsChatEnabled in JS.
    const filter = string.urlEncode('isActive eq true AND isSystemUser eq true')
    const res: any = await event.context.fetch(
      `models/ad_user?$filter=${filter}&$orderby=${string.urlEncode('Name asc')}`,
      'GET', token, null
    )
    return (res?.records || []).filter(isChatEnabled)
  }
}

export default defineEventHandler(async (event) => {
  const config = useRuntimeConfig()
  if (config.chatEnabled !== true) {
    setResponseStatus(event, 404)
    return { error: 'chat disabled' }
  }

  let token: string
  try {
    ({ token } = await gateFromEvent(event))
  } catch (err: any) {
    setResponseStatus(event, err?.statusCode || 403)
    return { error: 'forbidden' }
  }

  let rows: any[] = []
  try {
    rows = await fetchDirectory(event, token)
  } catch (err: any) {
    console.error('[chat/directory] fetch failed:', err?.message)
    rows = []
  }

  const records = rows.map((u: any) => ({
    id: Number(u.id),
    name: u.Name || u.name || ('User ' + u.id),
    email: u.EMail || u.Email || u.email || ''
  }))
  return { records }
})
