import { useState } from 'react'; import { PDFDocument } from 'pdf-lib'; import { FlaskConical, Activity, Microscope, Plus, Calendar, Clock, AlertCircle, CheckCircle2, ArrowLeft, Pencil, Trash2, FileText, ChevronDown, ChevronUp, ChevronRight, FileDown, Thermometer, Heart, Wind, Droplets, Save } 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 { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; import type { Laboratorio, AcidoBase, Cultivo, Paciente, ResultadoLaboratorio, Internacion, Evolucion, Cama } from '@/types'; import { formatDateDDMMYYYY } from '@/lib/utils'; interface HistoriaClinicaProps { internacion: Internacion; paciente: Paciente; cama?: Cama; allCamas?: Cama[]; evoluciones: Evolucion[]; laboratorios: Laboratorio[]; acidosBase: AcidoBase[]; cultivos: Cultivo[]; onAgregarEvolucion: (evolucion: Omit) => void; onActualizarEvolucion: (id: string, datos: Partial) => void; onEliminarEvolucion: (id: string) => void; onAgregarLaboratorio: (laboratorios: Omit) => void; onActualizarLaboratorio: (id: string, datos: Partial) => void; onEliminarLaboratorio: (id: string) => void; onAgregarAcidoBase: (acidoBase: Omit) => void; onEliminarAcidoBase: (id: string) => void; onAgregarCultivo: (cultivo: Omit) => void; onActualizarCultivo: (id: string, datos: Partial) => void; onEliminarCultivo: (id: string) => void; onActualizarInternacion: (id: string, datos: Partial) => void; onActualizarCama: (id: string, datos: Partial) => void; onVolver: () => void; } const PARAMETROS_COMUNES: Record = { 'Hemoglobina': { unidad: 'g/dL', referencia: '12-14' }, 'Hematocrito': { unidad: '%', referencia: '36-42' }, 'Glóbulos Blancos': { unidad: 'cel/μL', referencia: '4000-11000' }, 'Plaquetas': { unidad: 'unidades/μL', referencia: '150000-400000' }, 'Glucosa': { unidad: 'mg/dL', referencia: '70-100' }, 'Urea': { unidad: 'mg/dL', referencia: '17-48.5' }, 'Creatinina': { unidad: 'mg/dL', referencia: '0.5-1' }, 'Sodio': { unidad: 'mEq/L', referencia: '135-145' }, 'Potasio': { unidad: 'mEq/L', referencia: '3.5-5.1' }, 'Cloro': { unidad: 'mEq/L', referencia: '101-109' }, 'Bilirrubina Total': { unidad: 'mg/dL', referencia: '0-1.2' }, 'Bilirrubina Directa': { unidad: 'mg/dL', referencia: '0-0.3' }, 'TGO/AST': { unidad: 'U/L', referencia: '0-35' }, 'TGP/ALT': { unidad: 'U/L', referencia: '0-35' }, 'TP': { unidad: '%', referencia: '70-100' }, 'KPTT': { unidad: 'seg', referencia: '30-45' }, 'RIN': { unidad: '', referencia: '0.8-1.5' }, }; const RANGOS_LABORATORIO: Record = { 'Hematocrito': { min: 36, max: 42 }, 'Hemoglobina': { min: 12, max: 14 }, 'Leucocitos': { min: 4000, max: 11000 }, 'Plaquetas': { min: 150000, max: 400000 }, 'Glucemia': { min: 70, max: 100 }, 'Urea': { min: 17, max: 48.5 }, 'Creatinina': { min: 0.5, max: 1.2 }, 'Sodio': { min: 135, max: 145 }, 'Potasio': { min: 3.5, max: 5.1 }, 'Cloro': { min: 101, max: 109 }, 'Bilirrubina Total': { min: 0.1, max: 1.2 }, 'Bilirrubina Directa': { min: 0, max: 0.3 }, 'GOT': { min: 0, max: 35 }, 'GPT': { min: 0, max: 35 }, 'Tiempo de Protrombina': { min: 12, max: 14 }, 'KPTT': { min: 30, max: 45 }, 'INR': { min: 0.8, max: 1.5 }, }; function calcularEstadoLaboratorio(parametro: string, valor: string): 'Normal' | 'Alto' | 'Bajo' { const rango = RANGOS_LABORATORIO[parametro]; if (!rango) return 'Normal'; const num = parseFloat(valor); if (isNaN(num)) return 'Normal'; if (num < rango.min) return 'Bajo'; if (num > rango.max) return 'Alto'; return 'Normal'; } export function HistoriaClinica({ internacion, paciente, cama, allCamas, evoluciones, laboratorios, acidosBase, cultivos, onAgregarEvolucion, onActualizarEvolucion, onEliminarEvolucion, onAgregarLaboratorio, onActualizarLaboratorio, onEliminarLaboratorio, onAgregarAcidoBase, onEliminarAcidoBase, onAgregarCultivo, onActualizarCultivo, onEliminarCultivo, onActualizarInternacion, onActualizarCama, onVolver, }: HistoriaClinicaProps) { const [tabActivo, setTabActivo] = useState('evoluciones'); const [detalleExpandido, setDetalleExpandido] = useState(false); const [editIngresoDialog, setEditIngresoDialog] = useState(false); const [editFechaIngreso, setEditFechaIngreso] = useState(internacion.fechaIngreso); const [editMotivoConsulta, setEditMotivoConsulta] = useState(internacion.motivoConsulta || ''); const [editDiagnostico, setEditDiagnostico] = useState(internacion.diagnosticoIngreso || ''); const [editEnfermedadActual, setEditEnfermedadActual] = useState(internacion.enfermedadActual || ''); const [editAntecedentes, setEditAntecedentes] = useState(internacion.antecedentesEnfermedadActual || ''); const [editMedico, setEditMedico] = useState(internacion.medicoIngresante || ''); const [editCamaId, setEditCamaId] = useState(internacion.camaId || ''); const calcularEdad = (fechaNacimiento: string) => { const hoy = new Date(); const nac = new Date(fechaNacimiento); let edad = hoy.getFullYear() - nac.getFullYear(); const mes = hoy.getMonth() - nac.getMonth(); if (mes < 0 || (mes === 0 && hoy.getDate() < nac.getDate())) { edad--; } return edad; }; const calcularDiasInternado = (fechaIngreso: string) => { const hoy = new Date(); const ingreso = new Date(fechaIngreso); const diff = hoy.getTime() - ingreso.getTime(); return Math.floor(diff / (1000 * 60 * 60 * 24)); }; const handleGuardarEdicion = () => { if (editCamaId && editCamaId !== internacion.camaId && cama) { onActualizarCama(cama.id, { estado: 'Disponible', pacienteId: undefined, internacionId: undefined }); } if (editCamaId) { onActualizarCama(editCamaId, { estado: 'Ocupada', pacienteId: paciente.id, internacionId: internacion.id }); } onActualizarInternacion(internacion.id, { fechaIngreso: editFechaIngreso, motivoConsulta: editMotivoConsulta, diagnosticoIngreso: editDiagnostico, enfermedadActual: editEnfermedadActual, antecedentesEnfermedadActual: editAntecedentes, medicoIngresante: editMedico, camaId: editCamaId || undefined, }); setEditIngresoDialog(false); }; return (

Historia Clínica

Cama: {cama?.numero || 'N/A'} | {paciente.apellido}, {paciente.nombre} | {paciente.fechaNacimiento ? calcularEdad(paciente.fechaNacimiento) + ' años' : ''} | DNI: {paciente.dni}

Editar Ingreso
setEditFechaIngreso(e.target.value)} />
setEditMedico(e.target.value)} placeholder="Nombre del médico" />