import { axiosClient } from '@/api/axiosClient'

/**
 * Auditoría — UDT-010 Batch 12
 *
 * Cliente Axios para GET /api/v1/audit/events.
 * Endpoint cursor-paginated (NO offset). Permiso requerido: administracion:auditoria:ver.
 */

/** Shape del evento devuelto por el backend (B5/B6). */
export interface AuditEventDto {
  id: number
  /** ISO datetime (UTC) */
  occurredAt: string
  actorUserId: number | null
  actorUsername: string | null
  action: string
  targetType: string
  targetId: string
  correlationId: string | null
  ipAddress: string | null
  /** JSON string serializado (opcional) */
  metadata: string | null
}

/** Respuesta cursor-paginated: items + cursor opaco para la siguiente página. */
export interface AuditEventsPage {
  items: AuditEventDto[]
  nextCursor: string | null
}

/** Filtro de consulta. Todos opcionales; `cursor` pagina; `limit` ≤ 100. */
export interface AuditEventsFilter {
  actor?: number
  targetType?: string
  targetId?: string
  /** ISO datetime inclusive desde */
  from?: string
  /** ISO datetime inclusive hasta */
  to?: string
  cursor?: string
  limit?: number
}

/**
 * Llama GET /api/v1/audit/events con los filtros dados.
 * Omite params undefined/empty del querystring.
 */
export async function listAuditEvents(
  filter: AuditEventsFilter = {},
): Promise<AuditEventsPage> {
  const params = new URLSearchParams()

  if (filter.actor !== undefined) params.set('actor', String(filter.actor))
  if (filter.targetType !== undefined && filter.targetType !== '')
    params.set('targetType', filter.targetType)
  if (filter.targetId !== undefined && filter.targetId !== '')
    params.set('targetId', filter.targetId)
  if (filter.from !== undefined && filter.from !== '')
    params.set('from', filter.from)
  if (filter.to !== undefined && filter.to !== '') params.set('to', filter.to)
  if (filter.cursor !== undefined && filter.cursor !== '')
    params.set('cursor', filter.cursor)
  if (filter.limit !== undefined) params.set('limit', String(filter.limit))

  const response = await axiosClient.get<AuditEventsPage>(
    '/api/v1/audit/events',
    { params },
  )
  return response.data
}
