// app/javascript/controllers/apontamento_termo_controller.js
// Stimulus — Entrega de termo. Lança lotes de termos (normal e/ou especial) para
// o motorista da tela. Entrega sem NF nem código de rastreio: só as quantidades
// (um stepper − N + por tipo), cada tipo a um preço fixo configurável.

import { Controller } from "@hotwired/stimulus"

export default class extends Controller {
  static targets = ["modal", "quantidade", "quantidadeEspecial", "erro", "veiculo"]
  static values  = { apontarTermoUrl: String, motorista: String }

  abrir() {
    this.erroTarget.classList.add("hidden")
    this.quantidadeTarget.value = "1"
    this.quantidadeEspecialTarget.value = "0"
    this.modalTarget.classList.remove("hidden")
  }

  fechar() {
    this.modalTarget.classList.add("hidden")
  }

  // Fecha ao clicar no fundo (fora do card)
  fundo(event) {
    if (event.target === this.modalTarget) this.fechar()
  }

  // Steppers (mínimo 0 em ambos; o envio exige ao menos 1 no total)
  mais() {
    this.quantidadeTarget.value = String(this.qtdAtual(this.quantidadeTarget) + 1)
  }

  menos() {
    this.quantidadeTarget.value = String(Math.max(0, this.qtdAtual(this.quantidadeTarget) - 1))
  }

  maisEspecial() {
    this.quantidadeEspecialTarget.value = String(this.qtdAtual(this.quantidadeEspecialTarget) + 1)
  }

  menosEspecial() {
    this.quantidadeEspecialTarget.value = String(Math.max(0, this.qtdAtual(this.quantidadeEspecialTarget) - 1))
  }

  qtdAtual(alvo) {
    const n = parseInt(alvo.value, 10)
    return Number.isFinite(n) && n > 0 ? n : 0
  }

  async adicionar(event) {
    event?.preventDefault()

    const quantidade         = this.qtdAtual(this.quantidadeTarget)
    const quantidadeEspecial = this.qtdAtual(this.quantidadeEspecialTarget)
    const motorista          = this.motoristaValue.trim()
    if (!motorista) { this.mostrarErro("Motorista não identificado."); return }
    if (quantidade + quantidadeEspecial < 1) {
      this.mostrarErro("Informe ao menos um termo (normal ou especial).")
      return
    }

    const btn = event.currentTarget
    btn.disabled = true
    try {
      const resp = await fetch(this.apontarTermoUrlValue, {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
          "Accept":       "application/json",
          "X-CSRF-Token": document.querySelector('meta[name="csrf-token"]').content
        },
        body: JSON.stringify({
          motorista:           motorista,
          quantidade:          quantidade,
          quantidade_especial: quantidadeEspecial,
          vehicle:             this.hasVeiculoTarget ? this.veiculoTarget.value : ""
        })
      })
      const data = await resp.json()
      if (!resp.ok || data.ok === false) {
        this.mostrarErro(data.erro || "Não foi possível adicionar as entregas de termo.")
        return
      }
      // Recarrega para refletir o valor atualizado do motorista.
      window.location.reload()
    } catch (e) {
      this.mostrarErro("Erro ao adicionar as entregas de termo. Tente novamente.")
    } finally {
      btn.disabled = false
    }
  }

  mostrarErro(msg) {
    this.erroTarget.textContent = msg
    this.erroTarget.classList.remove("hidden")
  }
}
