/**
 * API endpoint para obtener IDs de empleados presentes
 * Consulta la tabla Asistencias del proyecto facturador en Supabase via Metabase API
 * Un empleado está "presente" si su última asistencia tiene entrada pero NO tiene salida
 */

interface MetabaseResponse {
  data: {
    cols: Array<{ name: string }>
    rows: Array<Array<unknown>>
  }
}

export default defineEventHandler(async (event): Promise<number[]> => {
  const config = useRuntimeConfig()
  const headers = getRequestHeaders(event)

  // Verificar autenticación
  const uid = headers['x-authentik-uid']
  if (!uid) {
    throw createError({
      statusCode: 401,
      message: 'Usuario no autenticado'
    })
  }

  // Obtener configuración de Metabase
  const metabaseUrl = config.metabaseApiUrl as string
  const metabaseApiKey = config.metabaseApiKey as string
  const databaseId = config.metabaseDatabaseId as number

  if (!metabaseApiKey) {
    throw createError({
      statusCode: 500,
      message: 'API Key de Metabase no configurada'
    })
  }

  // Query nativa para obtener empleados presentes
  // Busca la última asistencia de cada empleado donde salida es NULL
  const nativeQuery = `
    WITH ultima_asistencia AS (
      SELECT
        empleado_id,
        entrada,
        salida,
        ROW_NUMBER() OVER (PARTITION BY empleado_id ORDER BY entrada DESC) as rn
      FROM asistencias
      WHERE entrada IS NOT NULL
    )
    SELECT empleado_id
    FROM ultima_asistencia
    WHERE rn = 1 AND salida IS NULL
  `

  const metabaseQuery = {
    database: databaseId,
    type: 'native',
    native: {
      query: nativeQuery
    }
  }

  try {
    const response = await $fetch<MetabaseResponse>(`${metabaseUrl}/api/dataset`, {
      method: 'POST',
      headers: {
        'X-API-Key': metabaseApiKey,
        'Content-Type': 'application/json'
      },
      body: metabaseQuery
    })

    // Extraer los IDs de empleados presentes
    const presentIds: number[] = response.data.rows.map(row => row[0] as number)

    return presentIds
  } catch (error: unknown) {
    console.error('Error al obtener empleados presentes de Metabase:', error)
    const err = error as { statusCode?: number; message?: string }
    throw createError({
      statusCode: err.statusCode || 500,
      message: err.message || 'Error al obtener empleados presentes'
    })
  }
})
