import { Controller } from "@hotwired/stimulus"

// Seleção em massa da lista de consolidações (?visao=lista): marca várias e
// arquiva de uma vez.
//
// POR QUE ELE É TÃO PEQUENO: o formulário é HTML de verdade — os checkboxes
// carregam `name="ids[]"` e `form="form-arquivar-lote"`, e o botão é um submit
// comum. Este controller só cuida do CONFORTO (marcar todas, contar, desabilitar
// quando não há nada marcado). Se o JS não carregar — e já carregou 404 em
// produção, ver README de 28/08/2026 — marcar na mão e enviar continua
// funcionando, e o botão continua habilitado porque quem desabilita é ele.
//
// "Selecionar todas" marca TODAS as da lista filtrada, inclusive as que o
// carrossel escondeu na página seguinte: o carrossel só põe a classe `hidden`,
// os campos continuam no DOM e são enviados. É o que se espera de "em lote" —
// e o contador diz o número, então não há surpresa no envio.
export default class extends Controller {
  static targets = ["todos", "item", "contador", "botao"]

  connect() {
    this.atualizar()
  }

  alternarTodos() {
    this.itemTargets.forEach((c) => { c.checked = this.todosTarget.checked })
    this.atualizar()
  }

  atualizar() {
    const marcados = this.itemTargets.filter((c) => c.checked).length
    const total    = this.itemTargets.length

    if (this.hasTodosTarget) {
      this.todosTarget.checked = total > 0 && marcados === total
      // Estado "algumas": o quadradinho vira traço em vez de mentir que está
      // tudo (ou nada) marcado.
      this.todosTarget.indeterminate = marcados > 0 && marcados < total
    }

    if (this.hasContadorTarget) {
      this.contadorTarget.textContent =
        marcados === 0 ? "Marque as que quer arquivar"
                       : `${marcados} de ${total} selecionada${marcados > 1 ? "s" : ""}`
      this.contadorTarget.classList.toggle("text-gray-500", marcados === 0)
      this.contadorTarget.classList.toggle("text-white", marcados > 0)
    }

    if (this.hasBotaoTarget) this.botaoTarget.disabled = marcados === 0
  }
}
