(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 diagnosticosExcluidos = diagnosticosFuente.filter((_, index) => {
      const checkbox = document.querySelector(`#diagnosticos_list input[data-index="${index}"]`);
      return checkbox && !checkbox.checked;
    });
    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((_, index) => {
      const checkbox = document.querySelector(`#procedimientos_list input[data-index="${index}"]`);
      return checkbox && !checkbox.checked;
    }).map((item) => item && typeof item === "object"
      ? [item.codigo_cups, item.descripcion].filter(Boolean).join(" - ")
      : String(item || "").trim());
    const medicamentosExcluidos = medicamentosFuente
      .filter((_, index) => {
        const checkbox = document.querySelector(`#medicamentos_list input[data-index="${index}"]`);
        return checkbox && !checkbox.checked;
      })
      .map((item) => app.medicamentos.formatearMedicamentoPresentacion(item));
    const medicamentosExcluidosKeys = medicamentosFuente
      .filter((_, index) => {
        const checkbox = document.querySelector(`#medicamentos_list input[data-index="${index}"]`);
        return checkbox && !checkbox.checked;
      })
      .map((item) => String(item?.key || "").trim())
      .filter(Boolean);
    const ayudasExcluidas = ayudasFuente.filter((_, index) => {
      const checkbox = document.querySelector(`#ayudas_diagnosticas_list input[data-index="${index}"]`);
      return checkbox && !checkbox.checked;
    });
    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 .procedure-classification").forEach((select) => {
      const key = String(select.dataset.procedureKey || "").trim();
      if (key) procedureClassificationOverrides[key] = String(select.value || "sin_clasificar");
    });

    return {
      pdf_draft: {
        excluded_diagnosticos: app.utils.deduplicarTextos(diagnosticosExcluidosTexto),
        excluded_diagnostico_keys: app.utils.deduplicarTextos(diagnosticosExcluidosKeys),
        manual_diagnosticos: extraLines("diagnosticos_extra"),
        excluded_procedimientos: app.utils.deduplicarTextos(procedimientosExcluidos),
        manual_procedimientos: extraLines("procedimientos_extra"),
        procedure_classification_overrides: procedureClassificationOverrides,
        excluded_medicamentos: app.utils.deduplicarTextos(medicamentosExcluidos),
        excluded_medicamento_keys: app.utils.deduplicarTextos(medicamentosExcluidosKeys),
        manual_medicamentos: extraLines("medicamentos_extra"),
        excluded_ayudas_diagnosticas_keys: app.utils.deduplicarTextos(ayudasExcluidasKeys),
        manual_ayudas_diagnosticas: extraLines("ayudas_diagnosticas_extra")
          .map((line) => app.ayudasDiagnosticas.normalizarAyudaDiagnostica(app.ayudasDiagnosticas.parseAyudaManual(line)))
          .filter(Boolean),
        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;
    }
    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.state.draftSaveTimer = globalThis.setTimeout(async () => {
      try {
        await persistirDraftEpicrisis(construirPayloadDraftActual());
      } catch (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",
      "procedimientos_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 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);
