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

  function construirListasAgrupadas() {
    const data = app.state.data;
    const diagnosticosPrimariosDisponibles = Array.isArray(data.pdfPrimaryDiagnosticos);
    const procedimientosPrimariosDisponibles = Array.isArray(data.pdfPrimaryProcedimientos);
    const medicamentosPrimariosDisponibles = Array.isArray(data.pdfPrimaryMedicamentos);
    const ayudasPrimariasDisponibles = Array.isArray(data.pdfPrimaryAyudasDiagnosticas);
    const diagnosticosCanonicos = app.diagnosticos.normalizarDiagnosticosConsolidados(
      diagnosticosPrimariosDisponibles ? data.pdfPrimaryDiagnosticos : data.diagnosticosConsolidados
    );
    const diagnosticos = [];
    const procedimientos = [];
    const medicamentos = [];
    const ayudasDiagnosticas = [];
    const imagenesDiagnosticas = [];

    if (diagnosticosCanonicos.length > 0) {
      diagnosticos.push(...diagnosticosCanonicos);
    } else {
      const cieHistoria = app.diagnosticos.normalizarDiagnosticos(data.cieHistoria);
      const cieQx = app.diagnosticos.normalizarDiagnosticos(data.cieQx);
      [...cieHistoria, ...cieQx].forEach((item) => {
        diagnosticos.push(app.diagnosticos.formatearDiagnosticoPresentacion(item));
      });
    }

    if (procedimientosPrimariosDisponibles) {
      (data.pdfPrimaryProcedimientos || []).forEach((item) => procedimientos.push(String(item || "").trim()));
    } else {
      (data.procedimientosHC || []).forEach((item) => procedimientos.push(String(item || "").trim()));
      (data.cups || []).forEach((item) => {
        const codigo = String(item?.codigo_cups || "").trim();
        const proc = String(item?.procedimiento || "").trim();
        procedimientos.push(codigo ? `${codigo} - ${proc}` : proc);
      });
    }

    if (medicamentosPrimariosDisponibles) {
      app.medicamentos.normalizarMedicamentos(data.pdfPrimaryMedicamentos, "historia_clinica").forEach((item) => {
        medicamentos.push(item);
      });
    } else {
      app.medicamentos.normalizarMedicamentos(data.medicamentos, "historia_clinica").forEach((item) => {
        medicamentos.push(item);
      });
    }

    const facturaJson = data.facturaJson || {};
    const servicios = facturaJson.servicios_procedimientos || {};
    if (!procedimientosPrimariosDisponibles) {
      (servicios.procedimientos_quirurgicos || []).forEach((item) => {
        const codigo = String(item?.codigo_cups || "").trim();
        const descripcion = String(item?.descripcion || item?.concepto || "").trim();
        procedimientos.push(codigo ? `${codigo} - ${descripcion}` : descripcion);
      });
    }
    if (!medicamentosPrimariosDisponibles) {
      app.medicamentos.normalizarMedicamentos(servicios.medicamentos || [], "factura").forEach((item) => {
        medicamentos.push(item);
      });
    }

    (ayudasPrimariasDisponibles ? data.pdfPrimaryAyudasDiagnosticas : data.ayudasDiagnosticas || []).forEach((item) => {
      const ayuda = app.ayudasDiagnosticas.normalizarAyudaDiagnostica(item);
      if (ayuda?.nombre) ayudasDiagnosticas.push(ayuda);
    });
    const tieneAyudasEstructuradas = ayudasDiagnosticas.length > 0;
    (data.imagenesDiagnosticas || []).forEach((item) => {
      const texto = String(item || "").trim();
      imagenesDiagnosticas.push(texto);
      if (!ayudasPrimariasDisponibles && !tieneAyudasEstructuradas && texto) {
        ayudasDiagnosticas.push(app.ayudasDiagnosticas.normalizarAyudaDiagnostica(texto));
      }
    });

    if (!diagnosticosPrimariosDisponibles || !procedimientosPrimariosDisponibles) {
      app.soat.obtenerResultadosSoatCombinados().forEach((item) => {
        if (!diagnosticosPrimariosDisponibles && !diagnosticosCanonicos.length) {
          if (item?.cie10_principal) {
            diagnosticos.push(`${item.cie10_principal.codigo || ""} - ${item.cie10_principal.descripcion || ""}`);
          }
          (item?.cie10_secundarios || []).forEach((cie) => {
            diagnosticos.push(`${cie.codigo || ""} - ${cie.descripcion || ""}`);
          });
        }
        if (!procedimientosPrimariosDisponibles && item?.cups_principal) {
          procedimientos.push(`${item.cups_principal.codigo || ""} - ${item.cups_principal.descripcion || ""}`);
        }
        if (!procedimientosPrimariosDisponibles) {
          (item?.cups_alternativos || []).forEach((cups) => {
            procedimientos.push(`${cups.codigo || ""} - ${cups.descripcion || ""}`);
          });
        }
      });
    }

    return {
      diagnosticos: diagnosticosCanonicos.length > 0 ? diagnosticos : app.utils.deduplicarTextos(diagnosticos),
      procedimientos: app.utils.deduplicarTextos(procedimientos),
      medicamentos: app.medicamentos.deduplicarMedicamentos(medicamentos),
      ayudas_diagnosticas: app.ayudasDiagnosticas.deduplicarAyudasDiagnosticas(ayudasDiagnosticas),
      imagenes_diagnosticas: app.utils.deduplicarTextos(imagenesDiagnosticas),
    };
  }

  function renderSeccionSeleccion(seccion, items) {
    const list = document.getElementById(`${seccion}_list`);
    if (!list) return;
    app.state.pdfSelectionData[seccion] = Array.isArray(items) ? items : [];
    app.state.syncGlobals();

    const draft = app.state.data.pdfDraft || {};
    const excludedTextMap = {
      diagnosticos: new Set(Array.isArray(draft.excluded_diagnosticos) ? draft.excluded_diagnosticos : []),
      procedimientos: new Set(Array.isArray(draft.excluded_procedimientos) ? draft.excluded_procedimientos : []),
      medicamentos: new Set(Array.isArray(draft.excluded_medicamentos) ? draft.excluded_medicamentos : []),
      ayudas_diagnosticas: new Set(Array.isArray(draft.excluded_imagenes_diagnosticas) ? draft.excluded_imagenes_diagnosticas : []),
      imagenes_diagnosticas: new Set(Array.isArray(draft.excluded_imagenes_diagnosticas) ? draft.excluded_imagenes_diagnosticas : []),
    };
    const excludedMap = {
      diagnosticos: new Set(Array.isArray(draft.excluded_diagnostico_keys) ? draft.excluded_diagnostico_keys : []),
      procedimientos: new Set(Array.isArray(draft.excluded_procedimientos) ? draft.excluded_procedimientos : []),
      medicamentos: new Set(Array.isArray(draft.excluded_medicamentos) ? draft.excluded_medicamentos : []),
      ayudas_diagnosticas: new Set(Array.isArray(draft.excluded_ayudas_diagnosticas_keys) ? draft.excluded_ayudas_diagnosticas_keys : []),
      imagenes_diagnosticas: new Set(Array.isArray(draft.excluded_imagenes_diagnosticas) ? draft.excluded_imagenes_diagnosticas : []),
    };
    list.innerHTML = "";
    const aidFilter = document.getElementById("ayudas_diagnosticas_filter");
    const selectedAidType = String(aidFilter?.value || "todos");

    items.forEach((item, index) => {
      const id = `${seccion}_item_${index}`;
      const row = document.createElement("label");
      row.className = "selection-item";
      const ayuda = seccion === "ayudas_diagnosticas" ? app.ayudasDiagnosticas.normalizarAyudaDiagnostica(item) : null;
      let texto = String(item || "").trim();
      if (seccion === "medicamentos") {
        texto = app.medicamentos.formatearMedicamentoPresentacion(item);
      } else if (seccion === "diagnosticos") {
        texto = String(item?.texto_presentacion || item || "").trim();
      } else if (seccion === "ayudas_diagnosticas") {
        texto = String(ayuda?.nombre || "").trim();
      }

      let exclusionKey = texto;
      if (seccion === "diagnosticos") {
        exclusionKey = String(item?.key || "").trim();
      } else if (seccion === "ayudas_diagnosticas") {
        exclusionKey = String(ayuda?.key || "").trim();
      }

      let isChecked = !excludedMap[seccion].has(texto);
      if (seccion === "diagnosticos") {
        isChecked = !(excludedMap[seccion].has(exclusionKey) || excludedTextMap[seccion].has(texto));
      } else if (seccion === "ayudas_diagnosticas") {
        const ayudaDisplayText = `${texto}${ayuda?.concepto ? ` - ${ayuda.concepto}` : ""}`;
        isChecked = Boolean(
          ayuda?.exportable !== false
          && !excludedMap[seccion].has(exclusionKey)
          && !excludedTextMap[seccion].has(ayudaDisplayText)
        );
      }

      if (seccion === "ayudas_diagnosticas" && ayuda) {
        row.dataset.aidType = ayuda.tipo;
        row.hidden = !(selectedAidType === "todos" || ayuda.tipo === selectedAidType);
        row.innerHTML = `
          <input type="checkbox" id="${id}" ${isChecked ? "checked" : ""} data-index="${index}">
          <span class="selection-item-content">
            <span>${app.utils.escapeHtml(texto)}</span>
            ${ayuda.concepto ? `<small>${app.utils.escapeHtml(ayuda.concepto)}</small>` : ""}
            <span class="aid-badges">${app.ayudasDiagnosticas.renderBadgesAyuda(ayuda)}</span>
          </span>
        `;
      } else {
        row.innerHTML = `
          <input type="checkbox" id="${id}" ${isChecked ? "checked" : ""} data-index="${index}">
          <span>${app.utils.escapeHtml(texto)}</span>
        `;
      }
      list.appendChild(row);
    });
  }

  function hidratarDraftPdfInicial() {
    const draft = app.state.data.pdfDraft || {};
    const fieldMap = {
      diagnosticos_extra: Array.isArray(draft.manual_diagnosticos) ? draft.manual_diagnosticos.join("\n") : "",
      procedimientos_extra: Array.isArray(draft.manual_procedimientos) ? draft.manual_procedimientos.join("\n") : "",
      medicamentos_extra: Array.isArray(draft.manual_medicamentos) ? draft.manual_medicamentos.join("\n") : "",
      ayudas_diagnosticas_extra: Array.isArray(draft.manual_ayudas_diagnosticas)
        ? draft.manual_ayudas_diagnosticas.map((item) => {
          const ayuda = app.ayudasDiagnosticas.normalizarAyudaDiagnostica(item);
          if (!ayuda) return "";
          return `${ayuda.tipo} | ${ayuda.nombre}${ayuda.concepto ? ` | ${ayuda.concepto}` : ""}`;
        }).filter(Boolean).join("\n")
        : (Array.isArray(draft.manual_imagenes_diagnosticas) ? draft.manual_imagenes_diagnosticas.join("\n") : ""),
      hallazgos_extra: String(draft.hallazgos_extra || ""),
      descripcion_procedimiento_extra: String(draft.descripcion_procedimiento_extra || ""),
    };
    Object.entries(fieldMap).forEach(([id, value]) => {
      const el = document.getElementById(id);
      if (el) {
        el.value = value;
      }
    });
  }

  function inicializarSeleccionPDF() {
    const agrupadas = construirListasAgrupadas();
    renderSeccionSeleccion("diagnosticos", agrupadas.diagnosticos);
    renderSeccionSeleccion("procedimientos", agrupadas.procedimientos);
    renderSeccionSeleccion("medicamentos", agrupadas.medicamentos);
    renderSeccionSeleccion("ayudas_diagnosticas", agrupadas.ayudas_diagnosticas);
  }

  function obtenerElementosSeleccionados(seccion) {
    const list = document.getElementById(`${seccion}_list`);
    const extra = document.getElementById(`${seccion}_extra`);
    const fuente = app.state.pdfSelectionData[seccion] || [];
    const checked = list
      ? Array.from(list.querySelectorAll("input[type='checkbox']:checked"))
        .map((cb) => fuente[Number(cb.dataset.index)])
        .filter((item) => item !== undefined)
      : [];
    const extras = extra
      ? String(extra.value || "")
        .split(/\r?\n/)
        .map((line) => line.trim())
        .filter(Boolean)
      : [];
    if (seccion === "medicamentos") {
      const extrasNormalizados = extras.map((line) => app.medicamentos.normalizarMedicamentoCanonico(line, "manual"));
      return app.medicamentos.deduplicarMedicamentos([...checked, ...extrasNormalizados]);
    }
    if (seccion === "diagnosticos") {
      const checkedText = checked
        .map((item) => item && typeof item === "object"
          ? String(item.texto_presentacion || "").trim()
          : String(item || "").trim())
        .filter(Boolean);
      return app.utils.deduplicarTextos([...checkedText, ...extras]);
    }
    if (seccion === "ayudas_diagnosticas") {
      const manuales = extras
        .map((line) => app.ayudasDiagnosticas.normalizarAyudaDiagnostica(app.ayudasDiagnosticas.parseAyudaManual(line)))
        .filter(Boolean);
      return app.ayudasDiagnosticas.deduplicarAyudasDiagnosticas([
        ...checked.map((item) => app.ayudasDiagnosticas.normalizarAyudaDiagnostica(item)).filter(Boolean),
        ...manuales,
      ]).filter((item) => item.exportable !== false && !item.glosado);
    }
    return app.utils.deduplicarTextos([...checked, ...extras]);
  }

  function obtenerTextoAmpliacion(idCampo) {
    const el = document.getElementById(idCampo);
    return String(el?.value || "").trim();
  }

  function combinarTextoConAmpliacion(base, ampliacion) {
    const textoBase = app.utils.stripHtml(base || "").trim();
    const textoExtra = app.utils.stripHtml(ampliacion || "").trim();
    if (textoBase && textoExtra) {
      return `${textoBase}\n\nAmpliacion medica:\n${textoExtra}`;
    }
    if (textoExtra) return textoExtra;
    if (textoBase) return textoBase;
    return "No especificado";
  }

  function obtenerEpicrisisBaseIdDesdeUrl() {
    const params = new URLSearchParams(globalThis.location.search);
    return params.get("id");
  }

  function obtenerEpicrisisCaseKeyDesdeUrl() {
    if (app.state.data.caseKey) return String(app.state.data.caseKey);
    const params = new URLSearchParams(globalThis.location.search);
    const queryValue = params.get("case_key");
    if (queryValue) return queryValue;
    const match = new RegExp(/^\/epicrisis\/caso\/([^/?#]+)/).exec(globalThis.location.pathname);
    return match ? decodeURIComponent(match[1]) : "";
  }

  app.selection = {
    construirListasAgrupadas,
    renderSeccionSeleccion,
    hidratarDraftPdfInicial,
    inicializarSeleccionPDF,
    obtenerElementosSeleccionados,
    obtenerTextoAmpliacion,
    combinarTextoConAmpliacion,
    obtenerEpicrisisBaseIdDesdeUrl,
    obtenerEpicrisisCaseKeyDesdeUrl,
  };
})(globalThis);
