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

  function construirPayloadDraftActual() {
    const diagnosticosFuente = app.state.pdfSelectionData.diagnosticos || [];
    const procedimientosFuente = app.state.pdfSelectionData.procedimientos || [];
    const medicamentosFuente = app.state.pdfSelectionData.medicamentos || [];
    const ayudasFuente = app.state.pdfSelectionData.ayudas_diagnosticas || [];
    const estaExcluido = (seccion, item, index) => {
      const key = app.selection.obtenerClaveSeleccion(seccion, item, index);
      const checkbox = Array.from(
        document.querySelectorAll(`#${seccion}_list input[type='checkbox'][data-item-key]`)
      ).find((candidate) => candidate.dataset.itemKey === key);
      return Boolean(checkbox && !checkbox.checked);
    };
    const diagnosticosExcluidos = diagnosticosFuente.filter((item, index) => {
      return estaExcluido("diagnosticos", item, index);
    });
    const diagnosticosExcluidosTexto = diagnosticosExcluidos
      .map((item) => item && typeof item === "object"
        ? String(item.texto_presentacion || "").trim()
        : String(item || "").trim())
      .filter(Boolean);
    const diagnosticosExcluidosKeys = diagnosticosExcluidos
      .map((item) => item && typeof item === "object" ? String(item.key || "").trim() : "")
      .filter(Boolean);
    const procedimientosExcluidos = procedimientosFuente.filter((item, index) => {
      return estaExcluido("procedimientos", item, index);
    }).map((item) => item && typeof item === "object"
      ? [item.codigo_cups, item.descripcion].filter(Boolean).join(" - ")
      : String(item || "").trim());
    const medicamentosExcluidos = medicamentosFuente
      .filter((item, index) => {
        return estaExcluido("medicamentos", item, index);
      })
      .map((item) => app.medicamentos.formatearMedicamentoPresentacion(item));
    const medicamentosExcluidosKeys = medicamentosFuente
      .filter((item, index) => {
        return estaExcluido("medicamentos", item, index);
      })
      .map((item) => String(item?.key || "").trim())
      .filter(Boolean);
    const ayudasExcluidas = ayudasFuente.filter((item, index) => {
      return estaExcluido("ayudas_diagnosticas", item, index);
    });
    const ayudasExcluidasKeys = ayudasExcluidas
      .map((item) => String(app.ayudasDiagnosticas.normalizarAyudaDiagnostica(item)?.key || "").trim())
      .filter(Boolean);
    const imagenesExcluidasLegacy = ayudasExcluidas
      .map((item) => {
        const ayuda = app.ayudasDiagnosticas.normalizarAyudaDiagnostica(item);
        if (ayuda?.tipo !== "imagen") return "";
        return `${ayuda.nombre}${ayuda.concepto ? ` - ${ayuda.concepto}` : ""}`;
      })
      .filter(Boolean);

    const extraLines = (id) => {
      const el = document.getElementById(id);
      return String(el?.value || "")
        .split(/\r?\n/)
        .map((line) => line.trim())
        .filter(Boolean);
    };
    const procedureClassificationOverrides = {};
    document.querySelectorAll("#procedimientos_list .pdf-procedure-classification").forEach((select) => {
      const key = String(select.dataset.procedureKey || "").trim();
      const automatic = String(select.dataset.automaticClassification || "sin_clasificar");
      const classification = String(select.value || "");
      if (key && classification && classification !== automatic) {
        procedureClassificationOverrides[key] = classification;
      }
    });
    const manualProcedureEntries = procedimientosFuente
      .filter((item) => item && typeof item === "object" && item.manual === true)
      .map((item) => ({
        key: String(item.key || "").trim(),
        value: String(item.texto_manual || [item.codigo_cups, item.descripcion].filter(Boolean).join(" - ")).trim(),
      }))
      .filter((item) => item.key && item.value);
    const stableEntries = (entryKey, lines, prefix) => {
      const existing = Array.isArray(app.state.data.pdfDraft?.[entryKey])
        ? app.state.data.pdfDraft[entryKey]
        : [];
      return lines.map((value) => {
        const previous = existing.find((item) => String(item?.value || "").trim() === value);
        return previous || {
          key: `manual:${prefix}:${globalThis.crypto?.randomUUID?.() || `${Date.now()}-${Math.random()}`}`,
          value,
        };
      });
    };
    const manualDiagnosticos = extraLines("diagnosticos_extra");
    const manualMedicamentos = extraLines("medicamentos_extra");
    const existingManualAids = Array.isArray(app.state.data.pdfDraft?.manual_ayudas_diagnosticas)
      ? app.state.data.pdfDraft.manual_ayudas_diagnosticas
      : [];
    const manualAyudasDiagnosticas = extraLines("ayudas_diagnosticas_extra")
      .map((line) => app.ayudasDiagnosticas.normalizarAyudaDiagnostica(
        app.ayudasDiagnosticas.parseAyudaManual(line)
      ))
      .filter(Boolean)
      .map((aid) => existingManualAids.find((item) => {
        const existing = app.ayudasDiagnosticas.normalizarAyudaDiagnostica(item);
        return existing?.tipo === aid.tipo
          && existing?.nombre === aid.nombre
          && existing?.concepto === aid.concepto;
      }) || aid);

    return {
      pdf_draft: {
        excluded_diagnosticos: app.utils.deduplicarTextos(diagnosticosExcluidosTexto),
        excluded_diagnostico_keys: app.utils.deduplicarTextos(diagnosticosExcluidosKeys),
        manual_diagnosticos: manualDiagnosticos,
        manual_diagnostico_entries: stableEntries(
          "manual_diagnostico_entries", manualDiagnosticos, "diagnostico"
        ),
        excluded_procedimientos: app.utils.deduplicarTextos(procedimientosExcluidos),
        manual_procedimientos: manualProcedureEntries.map((item) => item.value),
        manual_procedure_entries: manualProcedureEntries,
        procedure_classification_overrides: procedureClassificationOverrides,
        excluded_medicamentos: app.utils.deduplicarTextos(medicamentosExcluidos),
        excluded_medicamento_keys: app.utils.deduplicarTextos(medicamentosExcluidosKeys),
        manual_medicamentos: manualMedicamentos,
        manual_medicamento_entries: stableEntries(
          "manual_medicamento_entries", manualMedicamentos, "medicamento"
        ),
        excluded_ayudas_diagnosticas_keys: app.utils.deduplicarTextos(ayudasExcluidasKeys),
        manual_ayudas_diagnosticas: manualAyudasDiagnosticas,
        excluded_imagenes_diagnosticas: app.utils.deduplicarTextos(imagenesExcluidasLegacy),
        manual_imagenes_diagnosticas: extraLines("ayudas_diagnosticas_extra"),
        hallazgos_extra: app.selection.obtenerTextoAmpliacion("hallazgos_extra"),
        descripcion_procedimiento_extra: app.selection.obtenerTextoAmpliacion("descripcion_procedimiento_extra"),
      },
    };
  }

  async function persistirDraftEpicrisis(payload, { silent = true } = {}) {
    const caseKey = app.selection.obtenerEpicrisisCaseKeyDesdeUrl();
    if (!caseKey) return null;
    const response = await fetch(`/api/epicrisis/cases/${encodeURIComponent(caseKey)}/draft`, {
      method: "PATCH",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify(payload),
    });
    const data = await response.json();
    if (!response.ok) {
      throw new Error(data.detail || "No se pudo persistir el draft de epicrisis");
    }
    if (data?.pdf_draft) {
      app.state.data.pdfDraft = data.pdf_draft;
    }
    if (Array.isArray(data?.manual_soat_results)) {
      app.state.manualSoatResults = data.manual_soat_results;
      app.state.data.manualSoatResults = data.manual_soat_results;
    }
    if (Array.isArray(data?.codigos_desde_soat)) {
      app.state.data.codigosDesdeSoat = data.codigos_desde_soat;
    }
    if (Array.isArray(data?.diagnosticos_consolidados)) {
      app.state.data.diagnosticosConsolidados = data.diagnosticos_consolidados;
    }
    if (Array.isArray(data?.diagnosticos_pendientes_validacion)) {
      app.state.data.diagnosticosPendientes = data.diagnosticos_pendientes_validacion;
    }
    if (Array.isArray(data?.diagnosticos_consolidacion_hallazgos)) {
      app.state.data.diagnosticosHallazgos = data.diagnosticos_consolidacion_hallazgos;
    }
    if (Array.isArray(data?.ayudas_diagnosticas)) {
      app.state.data.ayudasDiagnosticas = data.ayudas_diagnosticas;
    }
    if (Array.isArray(data?.imagenes_diagnosticas)) {
      app.state.data.imagenesDiagnosticas = data.imagenes_diagnosticas;
    }
    if (Array.isArray(data?.pdf_selectable_procedimientos)) {
      app.state.data.pdfSelectableProcedimientos = data.pdf_selectable_procedimientos;
    }
    app.state.draftSaveErrorShown = false;
    app.state.syncGlobals();
    if (!silent) {
      AppToast.show("Cambios de epicrisis guardados.", {
        type: "success",
        duration: 1800,
      });
    }
    return data;
  }

  function programarPersistenciaDraft() {
    const caseKey = app.selection.obtenerEpicrisisCaseKeyDesdeUrl();
    if (!caseKey) return;
    if (app.state.draftSaveTimer) {
      globalThis.clearTimeout(app.state.draftSaveTimer);
    }
    app.preparation?.setAutosaveStatus("saving");
    app.state.draftSaveTimer = globalThis.setTimeout(async () => {
      try {
        await persistirDraftEpicrisis(construirPayloadDraftActual());
        app.preparation?.setAutosaveStatus("saved");
      } catch (error) {
        app.preparation?.setAutosaveStatus("error");
        console.error("Error guardando draft de epicrisis:", error);
        if (!app.state.draftSaveErrorShown) {
          app.state.draftSaveErrorShown = true;
          AppToast.show(`No se pudo guardar el draft: ${error.message}`, {
            type: "error",
            duration: 3500,
          });
        }
      } finally {
        app.state.syncGlobals();
      }
    }, 500);
    app.state.syncGlobals();
  }

  function instalarPersistenciaDraft() {
    ["diagnosticos_list", "procedimientos_list", "medicamentos_list", "ayudas_diagnosticas_list"].forEach((id) => {
      const el = document.getElementById(id);
      if (el) {
        el.addEventListener("change", programarPersistenciaDraft);
      }
    });
    [
      "diagnosticos_extra",
      "medicamentos_extra",
      "ayudas_diagnosticas_extra",
      "hallazgos_extra",
      "descripcion_procedimiento_extra",
    ].forEach((id) => {
      const el = document.getElementById(id);
      if (el) {
        el.addEventListener("input", programarPersistenciaDraft);
      }
    });
    const procedureList = document.getElementById("procedimientos_list");
    if (procedureList) {
      procedureList.addEventListener("input", (event) => {
        const input = event.target.closest?.(".procedure-manual-input");
        if (!input) return;
        const index = Number(input.dataset.index);
        const item = app.state.pdfSelectionData.procedimientos[index];
        if (!item || item.manual !== true) return;
        Object.assign(item, app.selection.parsearProcedimientoManual(input.value));
        programarPersistenciaDraft();
      });
      procedureList.addEventListener("click", (event) => {
        const button = event.target.closest?.(".procedure-remove");
        if (!button) return;
        const index = Number(button.dataset.index);
        app.state.data.pdfDraft = construirPayloadDraftActual().pdf_draft;
        app.state.pdfSelectionData.procedimientos.splice(index, 1);
        app.selection.renderSeccionSeleccion(
          "procedimientos",
          app.state.pdfSelectionData.procedimientos,
        );
        programarPersistenciaDraft();
      });
    }
    const aidFilter = document.getElementById("ayudas_diagnosticas_filter");
    if (aidFilter) {
      aidFilter.addEventListener("change", () => {
        const selected = String(aidFilter.value || "todos");
        document.querySelectorAll("#ayudas_diagnosticas_list .selection-item").forEach((row) => {
          row.hidden = !(selected === "todos" || row.dataset.aidType === selected);
        });
      });
    }
  }

  app.draft = {
    construirPayloadDraftActual,
    persistirDraftEpicrisis,
    programarPersistenciaDraft,
    instalarPersistenciaDraft,
  };
})(globalThis);
