// Auto-scroll inteligente. Rola o scrollable container (window por padrão) em
// pulsos espaçados, observando mudanças de altura. Para sozinho quando:
//   - altura não cresce por N tentativas seguidas (chegou no fim)
//   - usuário interage (mouse wheel ou tecla)
//   - foi cancelado externamente (STATE.cancel())
//
// Uso:
//   const ctrl = startAutoScroll({ onTick, onStop });
//   ctrl.stop();

(function () {
  if (window.__IS_AUTOSCROLL__) return;

  function startAutoScroll({ onTick, onStop, maxIdle = 6, pulsePx = 1200, pulseDelayMs = 1100 } = {}) {
    let cancelled = false;
    let lastHeight = 0;
    let idleCount = 0;

    function tick() {
      if (cancelled) return;
      const beforeY = window.scrollY;
      const beforeH = document.documentElement.scrollHeight;
      window.scrollBy({ top: pulsePx, behavior: 'smooth' });

      setTimeout(() => {
        if (cancelled) return;
        const afterY = window.scrollY;
        const afterH = document.documentElement.scrollHeight;

        // Detecta interação do user (se ele scrollou pra outro lugar, para)
        if (Math.abs(afterY - (beforeY + pulsePx)) > pulsePx * 1.5 && afterY < beforeY) {
          return stop('user-scrolled-up');
        }

        // Cresceu? reseta contador. Não cresceu? incrementa idle.
        if (afterH > lastHeight) {
          lastHeight = afterH;
          idleCount = 0;
        } else {
          idleCount++;
          if (idleCount >= maxIdle) {
            return stop('end-of-feed');
          }
        }
        if (typeof onTick === 'function') onTick({ y: afterY, h: afterH, idle: idleCount });
        setTimeout(tick, pulseDelayMs);
      }, 250);
    }

    function stop(reason) {
      if (cancelled) return;
      cancelled = true;
      if (typeof onStop === 'function') onStop(reason || 'manual');
    }

    // Listener pra cancelar se usuário usar a roda do mouse pra rolar pra cima
    const onWheel = (e) => { if (e.deltaY < -50) stop('user-wheel'); };
    window.addEventListener('wheel', onWheel, { passive: true });
    setTimeout(() => window.removeEventListener('wheel', onWheel), 1000 * 60 * 10);

    setTimeout(tick, 200);

    return {
      stop: () => stop('manual'),
      get cancelled() { return cancelled; }
    };
  }

  window.__IS_AUTOSCROLL__ = { startAutoScroll };
})();
