import { useState } from 'react'; import { Activity, Plus, Search, Calendar, Clock } from 'lucide-react'; import { Card, CardContent } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog'; import type { AcidoBase, Paciente } from '@/types'; interface AcidoBaseProps { acidosBase: AcidoBase[]; pacientes: Paciente[]; onAgregarAcidoBase: (acidoBase: Omit) => void; onEliminarAcidoBase: (id: string) => void; getPacienteById: (id: string) => Paciente | undefined; } const REFERENCIAS = { ph: { min: 7.35, max: 7.45, unidad: '' }, pco2: { min: 35, max: 45, unidad: 'mmHg' }, po2: { min: 80, max: 100, unidad: 'mmHg' }, hco3: { min: 22, max: 26, unidad: 'mEq/L' }, be: { min: -2, max: 2, unidad: 'mEq/L' }, sato2: { min: 95, max: 100, unidad: '%' }, lactato: { min: 0.5, max: 2.2, unidad: 'mmol/L' }, }; export function AcidoBaseSection({ acidosBase, pacientes, onAgregarAcidoBase, onEliminarAcidoBase, getPacienteById, }: AcidoBaseProps) { const [busqueda, setBusqueda] = useState(''); const [dialogoAbierto, setDialogoAbierto] = useState(false); // Formulario const [pacienteSeleccionado, setPacienteSeleccionado] = useState(''); const [busquedaPaciente, setBusquedaPaciente] = useState(''); const [fecha, setFecha] = useState(new Date().toISOString().split('T')[0]); const [hora, setHora] = useState(new Date().toTimeString().slice(0, 5)); const [ph, setPh] = useState(''); const [pco2, setPco2] = useState(''); const [po2, setPo2] = useState(''); const [hco3, setHco3] = useState(''); const [be, setBe] = useState(''); const [sato2, setSato2] = useState(''); const [lactato, setLactato] = useState(''); const [interpretacion, setInterpretacion] = useState(''); const resetFormulario = () => { setPacienteSeleccionado(''); setBusquedaPaciente(''); setFecha(new Date().toISOString().split('T')[0]); setHora(new Date().toTimeString().slice(0, 5)); setPh(''); setPco2(''); setPo2(''); setHco3(''); setBe(''); setSato2(''); setLactato(''); setInterpretacion(''); }; const getEstadoParametro = (parametro: keyof typeof REFERENCIAS, valor: number) => { const ref = REFERENCIAS[parametro]; if (valor < ref.min) return { estado: 'Bajo', color: 'text-blue-600' }; if (valor > ref.max) return { estado: 'Alto', color: 'text-red-600' }; return { estado: 'Normal', color: 'text-green-600' }; }; const pacientesFiltrados = pacientes.filter(p => { if (!busquedaPaciente) return true; const texto = `${p.apellido} ${p.nombre} ${p.dni}`.toLowerCase(); return texto.includes(busquedaPaciente.toLowerCase()); }); const interpretarGasometria = () => { const phVal = parseFloat(ph); const pco2Val = parseFloat(pco2); const hco3Val = parseFloat(hco3); const beVal = parseFloat(be); if (!phVal || !pco2Val || !hco3Val) return ''; let interpretacion = ''; // Determinar acidosis o alcalosis if (phVal < 7.35) { interpretacion += 'Acidemia - '; if (pco2Val > 45) interpretacion += 'Acidosis Respiratoria'; else if (hco3Val < 22) interpretacion += 'Acidosis Metabólica'; else interpretacion += 'Acidosis Mixta'; } else if (phVal > 7.45) { interpretacion += 'Alcalemia - '; if (pco2Val < 35) interpretacion += 'Alcalosis Respiratoria'; else if (hco3Val > 26) interpretacion += 'Alcalosis Metabólica'; else interpretacion += 'Alcalosis Mixta'; } else { interpretacion += 'pH Normal - '; if (pco2Val > 45 || hco3Val < 22) interpretacion += 'Compensación en curso'; else interpretacion += 'Equilibrio Ácido-Base'; } // Agregar información sobre compensación if (beVal && Math.abs(beVal) > 2) { interpretacion += beVal > 0 ? ' (Exceso de bases elevado)' : ' (Déficit de bases)'; } return interpretacion; }; const handleGuardar = () => { if (!pacienteSeleccionado || !ph || !pco2 || !po2 || !hco3 || !be || !sato2) return; const interpretacionAuto = interpretarGasometria(); onAgregarAcidoBase({ pacienteId: pacienteSeleccionado, fecha, hora, ph: parseFloat(ph), pco2: parseFloat(pco2), po2: parseFloat(po2), hco3: parseFloat(hco3), be: parseFloat(be), sato2: parseFloat(sato2), lactato: lactato ? parseFloat(lactato) : undefined, interpretacion: interpretacion || interpretacionAuto, }); resetFormulario(); setDialogoAbierto(false); }; const acidosBaseFiltrados = acidosBase .filter(ab => { const paciente = getPacienteById(ab.pacienteId); if (!paciente) return false; return !busqueda || paciente.nombre.toLowerCase().includes(busqueda.toLowerCase()) || paciente.apellido.toLowerCase().includes(busqueda.toLowerCase()) || paciente.dni.includes(busqueda); }) .sort((a, b) => new Date(b.fecha + 'T' + b.hora).getTime() - new Date(a.fecha + 'T' + a.hora).getTime()); const getColorPh = (ph: number) => { if (ph < 7.2 || ph > 7.6) return 'bg-red-100 text-red-800'; if (ph < 7.35 || ph > 7.45) return 'bg-amber-100 text-amber-800'; return 'bg-green-100 text-green-800'; }; return (
{/* Header */}

Estados Ácido-Base

Gasometrías y análisis de equilibrio ácido-base

Nueva Gasometría Arterial
{!pacienteSeleccionado ? (
setBusquedaPaciente(e.target.value)} placeholder="Ingrese apellido, nombre o DNI..." autoFocus /> {busquedaPaciente && (
{pacientesFiltrados.length === 0 ? (

No se encontraron pacientes

) : ( pacientesFiltrados.map(p => ( )) )}
)}
) : (
{(() => { const p = pacientes.find(x => x.id === pacienteSeleccionado); return p ? `${p.apellido}, ${p.nombre} - DNI: ${p.dni}` : ''; })()}
)}
setFecha(e.target.value)} />
setHora(e.target.value)} />
setPh(e.target.value)} placeholder="7.40" />
setPco2(e.target.value)} placeholder="40" />
setPo2(e.target.value)} placeholder="85" />
setHco3(e.target.value)} placeholder="24" />
setBe(e.target.value)} placeholder="0" />
setSato2(e.target.value)} placeholder="97" />
setLactato(e.target.value)} placeholder="1.0" />
{ph && pco2 && hco3 && (

Interpretación automática: {interpretarGasometria()}

)}