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

  function actualizarEstadoAgenteQx(texto, esError = false) {
    const statusEl = document.getElementById("agente_qx_status");
    if (!statusEl) return;
    statusEl.textContent = texto;
    statusEl.classList.toggle("agente-qx-status--error", esError);
    statusEl.classList.toggle("agente-qx-status--idle", !esError);
  }

  async function ejecutarAgenteHallazgosQx() {
    const hallazgos = app.utils.stripHtml(app.state.data.hallazgos || "");
    const descripcion = app.utils.stripHtml(app.state.data.descripcionProcedimiento || "");

    if (!hallazgos && !descripcion) {
      actualizarEstadoAgenteQx("Sin hallazgos ni descripcion quirúrgica para analizar.");
      AppToast.show("No hay hallazgos quirúrgicos para analizar.", {
        type: "info",
        duration: 3200,
      });
      return;
    }

    const previos = Array.isArray(app.state.qxAgentResults) ? app.state.qxAgentResults : [];
    if (previos.length > 0) {
      actualizarEstadoAgenteQx(`Agente QX cargado: ${previos.length} resultado(s).`);
      AppToast.show(`Agente QX ya tenía ${previos.length} resultado(s) disponibles.`, {
        type: "info",
        duration: 3200,
      });
      return;
    }

    actualizarEstadoAgenteQx("Analizando hallazgos quirúrgicos con IA...");
    app.state.toastProcessIds.qx = AppToast.start("Iniciando análisis del agente QX...", {
      description: "Evaluando hallazgos y descripción quirúrgica.",
      actionLabel: "Ver historial",
      onAction: app.toast.actions.verHistorial,
    });

    try {
      AppToast.progress(app.state.toastProcessIds.qx, "Agente QX en ejecución...", {
        description: "Generando diagnósticos y procedimientos sugeridos.",
      });
      const response = await fetch("/agente/analizar_hallazgos_qx", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          hallazgos,
          descripcion_procedimiento: descripcion,
        }),
      });

      if (!response.ok) {
        let detalle = `HTTP ${response.status}`;
        const contentType = response.headers.get("content-type") || "";
        if (contentType.includes("application/json")) {
          const errorData = await response.json();
          if (errorData?.detail) detalle = errorData.detail;
        }
        throw new Error(detalle);
      }

      const data = await response.json();
      app.state.qxAgentResults = Array.isArray(data?.resultados) ? data.resultados : [];
      app.state.syncGlobals();
      app.selection.inicializarSeleccionPDF();

      const totalDx = Number(data?.total_diagnosticos || 0);
      const totalProc = Number(data?.total_procedimientos || 0);
      if (app.state.qxAgentResults.length > 0) {
        actualizarEstadoAgenteQx(`Agente QX: ${totalDx} diagnóstico(s) y ${totalProc} procedimiento(s) sugeridos.`);
        AppToast.success(app.state.toastProcessIds.qx, "Agente QX finalizado.", {
          description: `${totalDx} diagnóstico(s) y ${totalProc} procedimiento(s) sugeridos.`,
        });
      } else {
        actualizarEstadoAgenteQx("Agente QX sin sugerencias nuevas.");
        AppToast.success(app.state.toastProcessIds.qx, "Agente QX finalizado sin sugerencias nuevas.", {
          duration: 3500,
        });
      }
    } catch (error) {
      actualizarEstadoAgenteQx(`Error agente QX: ${error.message}`, true);
      AppToast.error(app.state.toastProcessIds.qx, `Error en agente QX: ${error.message}`, {
        actionLabel: "Reintentar",
        onAction: app.toast.actions.reintentarQx,
      });
    }
  }

  app.qxAgent = {
    actualizarEstadoAgenteQx,
    ejecutarAgenteHallazgosQx,
  };

  global.ejecutarAgenteHallazgosQx = ejecutarAgenteHallazgosQx;
})(globalThis);
