-- name: InsertAuditLog :exec
INSERT INTO audit_logs (user_id, action, target_type, target_id, ip, metadata)
VALUES ($1, $2, $3, $4, $5, $6);

-- name: ListAuditLog :many
-- Paginated read with optional filters. NULL filter args match everything
-- (sqlc.narg renders as a nullable parameter; COALESCE/IS NULL short-circuits).
SELECT id, user_id, action, target_type, target_id, ip, metadata, created_at
FROM audit_logs
WHERE (sqlc.narg('user_id')::uuid IS NULL OR user_id = sqlc.narg('user_id'))
  AND (sqlc.narg('action')::text IS NULL OR action = sqlc.narg('action'))
  AND (sqlc.narg('action_prefix')::text IS NULL OR action LIKE sqlc.narg('action_prefix') || '%')
  AND (sqlc.narg('target_type')::text IS NULL OR target_type = sqlc.narg('target_type'))
  AND (sqlc.narg('target_id')::text IS NULL OR target_id = sqlc.narg('target_id'))
  AND (sqlc.narg('from_ts')::timestamptz IS NULL OR created_at >= sqlc.narg('from_ts'))
  AND (sqlc.narg('to_ts')::timestamptz IS NULL OR created_at < sqlc.narg('to_ts'))
ORDER BY created_at DESC, id DESC
LIMIT $1 OFFSET $2;

-- name: CountAuditLog :one
SELECT COUNT(*)
FROM audit_logs
WHERE (sqlc.narg('user_id')::uuid IS NULL OR user_id = sqlc.narg('user_id'))
  AND (sqlc.narg('action')::text IS NULL OR action = sqlc.narg('action'))
  AND (sqlc.narg('action_prefix')::text IS NULL OR action LIKE sqlc.narg('action_prefix') || '%')
  AND (sqlc.narg('target_type')::text IS NULL OR target_type = sqlc.narg('target_type'))
  AND (sqlc.narg('target_id')::text IS NULL OR target_id = sqlc.narg('target_id'))
  AND (sqlc.narg('from_ts')::timestamptz IS NULL OR created_at >= sqlc.narg('from_ts'))
  AND (sqlc.narg('to_ts')::timestamptz IS NULL OR created_at < sqlc.narg('to_ts'));

-- name: DeleteAuditLogsBefore :execrows
DELETE FROM audit_logs WHERE created_at < $1;
