// ui/auto.js — versão final, estável e totalmente funcional

const AutoPlayer = {
  running: false,
  interval: 2000,
  timer: null,

  // callbacks conectados pelo controller
  onRequestSpeakSequence: null,
  onGetVisibleCards: null,
  onToast: null,
  onUpdateStats: null,
  onNextCard: null,

  setInterval(ms){
    this.interval = ms;
  },

  start(){
    if (this.running) return;
    this.running = true;
    this.loop();  // início do ciclo
  },

  stop(){
    this.running = false;
    if (this.timer){
      clearTimeout(this.timer);
      this.timer = null;
    }
  },

  async loop(){
    if (!this.running) return;

    const list = this.onGetVisibleCards ? this.onGetVisibleCards() : [];

    // sem cards → parar
    if (!list.length){
      this.onToast?.("Sem cards visíveis.", 1200);
      this.stop();
      return;
    }

    // -------------------------------------
    // 1) ACHAR PRÓXIMO CARD NÃO CONCLUÍDO
    // -------------------------------------
    let currentIndex = list.findIndex(c =>
      c.classList.contains("autoplay-current")
    );

    let next = null;
    let tries = 0;

    do {
      // primeiro loop ou segue para o próximo
      if (currentIndex === -1){
        currentIndex = 0;
      } else {
        currentIndex = (currentIndex + 1) % list.length;
      }

      const candidate = list[currentIndex];

      const done =
        candidate.classList.contains("hit") ||
        candidate.classList.contains("blue") ||
        candidate.classList.contains("spoken") ||
        candidate.classList.contains("ignored");

      if (!done){
        next = candidate;
        break;
      }

      tries++;

    } while (tries < list.length);

    // se todos concluídos → pegar o primeiro mesmo assim
    if (!next) next = list[0];

    // -------------------------------------
    // 2) FALAR CARD (espera a fala terminar)
    // -------------------------------------
    if (this.onRequestSpeakSequence){
      await this.onRequestSpeakSequence(next);
    }

    // -------------------------------------
    // 3) ATUALIZAR VISUAL
    // -------------------------------------
    if (this.onNextCard){
      this.onNextCard(next);  // marca autoplay-current
    }

    this.onUpdateStats?.();

    // -------------------------------------
    // 4) CONTINUAR CICLO
    // -------------------------------------
    this.timer = setTimeout(() => this.loop(), this.interval);
  }
};

window.AutoPlayer = AutoPlayer;
