(function initCurationReview(global) {
  "use strict";

  const ledger = document.querySelector("[data-curation-ledger]");
  if (!ledger) return;

  const feedback = ledger.querySelector("[data-curation-feedback]");
  let version = ledger.dataset.curationVersion || global.EPICRISIS_PDF_DATA?.curationVersion || "";

  function setFeedback(message, isError = false) {
    if (!feedback) return;
    feedback.textContent = message;
    feedback.classList.toggle("is-error", isError);
  }

  function setBusy(container, busy) {
    container.querySelectorAll("button, input").forEach((element) => {
      element.disabled = busy;
    });
  }

  async function submitDecision(container, action) {
    const caseKey = String(global.EPICRISIS_PDF_DATA?.caseKey || "").trim();
    const itemId = String(container.dataset.curationItem || "").trim();
    if (!caseKey || !itemId || !version) {
      setFeedback("No se encontró la versión trazable del caso.", true);
      return;
    }

    const code = container.querySelector("[data-curation-code]")?.value.trim() || "";
    const description =
      container.querySelector("[data-curation-description]")?.value.trim() || "";
    if (action === "correct" && (!code || !description)) {
      setFeedback("Para corregir debes indicar código y descripción.", true);
      return;
    }
    if (action === "reject" && !global.confirm("¿Confirmas el rechazo de este candidato?")) {
      return;
    }

    setBusy(container, true);
    setFeedback("Guardando decisión…");
    try {
      const response = await fetch(
        `/api/epicrisis/cases/${encodeURIComponent(caseKey)}/curation/items/${encodeURIComponent(itemId)}`,
        {
          method: "PATCH",
          headers: { "Content-Type": "application/json" },
          body: JSON.stringify({
            decision: action,
            expected_version: version,
            corrected_code: action === "correct" ? code : "",
            corrected_description: action === "correct" ? description : "",
          }),
        },
      );
      const result = await response.json().catch(() => ({}));
      if (!response.ok) {
        if (response.status === 409) {
          setFeedback("El caso cambió en otra sesión. Recargando la versión vigente…", true);
          global.setTimeout(() => global.location.reload(), 900);
          return;
        }
        throw new Error(result.detail || `No fue posible guardar la decisión (${response.status}).`);
      }
      version = result.curation?.version || result.version || result.curation_version || version;
      setFeedback("Decisión registrada. Actualizando el libro de conciliación…");
      global.setTimeout(() => global.location.reload(), 450);
    } catch (error) {
      setBusy(container, false);
      setFeedback(error.message || "No fue posible guardar la decisión.", true);
    }
  }

  ledger.addEventListener("click", (event) => {
    const button = event.target.closest("[data-curation-action]");
    if (!button) return;
    const container = button.closest("[data-curation-item]");
    if (!container) return;
    submitDecision(container, button.dataset.curationAction);
  });
})(window);
