(function (global) {
  const app = (global.EpicrisisApp = global.EpicrisisApp || {});

  function mergeSoatResults(existing, incoming) {
    const merged = [];
    const seen = new Set();
    [...(Array.isArray(existing) ? existing : []), ...(Array.isArray(incoming) ? incoming : [])].forEach((item) => {
      if (!item || typeof item !== "object") return;
      const key = [
        String(item.codigo_soat || "").trim().toLowerCase(),
        String(item.descripcion || "").trim().toLowerCase(),
      ].join("|");
      if (seen.has(key)) return;
      seen.add(key);
      merged.push(item);
    });
    return merged;
  }

  function obtenerResultadosSoatCombinados() {
    const data = app.state.data;
    const base = Array.isArray(data.autoSoatResults) && data.autoSoatResults.length > 0
      ? data.autoSoatResults
      : (Array.isArray(data.codigosDesdeSoat) ? data.codigosDesdeSoat : []);
    return mergeSoatResults(
      mergeSoatResults(base, Array.isArray(app.state.qxAgentResults) ? app.state.qxAgentResults : []),
      Array.isArray(app.state.manualSoatResults) ? app.state.manualSoatResults : []
    );
  }

  function agregarCodigo() {
    const container = document.getElementById("codigos_container");
    if (!container) return;
    const nuevoGrupo = document.createElement("div");
    nuevoGrupo.className = "codigo-input-group";

    nuevoGrupo.innerHTML = `
      <input type="text" name="codigo_soat" placeholder="Código SOAT (ej: 90201)">
      <input type="text" name="descripcion" placeholder="Descripción del procedimiento">
      <button type="button" onclick="eliminarCodigo(this)" class="btn codigo-input-remove">✕</button>
    `;

    container.appendChild(nuevoGrupo);
  }

  function eliminarCodigo(button) {
    const grupo = button.parentElement;
    const container = document.getElementById("codigos_container");
    if (!grupo || !container) return;

    if (container.children.length > 1) {
      grupo.remove();
    } else {
      AppToast.show("Debe mantener al menos un código SOAT.", {
        type: "error",
        duration: 4200,
      });
    }
  }

  async function onSubmitGenerarCodigos(event) {
    event.preventDefault();

    const grupos = document.querySelectorAll(".codigo-input-group");
    const descripciones = [];

    grupos.forEach((grupo) => {
      const codigoInput = grupo.querySelector('input[name="codigo_soat"]');
      const descripcionInput = grupo.querySelector('input[name="descripcion"]');

      if (descripcionInput?.value.trim()) {
        descripciones.push({
          codigo_soat: codigoInput?.value.trim() || "",
          descripcion: descripcionInput.value.trim(),
        });
      }
    });

    if (descripciones.length === 0) {
      AppToast.show("Por favor ingresa al menos una descripción.", {
        type: "error",
        duration: 4200,
      });
      return;
    }

    const submitButton = event.target.querySelector('button[type="submit"]');
    const originalText = submitButton.textContent;
    submitButton.textContent = "⏳ Generando...";
    submitButton.disabled = true;
    app.state.toastProcessIds.soat = AppToast.start("Iniciando generación de códigos SOAT...", {
      description: "Procesando descripciones con IA.",
      actionLabel: "Ver historial",
      onAction: app.toast.actions.verHistorial,
    });

    try {
      AppToast.progress(app.state.toastProcessIds.soat, "Generando sugerencias CIE-10/CUPS...", {
        description: "El proceso puede tardar unos segundos.",
      });
      const response = await fetch("/soat/generar_codigos_gemini", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({ descripciones }),
      });

      if (!response.ok) {
        throw new Error(`Error ${response.status}: ${response.statusText}`);
      }

      const data = await response.json();
      mostrarResultados(data.resultados);
      try {
        await app.draft.persistirDraftEpicrisis({
          manual_soat_results: app.state.manualSoatResults,
        });
      } catch (draftError) {
        console.error("Error persistiendo resultados SOAT manuales:", draftError);
      }
      AppToast.success(app.state.toastProcessIds.soat, "Codificación SOAT completada.", {
        description: `${Array.isArray(data.resultados) ? data.resultados.length : 0} resultado(s) generado(s).`,
        actionLabel: "Imprimir",
        onAction: app.toast.actions.reintentarPdf,
      });
    } catch (error) {
      console.error("Error:", error);
      AppToast.error(app.state.toastProcessIds.soat, "Error al generar códigos: " + error.message, {
        actionLabel: "Reintentar",
        onAction: () => event.target.requestSubmit(),
      });
    } finally {
      submitButton.textContent = originalText;
      submitButton.disabled = false;
    }
  }

  function mostrarResultados(resultadosInput) {
    const resultados = Array.isArray(resultadosInput) ? resultadosInput : [];
    app.state.manualSoatResults = mergeSoatResults(app.state.manualSoatResults, resultados);
    app.state.syncGlobals();

    const container = document.querySelector(".container");
    const existente = document.getElementById("resultados_soat_auto");
    if (existente) {
      existente.remove();
    }

    const resultadosDiv = document.createElement("div");
    resultadosDiv.id = "resultados_soat_auto";
    resultadosDiv.className = "card";
    resultadosDiv.innerHTML = `
      <div class="section-header section-header--violet">
        🤖 Codificación Inteligente desde SOAT - Resultados
      </div>

      <div class="epicrisis-panel epicrisis-panel--info">
        <p class="epicrisis-callout">
          <strong>ℹ️ Información:</strong> Estos códigos CIE-10 y CUPS han sido generados automáticamente por IA a partir de las descripciones SOAT ingresadas. Se recomienda validar con criterio clínico.
        </p>
      </div>

      <div id="resultados_container" class="soat-results-list"></div>

      <div class="soat-summary">
        <h5 class="soat-summary__title">
          <span class="soat-summary__icon">📈</span> Resumen de Codificación
        </h5>
        <div class="soat-summary__grid">
          <div class="soat-summary__card">
            <div class="soat-summary__value">${app.state.manualSoatResults.length}</div>
            <div class="soat-summary__label">Códigos SOAT Procesados</div>
          </div>
          <div class="soat-summary__card soat-summary__card--cie10">
            <div class="soat-summary__value" id="total_cie10">0</div>
            <div class="soat-summary__label">Códigos CIE-10 Generados</div>
          </div>
          <div class="soat-summary__card soat-summary__card--cups">
            <div class="soat-summary__value" id="total_cups">0</div>
            <div class="soat-summary__label">Códigos CUPS Generados</div>
          </div>
        </div>
      </div>
    `;

    const formCard = document.getElementById("form_codigos_soat");
    if (formCard?.parentNode) {
      formCard.parentNode.insertBefore(resultadosDiv, formCard.nextSibling);
    } else {
      container?.appendChild(resultadosDiv);
    }

    const resultadosContainer = document.getElementById("resultados_container");
    let totalCie10 = 0;
    let totalCups = 0;

    app.state.manualSoatResults.forEach((item) => {
      const itemDiv = document.createElement("div");
      itemDiv.className = "soat-result-card";

      let contenido = `
        <div class="soat-result-card__header">
          <h4 class="soat-result-card__heading">
            ${item.codigo_soat ? `📋 Código SOAT: <span class="soat-result-card__code">${item.codigo_soat}</span>` : "📋 Descripción SOAT"}
          </h4>
          <p class="soat-result-card__description">${item.descripcion}</p>
        </div>
      `;

      if (item.cie10_principal) {
        totalCie10 += 1;
        contenido += `
          <div class="soat-block">
            <h5 class="soat-block__title">
              <span class="soat-block__icon soat-block__icon--lg">🏥</span> CIE-10 PRINCIPAL
            </h5>
            <div class="soat-entry">
              <div class="soat-entry__row">
                <span class="soat-token">
                  ${item.cie10_principal.codigo}
                </span>
                <span class="soat-entry__description">${item.cie10_principal.descripcion}</span>
              </div>
              <p class="soat-justification">
                <strong>Justificación:</strong> ${item.cie10_principal.justificacion}
              </p>
            </div>
          </div>
        `;
      }

      if (item.cie10_secundarios && item.cie10_secundarios.length > 0) {
        totalCie10 += item.cie10_secundarios.length;
        contenido += `
          <div class="soat-block soat-block--cie10-secondary">
            <h5 class="soat-block__title">
              <span class="soat-block__icon">📋</span> CIE-10 SECUNDARIOS (${item.cie10_secundarios.length})
            </h5>
        `;

        item.cie10_secundarios.forEach((cie10) => {
          contenido += `
            <div class="soat-entry soat-entry--secondary">
              <div class="soat-entry__row soat-entry__row--compact">
                <span class="soat-token soat-token--secondary">
                  ${cie10.codigo}
                </span>
                <span class="soat-entry__description soat-entry__description--secondary">${cie10.descripcion}</span>
              </div>
              <p class="soat-justification soat-justification--secondary">
                <em>${cie10.justificacion}</em>
              </p>
            </div>
          `;
        });

        contenido += "</div>";
      }

      if (item.cups_principal) {
        totalCups += 1;
        contenido += `
          <div class="soat-block soat-block--cups-primary">
            <h5 class="soat-block__title">
              <span class="soat-block__icon soat-block__icon--lg">🔧</span> CUPS PRINCIPAL
            </h5>
            <div class="soat-entry soat-entry--cups">
              <div class="soat-entry__row">
                <span class="soat-token soat-token--cups">
                  ${item.cups_principal.codigo}
                </span>
                <span class="soat-entry__description soat-entry__description--cups">${item.cups_principal.descripcion}</span>
              </div>
              <p class="soat-justification soat-justification--cups">
                <strong>Justificación:</strong> ${item.cups_principal.justificacion}
              </p>
            </div>
          </div>
        `;
      }

      if (item.cups_alternativos && item.cups_alternativos.length > 0) {
        totalCups += item.cups_alternativos.length;
        contenido += `
          <div class="soat-block soat-block--cups-secondary">
            <h5 class="soat-block__title">
              <span class="soat-block__icon">⚙️</span> CUPS ALTERNATIVOS (${item.cups_alternativos.length})
            </h5>
        `;

        item.cups_alternativos.forEach((cups) => {
          contenido += `
            <div class="soat-entry soat-entry--cups-alt">
              <div class="soat-entry__row soat-entry__row--compact">
                <span class="soat-token soat-token--cups-alt">
                  ${cups.codigo}
                </span>
                <span class="soat-entry__description soat-entry__description--cups-alt">${cups.descripcion}</span>
              </div>
              <p class="soat-justification soat-justification--secondary">
                <em>${cups.justificacion}</em>
              </p>
            </div>
          `;
        });

        contenido += "</div>";
      }

      if (item.analisis_clinico) {
        contenido += `
          <div class="soat-block soat-block--analysis">
            <h5 class="soat-block__title">
              <span class="soat-block__icon">📊</span> ANÁLISIS CLÍNICO DETALLADO
            </h5>
            <div class="soat-entry soat-entry--analysis">
              <pre class="soat-analysis-pre">${item.analisis_clinico}</pre>
            </div>
          </div>
        `;
      }

      itemDiv.innerHTML = contenido;
      resultadosContainer.appendChild(itemDiv);
    });

    document.getElementById("total_cie10").textContent = totalCie10;
    document.getElementById("total_cups").textContent = totalCups;
    app.selection.inicializarSeleccionPDF();
  }

  function initForm() {
    const formGenerarCodigos = document.getElementById("form_generar_codigos");
    if (formGenerarCodigos) {
      formGenerarCodigos.addEventListener("submit", onSubmitGenerarCodigos);
    }
  }

  app.soat = {
    mergeSoatResults,
    obtenerResultadosSoatCombinados,
    agregarCodigo,
    eliminarCodigo,
    mostrarResultados,
    initForm,
  };

  global.agregarCodigo = agregarCodigo;
  global.eliminarCodigo = eliminarCodigo;
})(globalThis);
