import { useState } from 'react'; import { Bed, CheckCircle2, Clock, Wrench, User, Plus, Trash, Edit2, Save, X } from 'lucide-react'; import { Card, CardContent } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { formatDateDDMMYYYY } from '@/lib/utils'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Label } from '@/components/ui/label'; import { Input } from '@/components/ui/input'; import type { Cama, Paciente, Internacion, Area } from '@/types'; interface MapaCamasProps { camas: Cama[]; areas: Area[]; pacientes: Paciente[]; internaciones: Internacion[]; onActualizarCama: (id: string, datos: Partial) => void; onAgregarCama: (cama: Omit) => string; onEliminarCama: (id: string) => void; onIniciarInternacion: (internacion: Omit) => void; onAgregarArea: (area: Omit) => string; onActualizarArea: (id: string, datos: Partial) => void; onEliminarArea: (id: string) => void; getPacienteById: (id: string) => Paciente | undefined; getInternacionById: (id: string) => Internacion | undefined; } export function MapaCamas({ camas, areas, pacientes, internaciones, onActualizarCama, onAgregarCama, onEliminarCama, onIniciarInternacion, onAgregarArea, onActualizarArea, onEliminarArea, getPacienteById, getInternacionById }: MapaCamasProps) { const [filtroSala, setFiltroSala] = useState('todas'); const [filtroTipo, setFiltroTipo] = useState('todos'); const [filtroEstado, setFiltroEstado] = useState('todos'); const [camaSeleccionada, setCamaSeleccionada] = useState(null); const [pacienteSeleccionado, setPacienteSeleccionado] = useState(''); const [diagnostico, setDiagnostico] = useState(''); const [enfermedadActual, setEnfermedadActual] = useState(''); const [antecedentesEnfermedadActual, setAntecedentesEnfermedadActual] = useState(''); const [medico, setMedico] = useState(''); const [dialogoAbierto, setDialogoAbierto] = useState(false); // Area dialog state const [areaDialogOpen, setAreaDialogOpen] = useState(false); const [areaNombre, setAreaNombre] = useState(''); const [editingAreaId, setEditingAreaId] = useState(null); // Cama dialog state const [bedDialogOpen, setBedDialogOpen] = useState(false); const [editingBed, setEditingBed] = useState(null); const [bedNumero, setBedNumero] = useState(''); const [bedTipo, setBedTipo] = useState('General'); const [bedAreaId, setBedAreaId] = useState(undefined); const salas = Array.from(new Set(camas.map(c => c.areaId).filter(Boolean))) as string[]; const areaById = Object.fromEntries(areas.map(a => [a.id, a.nombre])); const tipos = Array.from(new Set(camas.map(c => c.tipo))); const camasFiltradas = camas.filter(cama => { if (filtroSala !== 'todas' && cama.areaId !== filtroSala) return false; if (filtroTipo !== 'todos' && cama.tipo !== filtroTipo) return false; if (filtroEstado !== 'todos' && cama.estado !== filtroEstado) return false; return true; }); const getEstadoColor = (cama: Cama) => { if (cama.estado === 'Disponible') { return 'bg-green-100 border-green-300 text-green-800'; } if (cama.estado === 'Reservada') { return 'bg-orange-100 border-orange-300 text-orange-800'; } if (cama.estado === 'Ocupada') { // Tipos de aislamiento const aislamientos = ['Aislamiento KPC', 'Aislamiento COVID', 'Aislamiento Clostridium', 'Aislamiento Neutropenico']; if (aislamientos.includes(cama.tipo)) { return 'bg-red-100 border-red-300 text-red-800'; } return 'bg-blue-100 border-blue-300 text-blue-800'; } return 'bg-amber-100 border-amber-300 text-amber-800'; }; const getEstadoIcono = (cama: Cama) => { switch (cama.estado) { case 'Disponible': return ; case 'Ocupada': return ; case 'Reparacion': return ; case 'Reservada': return ; } }; const parseBedNumber = (numero: string) => { const match = numero.match(/^(\d{3})-(\d+)$/); if (!match) return { sala: 0, cama: 0 }; return { sala: parseInt(match[1]), cama: parseInt(match[2]) }; }; const sortedCamas = [...camasFiltradas].sort((a, b) => { const pa = parseBedNumber(a.numero); const pb = parseBedNumber(b.numero); if (pa.sala >= 200 && pa.sala < 300) { const salaImpar = [221, 217, 215, 213, 209, 205, 203, 201]; const salaPar = [204, 214]; if (salaImpar.includes(pa.sala)) { if (salaImpar.includes(pb.sala)) { if (pa.sala === pb.sala) { return pa.cama - pb.cama; } return salaImpar.indexOf(pa.sala) - salaImpar.indexOf(pb.sala); } return -1; } if (salaImpar.includes(pb.sala)) return 1; if (salaPar.includes(pa.sala)) { if (salaPar.includes(pb.sala)) { if (pa.sala === pb.sala) { return pa.cama - pb.cama; } return pa.sala - pb.sala; } return -1; } if (salaPar.includes(pb.sala)) return 1; return pa.cama - pb.cama; } if (pa.sala >= 300 && pa.sala < 400) { const salaPiso3 = [308, 310, 312]; if (salaPiso3.includes(pa.sala)) { if (salaPiso3.includes(pb.sala)) { if (pa.sala === pb.sala) { return pa.cama - pb.cama; } return salaPiso3.indexOf(pa.sala) - salaPiso3.indexOf(pb.sala); } return -1; } if (salaPiso3.includes(pb.sala)) return 1; return pa.cama - pb.cama; } return a.numero.localeCompare(b.numero); }); const handleOcuparCama = () => { if (camaSeleccionada && pacienteSeleccionado && diagnostico && enfermedadActual && medico) { onIniciarInternacion({ pacienteId: pacienteSeleccionado, camaId: camaSeleccionada.id, diagnosticoIngreso: diagnostico, enfermedadActual, antecedentesEnfermedadActual: antecedentesEnfermedadActual || undefined, medicoIngresante: medico, }); setDialogoAbierto(false); setCamaSeleccionada(null); setPacienteSeleccionado(''); setDiagnostico(''); setEnfermedadActual(''); setAntecedentesEnfermedadActual(''); setMedico(''); } }; const handleCambiarEstado = (cama: Cama, nuevoEstado: Cama['estado']) => { onActualizarCama(cama.id, { estado: nuevoEstado }); }; const pacientesSinInternar = pacientes.filter(p => { const internacionActiva = internaciones.find(i => i.pacienteId === p.id && i.activa); return !internacionActiva; }); return (
{/* Header */}

Mapa de Camas

Gestión de camas del servicio

{camas.filter(c => c.estado === 'Disponible').length} Disponibles {camas.filter(c => c.estado === 'Ocupada').length} Ocupadas
{/* Filtros */}
{/* Mapa de Camas */}
{sortedCamas.map((cama) => { const paciente = cama.pacienteId ? getPacienteById(cama.pacienteId) : null; const internacion = cama.internacionId ? getInternacionById(cama.internacionId) : null; return ( setCamaSeleccionada(cama)} >
{getEstadoIcono(cama)}

{cama.numero}

{cama.areaId ? areaById[cama.areaId] ?? 'Área desconocida' : 'Sin área'}

{cama.tipo} {cama.estado === 'Ocupada' && paciente && (

{paciente.apellido}, {paciente.nombre}

)}
Cama {cama.numero} - {cama.areaId ? areaById[cama.areaId] ?? 'Área desconocida' : 'Sin área'}
{cama.estado} {cama.tipo}
{cama.estado === 'Ocupada' && paciente && internacion && (

Paciente:

{paciente.apellido}, {paciente.nombre}

DNI: {paciente.dni}

Ingreso: {formatDateDDMMYYYY(internacion.fechaIngreso)}

Diagnóstico: {internacion.diagnosticoIngreso}

Médico: {internacion.medicoIngresante}

)}

Acciones:

{cama.estado === 'Disponible' && ( Nueva Internación - Cama {cama.numero}