/**
 * EventBatcher - Acumula eventos e os envia em lotes
 * Reduz latência e consumo de banda, melhorando performance em conexões lentas
 */
export class EventBatcher {
  constructor(config = {}) {
    this.batchSize = config.batchSize || 10; // Envia a cada 10 eventos
    this.batchTimeout = config.batchTimeout || 30000; // Ou a cada 30 segundos
    this.onBatch = config.onBatch || (() => {}); // Callback quando lote está pronto

    this.queue = [];
    this.timeoutId = null;
  }

  add(event) {
    if (!event) return;

    this.queue.push({
      ...event,
      timestamp: new Date().toISOString(),
    });

    // Se atingiu tamanho do lote, enviar imediatamente
    if (this.queue.length >= this.batchSize) {
      this.flush();
    } else if (!this.timeoutId) {
      // Se não tem timer, iniciar
      this.timeoutId = setTimeout(() => this.flush(), this.batchTimeout);
    }
  }

  flush() {
    if (this.queue.length === 0) {
      if (this.timeoutId) {
        clearTimeout(this.timeoutId);
        this.timeoutId = null;
      }
      return;
    }

    const batch = [...this.queue];

    this.queue = [];
    if (this.timeoutId) {
      clearTimeout(this.timeoutId);
      this.timeoutId = null;
    }

    this.onBatch(batch);
  }

  getPendingCount() {
    return this.queue.length;
  }

  destroy() {
    if (this.timeoutId) {
      clearTimeout(this.timeoutId);
    }
    this.queue = [];
  }
}
