import { useState } from 'react'; import { Microscope, Plus, Search, Calendar, AlertCircle, Trash2, CheckCircle2, Save, X, Pencil } 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 type { Cultivo, Paciente, Cama, Internacion } from '@/types'; interface CultivosProps { cultivos: Cultivo[]; pacientes: Paciente[]; internaciones: Internacion[]; camas: Cama[]; onAgregarCultivo: (cultivo: Omit) => void; onActualizarCultivo?: (id: string, datos: Partial) => void; onEliminarCultivo: (id: string) => void; getPacienteById: (id: string) => Paciente | undefined; getCamaById: (id: string) => Cama | undefined; getInternacionActivaByPaciente: (pacienteId: string) => Internacion | undefined; } export function Cultivos({ cultivos, pacientes, internaciones, camas, onAgregarCultivo, onActualizarCultivo, onEliminarCultivo, getPacienteById, getCamaById, getInternacionActivaByPaciente, }: CultivosProps) { const [busqueda, setBusqueda] = useState(''); const [filtroEstado, setFiltroEstado] = useState<'todos' | 'NAF/Pendiente' | 'Parcial' | 'Positivo' | 'Negativo'>('todos'); const [dialogoNuevoAbierto, setDialogoNuevoAbierto] = useState(false); const [dialogoParcialAbierto, setDialogoParcialAbierto] = useState(false); const [dialogoDefinitivoAbierto, setDialogoDefinitivoAbierto] = useState(false); const [cultivoSeleccionado, setCultivoSeleccionado] = useState(null); const [pacienteSeleccionado, setPacienteSeleccionado] = useState(''); const [busquedaPaciente, setBusquedaPaciente] = useState(''); const [fechaToma, setFechaToma] = useState(new Date().toISOString().split('T')[0]); const [protocolo, setProtocolo] = useState(''); const [tipoMuestra, setTipoMuestra] = useState('HMCx2'); const [observaciones, setObservaciones] = useState(''); const [fechaResultado, setFechaResultado] = useState(new Date().toISOString().split('T')[0]); const [estadoResultado, setEstadoResultado] = useState('Positivo'); const [germen, setGermen] = useState(''); const [sensible, setSensible] = useState(''); const [resistente, setResistente] = useState(''); const resetFormularioNuevo = () => { setPacienteSeleccionado(''); setBusquedaPaciente(''); setFechaToma(new Date().toISOString().split('T')[0]); setProtocolo(''); setTipoMuestra('HMCx2'); setObservaciones(''); }; const pacientesFiltrados = pacientes.filter(p => { if (!busquedaPaciente) return true; const texto = `${p.apellido} ${p.nombre} ${p.dni}`.toLowerCase(); return texto.includes(busquedaPaciente.toLowerCase()); }); const resetFormularioResultado = () => { setFechaResultado(new Date().toISOString().split('T')[0]); setEstadoResultado('Positivo'); setGermen(''); setSensible(''); setResistente(''); setCultivoSeleccionado(null); }; const handleAgregar = () => { if (pacienteSeleccionado && fechaToma && tipoMuestra) { onAgregarCultivo({ pacienteId: pacienteSeleccionado, fechaToma, protocolo: protocolo || undefined, tipoMuestra, observaciones: observaciones || undefined, estado: 'NAF/Pendiente', }); resetFormularioNuevo(); setDialogoNuevoAbierto(false); } }; const handleParcial = () => { if (cultivoSeleccionado && onActualizarCultivo && germen) { onActualizarCultivo(cultivoSeleccionado.id, { estado: 'Parcial', germen: germen || undefined, sensible: sensible || undefined, resistente: resistente || undefined, }); resetFormularioResultado(); setDialogoParcialAbierto(false); } }; const handleDefinitivo = () => { if (cultivoSeleccionado && onActualizarCultivo) { onActualizarCultivo(cultivoSeleccionado.id, { fechaResultado, estado: estadoResultado, germen: germen || undefined, sensible: sensible || undefined, resistente: resistente || undefined, }); resetFormularioResultado(); setDialogoDefinitivoAbierto(false); } }; const abrirParcial = (cultivo: Cultivo) => { setCultivoSeleccionado(cultivo); setGermen(cultivo.germen || ''); setSensible(cultivo.sensible || ''); setResistente(cultivo.resistente || ''); setDialogoParcialAbierto(true); }; const abrirDefinitivo = (cultivo: Cultivo) => { setCultivoSeleccionado(cultivo); setFechaResultado(cultivo.fechaResultado || new Date().toISOString().split('T')[0]); setEstadoResultado(cultivo.estado === 'Parcial' || cultivo.estado === 'Positivo' ? 'Positivo' : cultivo.estado); setGermen(cultivo.germen || ''); setSensible(cultivo.sensible || ''); setResistente(cultivo.resistente || ''); setDialogoDefinitivoAbierto(true); }; const getEstadoColor = (estado: Cultivo['estado']) => { switch (estado) { case 'NAF/Pendiente': return 'bg-amber-100 text-amber-800'; case 'Parcial': return 'bg-orange-100 text-orange-800'; case 'Positivo': return 'bg-red-100 text-red-800'; case 'Negativo': return 'bg-green-100 text-green-800'; } }; const getEstadoLabel = (estado: Cultivo['estado']) => { switch (estado) { case 'NAF/Pendiente': return 'NAF/Pendiente'; case 'Parcial': return 'Parcial'; case 'Positivo': return 'Positivo'; case 'Negativo': return 'Negativo Final'; } }; const getNumeroCama = (pacienteId: string): string | null => { const internacion = getInternacionActivaByPaciente(pacienteId); if (!internacion) return null; const cama = getCamaById(internacion.camaId); return cama ? cama.numero : null; }; const cultivosFiltrados = cultivos.filter(c => { const paciente = getPacienteById(c.pacienteId); const textoBusqueda = paciente ? `${paciente.apellido} ${paciente.nombre} ${paciente.dni}`.toLowerCase() : ''; const coincideBusqueda = !busqueda || textoBusqueda.includes(busqueda.toLowerCase()); const coincideEstado = filtroEstado === 'todos' || c.estado === filtroEstado; return coincideBusqueda && coincideEstado; }).sort((a, b) => new Date(b.fechaToma).getTime() - new Date(a.fechaToma).getTime()); return (

Cultivos

Gestión de cultivos microbiológicos y antibiogramas

Nuevo Cultivo
{!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}` : ''; })()}
)}
setFechaToma(e.target.value)} />
setProtocolo(e.target.value)} placeholder="N° Protocolo" />