// screens_forms.jsx — Selector de atención, Form 008 Emergencia, Evolución 005
const { useState: useStateF, useEffect: useEffectF } = React;

// ---- Tipos de atención clínica y sus formularios MSP asociados ----
const TIPOS_ATENCION = [
  { id: "emergencia",      label: "Emergencia",                 desc: "Atención de urgencia o emergencia · Form. 008",              icon: "alert",       tone: "#dc2626" },
  { id: "hospitalizacion", label: "Hospitalización",            desc: "Ingreso para hospitalización o internamiento",               icon: "vitals",      tone: "#2563eb" },
  { id: "cirugia",         label: "Cirugía",                    desc: "Procedimiento quirúrgico programado o urgente",              icon: "heart",       tone: "#be123c" },
  { id: "consulta",        label: "Consulta externa",           desc: "Consulta ambulatoria o seguimiento",                        icon: "stethoscope", tone: "#0891b2" },
  { id: "laboratorio",     label: "Laboratorio / Imagenología", desc: "Solicitud y resultado de exámenes diagnósticos",            icon: "folder",      tone: "#15803d" },
];

// Formularios MSP que aplican a cada tipo de atención
const FORMS_BY_TIPO = {
  emergencia:      ["admision","emergencia_08","evoluciones","epicrisis","kardex","oxigeno","ingesta","sol_sangre","transf_sanguinea","interconsulta","solicitud_012a","solicitud_post_012a","informe_012b","informe_post_012b","lab_010a_anv","lab_010a_rev","lab_010b_anv","lab_010b_rev","referencia_053","entrega_documentos"],
  hospitalizacion: ["admision","emergencia_08","evoluciones","epicrisis","kardex","preparacion_pcte","oxigeno","ingesta","sol_sangre","transf_sanguinea","interconsulta","solicitud_012a","solicitud_post_012a","informe_012b","informe_post_012b","lab_010a_anv","lab_010a_rev","lab_010b_anv","lab_010b_rev","referencia_053","entrega_documentos"],
  cirugia:         ["admision","protocolo","preparacion_pcte","quirofano","recuperacion","evoluciones","epicrisis","kardex","pre_1","pre_2","trans_018a_anv","trans_018a_rev","019_post_anv","019_post_rev","sol_sangre","transf_sanguinea","oxigeno","interconsulta","solicitud_012a","solicitud_post_012a","informe_012b","informe_post_012b","lab_010a_anv","lab_010a_rev","lab_010b_anv","lab_010b_rev","entrega_documentos"],
  consulta:        ["admision","evoluciones","interconsulta","solicitud_012a","solicitud_post_012a","informe_012b","lab_010a_anv","lab_010a_rev","lab_010b_anv","lab_010b_rev","referencia_053","entrega_documentos"],
  laboratorio:     ["solicitud_012a","solicitud_post_012a","informe_012b","informe_post_012b","lab_010a_anv","lab_010a_rev","lab_010b_anv","lab_010b_rev","entrega_documentos"],
};
window.FORMS_BY_TIPO = FORMS_BY_TIPO;
window.TIPOS_ATENCION = TIPOS_ATENCION;

// ---- Modal de nueva atención — crea el expediente en BD y navega a AtencionView ----
function NewAtencionModal({ open, onClose, paciente, onSelect }) {
  const [busy, setBusy] = useStateF(false);
  const [error, setError] = useStateF("");
  const [conflict, setConflict] = useStateF(null); // { tipo, record }

  const reset = () => { setConflict(null); setError(""); setBusy(false); };
  const handleClose = () => { reset(); onClose(); };

  const handleTipoClick = async (tipo) => {
    if (busy || !paciente?.id) return;
    setBusy(true); setError("");
    try {
      const records = await window.apiFetch(`/api/records?patient_id=${encodeURIComponent(paciente.id)}`);
      const today = new Date().toISOString().slice(0, 10);
      const active = Array.isArray(records) && records.find((r) =>
        r.tipo_atencion === tipo.id &&
        r.estado === "activo" &&
        (r.fecha_ingreso || "").slice(0, 10) === today
      );
      setBusy(false);
      if (active) { setConflict({ tipo, record: active }); }
      else { await doCreate(tipo); }
    } catch (e) {
      setBusy(false);
      setError(e.message || "Error verificando atenciones activas.");
    }
  };

  const doCreate = async (tipo) => {
    setBusy(true); setError("");
    try {
      const record = await window.apiFetch("/api/records", {
        method: "POST",
        body: JSON.stringify({ patient_id: paciente.id, tipo_atencion: tipo.id }),
      });
      reset();
      onSelect(record);
    } catch (e) {
      setError(e.message || "No se pudo crear la atención. Intente nuevamente.");
      setBusy(false);
    }
  };

  // ── Pantalla de conflicto: atención activa del mismo tipo ya existe hoy ──
  if (conflict) {
    const { tipo, record: activeRec } = conflict;
    const t = TIPOS_ATENCION.find((x) => x.id === tipo.id) || tipo;
    const hora = activeRec.hora_ingreso || (activeRec.fecha_ingreso || "").slice(11, 16) || "—";
    return (
      <Modal open={open} onClose={handleClose} title="Atención activa detectada" width={500}>
        <div style={{ display: "flex", gap: 12, alignItems: "flex-start", padding: "13px 15px", borderRadius: 12, background: "color-mix(in oklch, var(--warn) 10%, transparent)", border: "1px solid color-mix(in oklch, var(--warn) 30%, var(--line))", marginBottom: 18 }}>
          <Icon name="alert" size={20} style={{ color: "var(--warn)", flexShrink: 0, marginTop: 1 }} />
          <div>
            <div style={{ fontWeight: 700, fontSize: 13.5, color: "var(--ink)" }}>Ya existe una atención de <em>{t.label}</em> abierta hoy a las {hora}</div>
            <div style={{ fontSize: 12.5, color: "var(--ink-3)", marginTop: 3 }}>N° {activeRec.record_number} · {activeRec.medico_nombre || "Sin médico asignado"}</div>
          </div>
        </div>
        <div style={{ display: "flex", flexDirection: "column", gap: 9 }}>
          <button onClick={() => { reset(); onSelect(activeRec); }}
            style={{ display: "flex", gap: 13, alignItems: "center", padding: "14px 16px", borderRadius: 11, border: "1.5px solid var(--accent)", background: "var(--accent-soft)", cursor: "pointer", fontFamily: "inherit" }}>
            <span style={{ width: 36, height: 36, borderRadius: 9, background: "var(--accent)", color: "#fff", display: "flex", alignItems: "center", justifyContent: "center", flexShrink: 0 }}>
              <Icon name="edit" size={18} />
            </span>
            <div style={{ textAlign: "left" }}>
              <div style={{ fontSize: 13.5, fontWeight: 700, color: "var(--accent-ink)" }}>Continuar atención abierta</div>
              <div style={{ fontSize: 12, color: "var(--ink-3)", marginTop: 2 }}>Agregar formularios a la atención existente de hoy</div>
            </div>
          </button>
          <button onClick={() => doCreate(tipo)} disabled={busy}
            style={{ display: "flex", gap: 13, alignItems: "center", padding: "14px 16px", borderRadius: 11, border: "1px solid var(--line)", background: "var(--surface)", cursor: busy ? "wait" : "pointer", fontFamily: "inherit", opacity: busy ? .7 : 1 }}>
            <span style={{ width: 36, height: 36, borderRadius: 9, background: "var(--chip)", color: "var(--ink-3)", display: "flex", alignItems: "center", justifyContent: "center", flexShrink: 0 }}>
              {busy
                ? <span className="g-spin" style={{ width: 16, height: 16, border: "2px solid var(--line-2)", borderTopColor: "var(--ink-3)", borderRadius: 99, display: "inline-block" }} />
                : <Icon name="add" size={18} />}
            </span>
            <div style={{ textAlign: "left" }}>
              <div style={{ fontSize: 13.5, fontWeight: 700, color: "var(--ink-2)" }}>Crear nueva atención</div>
              <div style={{ fontSize: 12, color: "var(--ink-3)", marginTop: 2 }}>Solo si es una visita o evento clínico diferente del mismo día</div>
            </div>
          </button>
        </div>
        {error && <div style={{ marginTop: 12, padding: "9px 13px", borderRadius: 9, background: "var(--danger-soft)", color: "var(--danger)", fontSize: 13 }}>{error}</div>}
        <button onClick={() => { setConflict(null); setError(""); }}
          style={{ display: "inline-flex", alignItems: "center", gap: 6, marginTop: 14, border: "none", background: "transparent", color: "var(--ink-3)", fontSize: 13, cursor: "pointer", fontFamily: "inherit", padding: "4px 0" }}>
          <Icon name="back" size={15} /> Elegir otro tipo de atención
        </button>
      </Modal>
    );
  }

  // ── Pantalla principal: selección de tipo ──
  return (
    <Modal open={open} onClose={busy ? undefined : handleClose} title={`Nueva atención · ${paciente ? paciente.apellidos : ""}`} width={640}>
      <p style={{ margin: "0 0 16px", fontSize: 13.5, color: "var(--ink-3)" }}>
        Selecciona el tipo de atención. Si ya existe una atención activa del mismo tipo hoy, podrás continuar con ella o crear una nueva.
      </p>
      {error && (
        <div style={{ display: "flex", alignItems: "center", gap: 9, padding: "10px 13px", borderRadius: 9, background: "var(--danger-soft)", color: "var(--danger)", fontSize: 13, fontWeight: 600, marginBottom: 14 }}>
          <Icon name="alert" size={15} /> {error}
        </div>
      )}
      <div style={{ display: "grid", gridTemplateColumns: "1fr 1fr", gap: 11 }}>
        {TIPOS_ATENCION.map((t) => (
          <button key={t.id} onClick={() => handleTipoClick(t)} disabled={busy}
            className="g-formpick"
            style={{ display: "flex", gap: 13, alignItems: "flex-start", textAlign: "left", padding: 15, borderRadius: 12, border: "1px solid var(--line)", background: "var(--surface)", cursor: busy ? "wait" : "pointer", fontFamily: "inherit", opacity: busy ? .7 : 1 }}>
            <span style={{ width: 40, height: 40, borderRadius: 10, background: `color-mix(in oklch, ${t.tone} 13%, transparent)`, color: t.tone, display: "flex", alignItems: "center", justifyContent: "center", flexShrink: 0 }}>
              {busy
                ? <span className="g-spin" style={{ width: 18, height: 18, border: `2px solid color-mix(in oklch, ${t.tone} 30%, transparent)`, borderTopColor: t.tone, borderRadius: 99, display: "inline-block" }} />
                : <Icon name={t.icon} size={20} />}
            </span>
            <div>
              <div style={{ fontSize: 14, fontWeight: 700, color: "var(--ink)" }}>{t.label}</div>
              <div style={{ fontSize: 11.5, color: "var(--ink-3)", marginTop: 2, lineHeight: 1.5 }}>{t.desc}</div>
            </div>
          </button>
        ))}
      </div>
    </Modal>
  );
}

// ---- Shell de formulario clínico ----
function FormShell({ paciente, record, title, form, secciones, activeSec, onSec, children, onBack, onSign, onSave, signed, saving, progress }) {
  return (
    <div style={{ display: "flex", flexDirection: "column", gap: 0, minHeight: "100%" }}>
      {/* Barra superior sticky */}
      <div style={{ position: "sticky", top: 0, zIndex: 30, background: "var(--surface)", borderBottom: "1px solid var(--line)", margin: "-28px -28px 22px", padding: "14px 28px" }} className="g-formbar">
        <div style={{ display: "flex", alignItems: "center", gap: 14, flexWrap: "wrap" }}>
          <button onClick={onBack} className="g-iconbtn" style={{ border: "1px solid var(--line)", background: "var(--surface)", borderRadius: 9, padding: 8, cursor: "pointer", color: "var(--ink-2)", display: "flex" }}><Icon name="back" size={18} /></button>
          <div style={{ flex: 1, minWidth: 180 }}>
            <div style={{ display: "flex", alignItems: "center", gap: 9 }}>
              <h1 style={{ margin: 0, fontSize: 18, fontWeight: 800, color: "var(--ink)", letterSpacing: "-.01em" }}>{title}</h1>
              <Badge tone="blue" style={{ fontFamily: "var(--mono)" }}>Form. {form}</Badge>
            </div>
            <div style={{ fontSize: 12.5, color: "var(--ink-3)", marginTop: 2 }}>{paciente.apellidos} {paciente.nombres} · <span style={{ fontFamily: "var(--mono)" }}>{record?.record_number || paciente.hc || "—"}</span>{window.calcEdad(paciente.fecha_nacimiento) !== null ? ` · ${window.calcEdad(paciente.fecha_nacimiento)} años` : (paciente.edad ? ` · ${paciente.edad} años` : "")}</div>
          </div>
          <div style={{ display: "flex", alignItems: "center", gap: 10 }}>
            <div style={{ display: "flex", alignItems: "center", gap: 8 }}>
              <div style={{ width: 90, height: 6, borderRadius: 99, background: "var(--line)", overflow: "hidden" }}>
                <div style={{ width: `${progress}%`, height: "100%", background: "var(--accent)", transition: "width .3s" }} />
              </div>
              <span style={{ fontSize: 12, fontWeight: 600, color: "var(--ink-3)", fontFamily: "var(--mono)" }}>{progress}%</span>
            </div>
            <Btn variant="ghost" size="sm" onClick={onSave} disabled={saving}>{saving ? "Guardando…" : "Guardar borrador"}</Btn>
            {signed ? <Badge tone="green" dot>Firmado</Badge> : <Btn icon="sign" size="sm" onClick={onSign} disabled={saving}>{saving ? "Guardando…" : "Firmar y cerrar"}</Btn>}
          </div>
        </div>
      </div>

      <div style={{ display: "grid", gridTemplateColumns: "210px 1fr", gap: 26, alignItems: "start" }} className="g-form-grid">
        {/* Navegación de secciones */}
        <nav style={{ position: "sticky", top: 90, display: "flex", flexDirection: "column", gap: 2 }} className="g-form-nav">
          {secciones.map((s, i) => (
            <button key={s.id} onClick={() => onSec(s.id)} style={{
              display: "flex", alignItems: "center", gap: 10, textAlign: "left", padding: "9px 12px", borderRadius: 9,
              border: "none", cursor: "pointer", fontFamily: "inherit", fontSize: 13, fontWeight: 600,
              background: activeSec === s.id ? "var(--accent-soft)" : "transparent",
              color: activeSec === s.id ? "var(--accent-ink)" : "var(--ink-3)",
            }}>
              <span style={{ width: 22, height: 22, borderRadius: 7, flexShrink: 0, display: "flex", alignItems: "center", justifyContent: "center", fontSize: 11, fontWeight: 700, fontFamily: "var(--mono)",
                background: activeSec === s.id ? "var(--accent)" : "var(--chip)", color: activeSec === s.id ? "#fff" : "var(--ink-3)" }}>{i + 1}</span>
              {s.label}
            </button>
          ))}
        </nav>
        <div style={{ display: "flex", flexDirection: "column", gap: 18, minWidth: 0 }}>{children}</div>
      </div>
    </div>
  );
}

function FormSection({ id, title, letter, children, action }) {
  return (
    <section id={"sec-" + id} style={{ background: "var(--surface)", border: "1px solid var(--line)", borderRadius: 14, boxShadow: "var(--shadow)", overflow: "hidden", scrollMarginTop: 100 }}>
      <header style={{ display: "flex", alignItems: "center", gap: 11, padding: "13px 18px", borderBottom: "1px solid var(--line)", background: "var(--field)" }}>
        {letter && <span style={{ width: 24, height: 24, borderRadius: 7, background: "var(--accent)", color: "#fff", display: "flex", alignItems: "center", justifyContent: "center", fontSize: 12, fontWeight: 800 }}>{letter}</span>}
        <h3 style={{ margin: 0, fontSize: 14, fontWeight: 700, color: "var(--ink)", flex: 1, textTransform: "uppercase", letterSpacing: ".02em" }}>{title}</h3>
        {action}
      </header>
      <div style={{ padding: 18 }}>{children}</div>
    </section>
  );
}

const grid2 = { display: "grid", gridTemplateColumns: "1fr 1fr", gap: 14 };
const grid3 = { display: "grid", gridTemplateColumns: "1fr 1fr 1fr", gap: 14 };

// ---- Formulario 008 Emergencia ----
function FormEmergencia({ paciente, record, onBack, onSign }) {
  const [sec, setSec] = useStateF("datos");
  const [dxs, setDxs] = useStateF([]);
  const [signed, setSigned] = useStateF(false);
  const [saving, setSaving] = useStateF(false);
  const [saveError, setSaveError] = useStateF("");

  // Único objeto de estado controlado para todos los campos del formulario
  const [fd, setFd] = useStateF({
    servicio: record?.servicio || "",
    forma_llegada: record?.via_ingreso || "",
    nivel_triaje: "",
    fecha: (record?.fecha_ingreso || "").slice(0, 10) || new Date().toISOString().slice(0, 10),
    hora: record?.hora_ingreso || new Date().toTimeString().slice(0, 5),
    acompanante: "",
    ta: "", fc: "", fr: "", temperatura: "", spo2: "", glasgow: "", peso: "", talla: "",
    ant_alergicos: "",
    ant_clinicos: "",
    motivo_consulta: "",
    examen_fisico: "",
    indicaciones: "",
  });

  const set = (k, v) => setFd((prev) => ({ ...prev, [k]: v }));
  const d = (k) => fd[k] !== undefined ? fd[k] : "";

  const secciones = [
    { id: "datos",        label: "Datos y prioridad" },
    { id: "vitales",      label: "Constantes vitales" },
    { id: "antecedentes", label: "Antecedentes" },
    { id: "actual",       label: "Enfermedad actual" },
    { id: "examen",       label: "Examen físico" },
    { id: "dx",           label: "Diagnósticos" },
    { id: "plan",         label: "Plan y prescripción" },
  ];
  const aiSug = [
    { c: "I20.0", n: "Angina inestable", matchPct: 94 },
    { c: "I21.9", n: "Infarto agudo de miocardio", matchPct: 71 },
    { c: "R07.2", n: "Dolor precordial", matchPct: 88 },
  ];

  const alergias = typeof paciente.alergias === "string"
    ? (function(s) { try { return JSON.parse(s||"null")||[]; } catch { return []; } })(paciente.alergias)
    : (paciente.alergias || []);
  const antPers = typeof paciente.antecedentes_personales === "string"
    ? (function(s) { try { return JSON.parse(s||"null")||{}; } catch { return {}; } })(paciente.antecedentes_personales)
    : (paciente.antecedentes_personales || {});

  const scrollTo = (id) => {
    setSec(id);
    const el = document.getElementById("sec-" + id);
    if (el) window.scrollTo({ top: el.getBoundingClientRect().top + window.scrollY - 100, behavior: "smooth" });
  };

  const progress = signed ? 100 : Math.min(95,
    (d("motivo_consulta") ? 20 : 0) + (d("ta") || d("fc") ? 20 : 0) +
    (dxs.length > 0 ? 20 : 0) + (d("examen_fisico") ? 15 : 0) +
    (d("fecha") ? 10 : 0) + 15
  );

  // Carga datos guardados desde la BD
  useEffectF(() => {
    if (!record?.id) return;
    window.apiFetch(`/api/forms?record_id=${record.id}&form_type=emergencia_08`)
      .then((forms) => {
        if (!Array.isArray(forms) || !forms.length) return;
        try {
          const raw = forms[0].form_data;
          const saved = (typeof raw === "string" ? JSON.parse(raw) : raw) || {};
          if (Array.isArray(saved.diagnosticos) && saved.diagnosticos.length) setDxs(saved.diagnosticos);
          // Restaurar todos los campos controlados
          setFd((prev) => ({
            ...prev,
            servicio:       saved.servicio       || prev.servicio,
            forma_llegada:  saved.forma_llegada  || prev.forma_llegada,
            nivel_triaje:   saved.nivel_triaje   || prev.nivel_triaje,
            fecha:          saved.fecha          || prev.fecha,
            hora:           saved.hora           || prev.hora,
            acompanante:    saved.acompanante    !== undefined ? saved.acompanante : prev.acompanante,
            ta:             saved.ta             || prev.ta,
            fc:             saved.fc             || prev.fc,
            fr:             saved.fr             || prev.fr,
            temperatura:    saved.temperatura    || prev.temperatura,
            spo2:           saved.spo2           || prev.spo2,
            glasgow:        saved.glasgow        || prev.glasgow,
            peso:           saved.peso           || prev.peso,
            talla:          saved.talla          || prev.talla,
            ant_alergicos:  saved.ant_alergicos  || alergias.join(", "),
            ant_clinicos:   saved.ant_clinicos   || antPers.patologicos || "",
            motivo_consulta:saved.motivo_consulta|| prev.motivo_consulta,
            examen_fisico:  saved.examen_fisico  || prev.examen_fisico,
            indicaciones:   saved.indicaciones   || prev.indicaciones,
          }));
          if (forms[0].status === "firmado") setSigned(true);
        } catch (_) {}
      }).catch(() => {});
  }, [record?.id]);

  const save = async (sign = false) => {
    if (!record?.id) return;
    if (record.estado && record.estado !== "activo") { onBack(); return; }
    setSaving(true); setSaveError("");
    try {
      await window.apiFetch("/api/forms", {
        method: "POST",
        body: JSON.stringify({
          record_id: record.id,
          form_type: "emergencia_08",
          form_data: { ...fd, diagnosticos: dxs },
        }),
      });
      if (sign) setSigned(true);
      setTimeout(() => onBack(), 400);
    } catch (e) {
      setSaveError(e.message || "Error al guardar");
    } finally {
      setSaving(false);
    }
  };

  const canEdit = !signed && (!record?.estado || record.estado === "activo");

  return (
    <FormShell paciente={paciente} record={record} title="Atención de emergencia" form="008"
      secciones={secciones} activeSec={sec} onSec={scrollTo} onBack={onBack}
      signed={signed} saving={saving} onSave={() => save(false)} onSign={() => save(true)} progress={progress}>

      {saveError && (
        <div style={{ display: "flex", alignItems: "center", gap: 9, padding: "10px 14px", borderRadius: 10, background: "var(--danger-soft)", color: "var(--danger)", fontSize: 13, fontWeight: 600 }}>
          <Icon name="alert" size={15} /> {saveError}
        </div>
      )}

      <FormSection id="datos" letter="A" title="Datos y prioridad de atención">
        <div style={grid3}>
          <Field label="Servicio">
            <Select value={d("servicio")} onChange={(e) => set("servicio", e.target.value)} disabled={!canEdit}>
              <option value="">Seleccione…</option>
              {["Emergencia","Medicina Interna","Cardiología","Cirugía","Traumatología","Pediatría","Ginecología","UCI","Neonatología","Otro"].map((s) => <option key={s}>{s}</option>)}
            </Select>
          </Field>
          <Field label="Forma de llegada">
            <Select value={d("forma_llegada")} onChange={(e) => set("forma_llegada", e.target.value)} disabled={!canEdit}>
              <option value="">Seleccione…</option>
              <option value="propio_pie">Propio pie</option>
              <option value="ambulancia">Ambulancia</option>
              <option value="referido">Referido</option>
              <option value="traslado">Traslado hospitalario</option>
              <option value="ambulatorio">Ambulatorio</option>
            </Select>
          </Field>
          <Field label="Prioridad (Triage)">
            <Select value={d("nivel_triaje")} onChange={(e) => set("nivel_triaje", e.target.value)} disabled={!canEdit} className="g-triage">
              <option value="">Seleccione…</option>
              <option value="I">I — Resucitación</option>
              <option value="II">II — Emergencia</option>
              <option value="III">III — Urgencia</option>
              <option value="IV">IV — Urgencia menor</option>
              <option value="V">V — No urgente</option>
            </Select>
          </Field>
          <Field label="Fecha">
            <TextInput type="date" value={d("fecha")} onChange={(e) => set("fecha", e.target.value)} disabled={!canEdit} />
          </Field>
          <Field label="Hora">
            <TextInput type="time" value={d("hora")} onChange={(e) => set("hora", e.target.value)} disabled={!canEdit} />
          </Field>
          <Field label="Acompañante">
            <TextInput value={d("acompanante")} onChange={(e) => set("acompanante", e.target.value)} disabled={!canEdit} />
          </Field>
        </div>
      </FormSection>

      <FormSection id="vitales" letter="G" title="Constantes vitales y antropometría">
        <div style={{ display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(120px,1fr))", gap: 12 }}>
          {[["ta","T/A (mmHg)"],["fc","FC (lpm)"],["fr","FR (rpm)"],["temperatura","Temp (°C)"],["spo2","SatO₂ (%)"],["glasgow","Glasgow"],["peso","Peso (kg)"],["talla","Talla (cm)"]].map(([k, label]) => (
            <Field key={k} label={label}>
              <TextInput value={d(k)} onChange={(e) => set(k, e.target.value)} disabled={!canEdit} placeholder="—" />
            </Field>
          ))}
        </div>
      </FormSection>

      <FormSection id="antecedentes" letter="E" title="Antecedentes patológicos">
        <div style={grid2}>
          <Field label="Alérgicos">
            <TextInput value={d("ant_alergicos")} onChange={(e) => set("ant_alergicos", e.target.value)} disabled={!canEdit}
              style={alergias.length ? { borderColor: "var(--danger)", background: "var(--danger-soft)" } : {}} />
            {alergias.length > 0 && <span style={{ fontSize: 11.5, color: "var(--danger)", fontWeight: 600, marginTop: 4, display: "flex", alignItems: "center", gap: 5 }}><Icon name="alert" size={13} /> Alergia conocida</span>}
          </Field>
          <Field label="Clínicos / personales">
            <TextInput value={d("ant_clinicos")} onChange={(e) => set("ant_clinicos", e.target.value)} disabled={!canEdit} />
          </Field>
        </div>
      </FormSection>

      <FormSection id="actual" letter="F" title="Enfermedad o problema actual">
        <TextArea value={d("motivo_consulta")} onChange={(e) => set("motivo_consulta", e.target.value)}
          style={{ minHeight: 110 }} placeholder="Describa el cuadro clínico actual…" disabled={!canEdit} />
      </FormSection>

      <FormSection id="examen" letter="H" title="Examen físico">
        <TextArea value={d("examen_fisico")} onChange={(e) => set("examen_fisico", e.target.value)}
          style={{ minHeight: 100 }} placeholder="Hallazgos del examen físico por sistemas…" disabled={!canEdit} />
      </FormSection>

      <FormSection id="dx" letter="I" title="Diagnósticos" action={<AIChip>3 sugerencias IA</AIChip>}>
        <div style={{ display: "flex", flexDirection: "column", gap: 13 }}>
          {canEdit && <DxSearch onPick={(dx) => setDxs((prev) => prev.find((x) => x.c === dx.c) ? prev : [...prev, { c: dx.c, n: dx.n, version: dx.version, tipo: "Presuntivo" }])} aiSuggestions={aiSug} />}
          <div style={{ display: "flex", flexDirection: "column", gap: 8 }}>
            {dxs.map((dx, i) => (
              <div key={dx.c} style={{ display: "flex", alignItems: "center", gap: 12, padding: "11px 13px", borderRadius: 11, background: "var(--field)", border: "1px solid var(--line)" }}>
                <span style={{ fontFamily: "var(--mono)", fontSize: 13, fontWeight: 700, color: "var(--accent)", background: "var(--accent-soft)", padding: "4px 9px", borderRadius: 7 }}>{dx.c}</span>
                {dx.version && <span style={{ fontSize: 11, fontWeight: 700, color: dx.version === "CIE-11" ? "#0891b2" : "#6d28d9", background: dx.version === "CIE-11" ? "color-mix(in oklch, #0891b2 12%, transparent)" : "color-mix(in oklch, #7c3aed 12%, transparent)", padding: "2px 7px", borderRadius: 10 }}>{dx.version}</span>}
                <span style={{ flex: 1, fontSize: 13.5, color: "var(--ink)" }}>{dx.n}</span>
                {canEdit && <>
                  <select value={dx.tipo} className="g-input" style={{ ...window.inputStyle, width: "auto", padding: "5px 9px", fontSize: 12.5 }}
                    onChange={(e) => setDxs((prev) => prev.map((x, j) => j === i ? { ...x, tipo: e.target.value } : x))}>
                    <option>Presuntivo</option><option>Definitivo</option>
                  </select>
                  <button onClick={() => setDxs((prev) => prev.filter((_, j) => j !== i))} className="g-iconbtn" style={{ border: "none", background: "transparent", color: "var(--ink-3)", cursor: "pointer", padding: 4, borderRadius: 7, display: "flex" }}><Icon name="x" size={16} /></button>
                </>}
              </div>
            ))}
            {dxs.length === 0 && <div style={{ fontSize: 13, color: "var(--ink-3)", padding: "8px 2px" }}>Busca y agrega diagnósticos, o usa una sugerencia de IA.</div>}
          </div>
        </div>
      </FormSection>

      <FormSection id="plan" letter="J" title="Plan terapéutico y prescripción">
        <div style={{ display: "flex", flexDirection: "column", gap: 14 }}>
          <Field label="Indicaciones">
            <TextArea value={d("indicaciones")} onChange={(e) => set("indicaciones", e.target.value)}
              style={{ minHeight: 84 }} placeholder="Indicaciones médicas y plan terapéutico…" disabled={!canEdit} />
          </Field>
          {alergias.length > 0 && (
            <div style={{ display: "flex", gap: 10, alignItems: "center", padding: "11px 14px", borderRadius: 11, background: "var(--danger-soft)", border: "1px solid color-mix(in oklch, var(--danger) 25%, transparent)" }}>
              <Icon name="alert" size={17} style={{ color: "var(--danger)", flexShrink: 0 }} />
              <span style={{ fontSize: 12.8, color: "var(--ink-2)", lineHeight: 1.45 }}><strong style={{ color: "var(--danger)" }}>Alerta de alergias:</strong> {alergias.join(", ")} — verifique compatibilidad con los medicamentos prescritos.</span>
            </div>
          )}
        </div>
      </FormSection>

      <SignBlock signed={signed} />
    </FormShell>
  );
}

// ---- Bloque de firma digital ----
function SignBlock({ signed, medico }) {
  const m = medico || window.CURRENT_USER || { nombre: "Médico tratante", registro: "—", iniciales: "MT", color: "#2563eb" };
  return (
    <div style={{ background: signed ? "color-mix(in oklch, var(--ok) 6%, var(--surface))" : "var(--surface)", border: `1px solid ${signed ? "color-mix(in oklch, var(--ok) 35%, var(--line))" : "var(--line)"}`, borderRadius: 14, padding: 18, display: "flex", alignItems: "center", gap: 16, flexWrap: "wrap", boxShadow: "var(--shadow)" }}>
      <span style={{ width: 44, height: 44, borderRadius: 11, background: signed ? "color-mix(in oklch, var(--ok) 16%, transparent)" : "var(--chip)", color: signed ? "var(--ok-ink)" : "var(--ink-3)", display: "flex", alignItems: "center", justifyContent: "center", flexShrink: 0 }}><Icon name={signed ? "checkCircle" : "sign"} size={22} /></span>
      <div style={{ flex: 1, minWidth: 200 }}>
        <div style={{ fontSize: 14, fontWeight: 700, color: "var(--ink)" }}>{signed ? "Documento firmado digitalmente" : "Firma digital del profesional"}</div>
        <div style={{ fontSize: 12.5, color: "var(--ink-3)", marginTop: 2 }}>{m.nombre} · {m.especialidad} · {m.registro}</div>
      </div>
      {signed && (
        <div style={{ textAlign: "right" }}>
          <div style={{ fontFamily: "'Caveat', cursive", fontSize: 30, color: "var(--accent)", lineHeight: .9 }}>{m.nombre}</div>
          <div style={{ fontSize: 10.5, color: "var(--ink-3)", fontFamily: "var(--mono)" }}>SHA-256 · 2026-06-02 08:42 · firma electrónica válida</div>
        </div>
      )}
    </div>
  );
}

// ---- Formulario 005 Evolución (con transcripción IA) ----
function FormEvolucion({ paciente, record, onBack, onOpenCopilot, injectedText, onConsumeInjected }) {
  const [nota, setNota] = useStateF("");
  const [signed, setSigned] = useStateF(false);
  const [saving, setSaving] = useStateF(false);
  const [fecha, setFecha] = useStateF(new Date().toISOString().slice(0, 10));
  const [hora, setHora]   = useStateF(new Date().toTimeString().slice(0, 5));
  const [servicio, setServicio] = useStateF(record?.servicio || "");

  useEffectF(() => { if (injectedText) { setNota((n) => (n ? n + " " : "") + injectedText); onConsumeInjected && onConsumeInjected(); } }, [injectedText]);

  useEffectF(() => {
    if (!record?.id) return;
    window.apiFetch(`/api/forms?record_id=${record.id}&form_type=evoluciones`)
      .then((forms) => {
        if (!Array.isArray(forms) || !forms.length) return;
        try {
          const raw = forms[0].form_data;
          const saved = (typeof raw === "string" ? JSON.parse(raw) : raw) || {};
          if (saved.nota)     setNota(saved.nota);
          if (saved.fecha)    setFecha(saved.fecha);
          if (saved.hora)     setHora(saved.hora);
          if (saved.servicio) setServicio(saved.servicio);
          if (forms[0].status === "firmado") setSigned(true);
        } catch (_) {}
      }).catch(() => {});
  }, [record?.id]);

  const secciones = [{ id: "evo", label: "Evolución" }, { id: "presc", label: "Prescripción" }, { id: "firma", label: "Firma" }];

  const save = async (sign = false) => {
    if (!record?.id || (record.estado && record.estado !== "activo")) { onBack(); return; }
    setSaving(true);
    try {
      await window.apiFetch("/api/forms", {
        method: "POST",
        body: JSON.stringify({ record_id: record.id, form_type: "evoluciones", form_data: { nota, fecha, hora, servicio } }),
      });
      if (sign) setSigned(true);
      setTimeout(() => onBack(), 400);
    } catch (_) {
      onBack();
    } finally {
      setSaving(false);
    }
  };

  const canEdit = !signed && (!record?.estado || record.estado === "activo");

  return (
    <FormShell paciente={paciente} record={record} title="Evolución médica" form="005" secciones={secciones} activeSec="evo" onSec={() => {}} onBack={onBack} signed={signed} saving={saving} onSave={() => save(false)} onSign={() => save(true)} progress={signed ? 100 : nota.length > 30 ? 80 : 40}>
      <FormSection id="evo" letter="B" title="Evolución" action={canEdit ? <Btn variant="soft" size="sm" icon="mic" onClick={onOpenCopilot}>Dictar con IA</Btn> : null}>
        <div style={{ display: "flex", flexDirection: "column", gap: 12 }}>
          <div style={grid3}>
            <Field label="Fecha">
              <TextInput type="date" value={fecha} onChange={(e) => setFecha(e.target.value)} disabled={!canEdit} />
            </Field>
            <Field label="Hora">
              <TextInput type="time" value={hora} onChange={(e) => setHora(e.target.value)} disabled={!canEdit} />
            </Field>
            <Field label="Servicio">
              <Select value={servicio} onChange={(e) => setServicio(e.target.value)} disabled={!canEdit}>
                <option value="">Seleccione…</option>
                {["Emergencia","Medicina Interna","Cardiología","Cirugía","Traumatología","Pediatría","Ginecología","UCI","Neonatología","Otro"].map((s) => <option key={s}>{s}</option>)}
              </Select>
            </Field>
          </div>
          <Field label="Nota de evolución (SOAP)" hint="Puedes dictar por voz desde el copiloto IA y el texto se inserta aquí.">
            <TextArea value={nota} onChange={(e) => setNota(e.target.value)} placeholder="Subjetivo, objetivo, análisis y plan…" style={{ minHeight: 180 }} disabled={!canEdit} />
          </Field>
        </div>
      </FormSection>
      <FormSection id="presc" letter="C" title="Prescripción">
        <div style={{ display: "flex", flexDirection: "column", gap: 10 }}>
          {canEdit && <Btn variant="ghost" size="sm" icon="plus">Agregar medicamento</Btn>}
          {!canEdit && <div style={{ fontSize: 13, color: "var(--ink-3)", padding: "8px 2px" }}>Formulario firmado — solo lectura.</div>}
        </div>
      </FormSection>
      <div id="sec-firma"><SignBlock signed={signed} /></div>
    </FormShell>
  );
}

function PrescRow({ med, pauta }) {
  return (
    <div style={{ display: "flex", alignItems: "center", gap: 12, padding: "11px 13px", borderRadius: 11, background: "var(--field)", border: "1px solid var(--line)" }}>
      <span style={{ color: "var(--accent)", display: "flex" }}><Icon name="pill" size={18} /></span>
      <div style={{ flex: 1 }}>
        <div style={{ fontSize: 13.5, fontWeight: 700, color: "var(--ink)" }}>{med}</div>
        <div style={{ fontSize: 12, color: "var(--ink-3)" }}>{pauta}</div>
      </div>
    </div>
  );
}

Object.assign(window, { NewAtencionModal, FormEmergencia, FormEvolucion, FormShell, FormSection, SignBlock, TIPOS_ATENCION, FORMS_BY_TIPO });
