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

  function obtenerDescripcionProcedimiento(item) {
    if (!item || typeof item !== "object") return String(item || "").trim();
    return String(item.descripcion || item.procedimiento || item.concepto || "").trim();
  }

  function obtenerCodigoProcedimiento(item) {
    if (!item || typeof item !== "object") return "";
    return String(item.codigo_cups || item.codigo || "").trim();
  }

  function obtenerTextoProcedimiento(item) {
    const descripcion = obtenerDescripcionProcedimiento(item);
    const codigo = obtenerCodigoProcedimiento(item);
    return codigo ? `${codigo} - ${descripcion}` : descripcion;
  }

  function obtenerClaveProcedimiento(item) {
    if (item && typeof item === "object") {
      const key = String(item.key || "").trim();
      if (key) return key.toLowerCase();
      return `${obtenerCodigoProcedimiento(item)}|${obtenerDescripcionProcedimiento(item)}`.toLowerCase();
    }
    return app.utils.stripHtml(item).replace(/\s+/g, " ").trim().toLowerCase();
  }

  function parsearProcedimientoManual(value) {
    const texto = String(value || "").trim();
    const match = /^\s*(\d{6})\s*(?:[-:]|\s)\s*(.+)$/.exec(texto);
    return {
      codigo_cups: match ? match[1] : "",
      descripcion: match ? match[2].trim() : texto,
      texto_manual: texto,
    };
  }

  function deduplicarProcedimientos(items) {
    const seen = new Map();
    const out = [];
    (items || []).forEach((item) => {
      const texto = obtenerTextoProcedimiento(item);
      if (!texto) return;
      const key = obtenerClaveProcedimiento(item);
      if (!key) return;
      const normalized = item && typeof item === "object"
        ? {
          ...item,
          descripcion: obtenerDescripcionProcedimiento(item),
          codigo_cups: obtenerCodigoProcedimiento(item),
          clasificacion: item.clasificacion || "sin_clasificar",
        }
        : texto;
      if (!seen.has(key)) {
        seen.set(key, out.length);
        out.push(normalized);
        return;
      }
      const index = seen.get(key);
      if (normalized && typeof normalized === "object" && typeof out[index] !== "object") {
        out[index] = normalized;
      }
    });
    return out;
  }

  function formatearCantidadMedicamento(value) {
    const cantidad = String(value ?? "").trim();
    if (!cantidad) return "";
    if (!/^\d+(?:[.,]\d+)?$/.test(cantidad)) return cantidad;
    const numericValue = Number(cantidad.replace(",", "."));
    return `${cantidad} ${numericValue === 1 ? "unidad" : "unidades"}`;
  }

  function obtenerClaveSeleccion(seccion, item, index = 0) {
    if (item && typeof item === "object" && String(item.key || "").trim()) {
      return String(item.key).trim();
    }
    let value = "";
    if (seccion === "procedimientos") value = obtenerTextoProcedimiento(item);
    else if (seccion === "medicamentos") value = app.medicamentos.formatearMedicamentoPresentacion(item);
    else if (seccion === "ayudas_diagnosticas") {
      value = app.ayudasDiagnosticas.normalizarAyudaDiagnostica(item)?.key || "";
    } else value = String(item?.texto_presentacion || item || "");
    const normalized = app.utils.stripHtml(value).replace(/\s+/g, " ").trim().toLocaleLowerCase("es");
    return normalized ? `${seccion}:${normalized}` : `${seccion}:${index}`;
  }

  function construirListasAgrupadas() {
    const data = app.state.data;
    const diagnosticosPrimariosDisponibles = Array.isArray(data.pdfPrimaryDiagnosticos);
    const procedimientosPreparacionDisponibles = Array.isArray(data.pdfPreparationProcedimientos);
    const procedimientosSeleccionablesDisponibles = procedimientosPreparacionDisponibles
      || Array.isArray(data.pdfSelectableProcedimientos);
    const procedimientosPrimariosDisponibles = procedimientosSeleccionablesDisponibles
      || 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));
      });
    }
    const draft = data.pdfDraft || {};
    (draft.manual_diagnostico_entries || []).forEach((entry) => {
      const value = String(entry?.value || "").trim();
      if (!value) return;
      const parts = value.split(/\s+-\s+/, 2);
      diagnosticos.push({
        key: entry.key,
        codigo: parts.length > 1 ? parts[0] : "",
        descripcion: parts.length > 1 ? parts[1] : value,
        texto_presentacion: value,
        manual: true,
      });
    });

    if (procedimientosPrimariosDisponibles) {
      const fuenteProcedimientos = procedimientosPreparacionDisponibles
        ? data.pdfPreparationProcedimientos
        : procedimientosSeleccionablesDisponibles
        ? data.pdfSelectableProcedimientos
        : data.pdfPrimaryProcedimientos;
      (fuenteProcedimientos || []).forEach((item) => procedimientos.push(item));
    } 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);
      });
    }
    (draft.manual_medicamento_entries || []).forEach((entry) => {
      if (!entry?.value) return;
      medicamentos.push({
        ...app.medicamentos.normalizarMedicamentoCanonico(entry.value, "manual"),
        ...entry,
        key: entry.key,
        manual: true,
      });
    });

    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);
    });
    (draft.manual_ayudas_diagnosticas || []).forEach((item) => {
      const ayuda = app.ayudasDiagnosticas.normalizarAyudaDiagnostica(item);
      if (ayuda?.nombre) ayudasDiagnosticas.push({ ...ayuda, manual: true });
    });
    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: deduplicarProcedimientos(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_medicamento_keys) ? draft.excluded_medicamento_keys : []),
      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 = "";
    items.forEach((item, index) => {
      const id = `${seccion}_item_${index}`;
      const row = document.createElement("div");
      row.className = `pdf-list__row pdf-list__row--${seccion}`;
      row.setAttribute("role", "row");
      row.dataset.index = String(index);
      const itemKey = obtenerClaveSeleccion(seccion, item, index);
      row.dataset.itemKey = itemKey;
      const detail = `<button type="button" class="pdf-row-detail" data-detail-section="${seccion}" data-index="${index}" aria-label="Ver detalle">Ver</button>`;
      let text = String(item || "").trim();
      let checked = true;

      if (seccion === "diagnosticos") {
        text = String(item?.texto_presentacion || item || "").trim();
        const key = String(item?.key || "").trim();
        checked = !(excludedMap.diagnosticos.has(key) || excludedTextMap.diagnosticos.has(text));
        const code = String(item?.codigo || item?.codigo_cie10 || text.split(/\s+-\s+/)[0] || "");
        const description = String(item?.descripcion_original || item?.diagnostico || item?.descripcion || text.replace(code, "").replace(/^\s*-\s*/, ""));
        const status = String(item?.estado_codificacion || "pendiente_validacion");
        row.innerHTML = `<span role="cell"><input type="checkbox" id="${id}" ${checked ? "checked" : ""} data-index="${index}" data-item-key="${app.utils.escapeHtml(itemKey)}" aria-label="Incluir ${app.utils.escapeHtml(text)}"></span><strong role="cell">${app.utils.escapeHtml(code)}</strong><span role="cell">${app.utils.escapeHtml(description)}</span><span role="cell">${app.utils.escapeHtml(String(item?.descripcion_catalogo || item?.descripcion || ""))}<small class="pdf-code-status">${app.utils.escapeHtml(status)}</small></span><span role="cell">${detail}</span>`;
      } else if (seccion === "procedimientos") {
        const display = obtenerTextoProcedimiento(item);
        const classification = String(item?.clasificacion || "sin_clasificar");
        const automaticClassification = String(item?.clasificacion_automatica || "sin_clasificar");
        const classified = ["quirurgico", "no_quirurgico"].includes(classification);
        checked = classified && !(excludedMap.procedimientos.has(display) || excludedMap.procedimientos.has(obtenerDescripcionProcedimiento(item)));
        row.dataset.classification = classification;
        row.dataset.soatGroup = String(item?.grupo_soat_preparacion || "");
        const group = item?.grupo_soat_preparacion
          ? `<span class="pdf-group-badge">Grupo ${Number(item.grupo_soat_preparacion)}</span>${item.grupo_soat_origen === "manual_visual" ? '<small>Manual · sin efecto tarifario</small>' : ""}`
          : "—";
        const classificationOptions = [
          ["sin_clasificar", "Selecciona clasificación"],
          ["quirurgico", "Quirúrgico"],
          ["no_quirurgico", "No quirúrgico"],
        ].map(([value, label]) => `<option value="${value}" ${value === classification ? "selected" : ""}>${label}</option>`).join("");
        row.innerHTML = `<span role="cell"><input type="checkbox" id="${id}" ${checked ? "checked" : ""} ${classified ? "" : "disabled"} data-index="${index}" data-item-key="${app.utils.escapeHtml(itemKey)}" aria-label="Incluir ${app.utils.escapeHtml(display)}"></span><strong role="cell">${app.utils.escapeHtml(item?.codigo_cups || "—")}</strong><span role="cell">${app.utils.escapeHtml(item?.descripcion || "")}</span><span role="cell" class="pdf-classification"><select class="pdf-procedure-classification" data-procedure-key="${app.utils.escapeHtml(itemKey)}" data-automatic-classification="${app.utils.escapeHtml(automaticClassification)}" aria-label="Clasificación de ${app.utils.escapeHtml(display)}">${classificationOptions}</select></span><span role="cell" class="pdf-group">${group}</span><span role="cell">${detail}</span>`;
      } else if (seccion === "medicamentos") {
        const med = app.medicamentos.normalizarMedicamentoCanonico(item);
        text = app.medicamentos.formatearMedicamentoPresentacion(item);
        const key = String(item?.key || "").trim();
        checked = !((key && excludedMap.medicamentos.has(key)) || excludedTextMap.medicamentos.has(text));
        const statusBadges = med.estados.length
          ? med.estados.map((status) => `<span class="medication-status medication-status--${app.utils.escapeHtml(status)}">${app.utils.escapeHtml(status.replaceAll("_", " "))}</span>`).join("")
          : '<span class="medication-status">Sin estado</span>';
        const pertinenceBadge = med.pertinencia?.estado
          ? `<span class="medication-pertinence-wrap"><span class="medication-pertinence medication-pertinence--${app.utils.escapeHtml(med.pertinencia.estado)}">${app.utils.escapeHtml(med.pertinencia.estado.replaceAll("_", " "))}</span></span>`
          : "";
        const presentation = med.presentacion ? `<small>${app.utils.escapeHtml(med.presentacion)}</small>` : "";
        const referenceCode = med.codigo_referencia ? `<small>CUM/IUM ${app.utils.escapeHtml(med.codigo_referencia)}</small>` : "";
        row.innerHTML = `<span role="cell"><input type="checkbox" id="${id}" ${checked ? "checked" : ""} data-index="${index}" data-item-key="${app.utils.escapeHtml(itemKey)}" aria-label="Incluir ${app.utils.escapeHtml(med.medicamento)}"></span><span role="cell"><strong>${app.utils.escapeHtml(med.medicamento)}</strong>${presentation}${referenceCode}</span><span role="cell">${app.utils.escapeHtml(med.posologia || "—")}</span><span role="cell">${app.utils.escapeHtml(med.dosis || "—")}</span><span role="cell">${app.utils.escapeHtml(formatearCantidadMedicamento(med.cantidad) || "—")}</span><span role="cell"><span class="medication-statuses">${statusBadges}</span>${pertinenceBadge}</span><span role="cell">${detail}</span>`;
        row.dataset.searchText = [text, med.codigo_referencia].filter(Boolean).join(" ");
      } else {
        const aid = app.ayudasDiagnosticas.normalizarAyudaDiagnostica(item);
        if (!aid || aid.exportable === false || aid.glosado) return;
        text = aid.nombre;
        const display = `${aid.nombre}${aid.concepto ? ` - ${aid.concepto}` : ""}`;
        checked = !(excludedMap.ayudas_diagnosticas.has(aid.key) || excludedTextMap.ayudas_diagnosticas.has(display));
        row.dataset.aidType = aid.tipo;
        row.innerHTML = `<span role="cell"><input type="checkbox" id="${id}" ${checked ? "checked" : ""} data-index="${index}" data-item-key="${app.utils.escapeHtml(itemKey)}" aria-label="Incluir ${app.utils.escapeHtml(aid.nombre)}"></span><span role="cell" class="pdf-type-label">${app.utils.escapeHtml(aid.tipo.replaceAll("_", " "))}</span><strong role="cell">${app.utils.escapeHtml(aid.nombre)}</strong><span role="cell">${app.utils.escapeHtml(aid.concepto || "—")}</span><span role="cell">${app.utils.escapeHtml(aid.estado_interpretacion || (aid.interpretado ? "Interpretado" : "No interpretado"))}</span><span role="cell">${detail}</span>`;
      }
      row.dataset.searchText = text;
      list.appendChild(row);
    });
    document.dispatchEvent(new CustomEvent("epicrisis:selection-rendered", { detail: { section: seccion } }));
  }

  function actualizarClasificacionProcedimiento(select) {
    const row = select.closest(".pdf-list__row");
    if (!row) return;
    const index = Number(row.dataset.index);
    const item = app.state.pdfSelectionData.procedimientos?.[index];
    const classification = String(select.value || "sin_clasificar");
    const automaticClassification = String(select.dataset.automaticClassification || "sin_clasificar");
    if (item && typeof item === "object") {
      item.clasificacion = classification;
      item.clasificacion_manual = classification !== automaticClassification;
    }
    row.dataset.classification = classification;
    const classified = ["quirurgico", "no_quirurgico"].includes(classification);
    const checkbox = row.querySelector("input[type='checkbox']");
    if (checkbox) {
      checkbox.disabled = !classified;
      checkbox.checked = classified;
    }
    app.state.syncGlobals();
    app.preparation?.applyFilters("procedimientos");
    app.preparation?.updateCounts();
  }

  document.addEventListener?.("change", (event) => {
    const select = event.target.closest?.("#procedimientos_list .pdf-procedure-classification");
    if (select) actualizarClasificacionProcedimiento(select);
  });

  function hidratarDraftPdfInicial() {
    const draft = app.state.data.pdfDraft || {};
    const fieldMap = {
      diagnosticos_extra: Array.isArray(draft.manual_diagnosticos) ? draft.manual_diagnosticos.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 checkedKeys = new Set(
      list ? Array.from(list.querySelectorAll("input[type='checkbox']:checked"), (cb) => cb.dataset.itemKey) : []
    );
    const checked = fuente.filter((item, index) => checkedKeys.has(obtenerClaveSeleccion(seccion, item, index)));
    const extras = extra
      ? String(extra.value || "")
        .split(/\r?\n/)
        .map((line) => line.trim())
        .filter(Boolean)
      : [];
    if (seccion === "medicamentos") {
      return app.medicamentos.deduplicarMedicamentos(checked);
    }
    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);
    }
    if (seccion === "ayudas_diagnosticas") {
      return app.ayudasDiagnosticas.deduplicarAyudasDiagnosticas([
        ...checked.map((item) => app.ayudasDiagnosticas.normalizarAyudaDiagnostica(item)).filter(Boolean),
      ]).filter((item) => item.exportable !== false && !item.glosado);
    }
    if (seccion === "procedimientos") {
      return checked.map((item) => {
        const normalized = item && typeof item === "object" ? { ...item } : {
          descripcion: String(item || "").trim(),
          codigo_cups: "",
          codigo_soat: "",
          soporte_clinico: true,
        };
        const itemKey = obtenerClaveSeleccion("procedimientos", normalized);
        const row = Array.from(list?.querySelectorAll(".pdf-list__row") || [])
          .find((candidate) => candidate.dataset.itemKey === itemKey);
        const selected = row?.querySelector(".pdf-procedure-classification")?.value;
        normalized.clasificacion = String(selected || normalized.clasificacion || "sin_clasificar");
        return normalized;
      }).filter((item) => ["quirurgico", "no_quirurgico"].includes(item.clasificacion));
    }
    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 "";
  }

  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,
    parsearProcedimientoManual,
    obtenerClaveSeleccion,
  };
})(globalThis);
