export function sleep(ms: number): Promise<void> {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

/**
 * Executa os itens sequencialmente, respeitando um intervalo mínimo entre envios.
 * Usado para o provedor SES, cujo limite de sandbox é de 1 envio/segundo — uma
 * concorrência de lote (como a usada para SMTP) estouraria o limite e geraria
 * `TooManyRequestsException` na maior parte das chamadas.
 */
export async function runSequentialWithRateLimit<T>(
  items: T[],
  ratePerSecond: number,
  worker: (item: T) => Promise<boolean>
): Promise<{ successCount: number; failureCount: number }> {
  let successCount = 0;
  let failureCount = 0;
  const intervalMs = ratePerSecond > 0 ? 1000 / ratePerSecond : 0;

  for (let i = 0; i < items.length; i += 1) {
    const ok = await worker(items[i]).catch(() => false);

    if (ok) {
      successCount += 1;
    } else {
      failureCount += 1;
    }

    if (intervalMs > 0 && i < items.length - 1) {
      await sleep(intervalMs);
    }
  }

  return { successCount, failureCount };
}
