import { useState } from 'react'; import { ArrowLeft, Save, X, Bed, Calendar, Stethoscope, User, Loader2 } from 'lucide-react'; import { Card, CardContent } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Badge } from '@/components/ui/badge'; import { toast } from 'sonner'; import type { Paciente, Cama, Grupo, Internacion } from '@/types'; import { getNombreProfesional, computeSector, sortCamas } from '@/lib/utils'; import { useHospitalStore } from '@/hooks/useHospitalStore'; interface NuevoIngresoProps { pacientes: Paciente[]; camas: Cama[]; grupos: Grupo[]; onIniciarInternacion: (internacion: Omit) => Promise; onAgregarCama?: (cama: Omit) => Promise; onAgregarPaciente?: (paciente: Omit) => void; onActualizarPaciente?: (id: string, datos: Partial) => void; onVolver: () => void; getGrupoName: (grupoId: string | undefined) => string; internaciones: Internacion[]; } export function NuevoIngreso({ pacientes, camas, grupos, onIniciarInternacion, onAgregarCama, onVolver, getGrupoName, internaciones }: NuevoIngresoProps) { const { currentUser } = useHospitalStore(); const [pacienteSeleccionado, setPacienteSeleccionado] = useState(''); const [busqueda, setBusqueda] = useState(''); const [camaSeleccionada, setCamaSeleccionada] = useState(''); const [camaInput, setCamaInput] = useState(''); const [modoCama, setModoCama] = useState<'seleccionar' | 'escribir'>('seleccionar'); const effectiveMedico = getNombreProfesional(currentUser); const [fechaIngresoHospital, setFechaIngresoHospital] = useState(''); const [fechaIngresoClinica, setFechaIngresoClinica] = useState(''); const [motivoConsulta, setMotivoConsulta] = useState(''); const [diagnosticoIngreso, setDiagnosticoIngreso] = useState(''); const [enfermedadActual, setEnfermedadActual] = useState(''); const [antecedentesEnfermedadActual, setAntecedentesEnfermedadActual] = useState(''); const [apache, setApache] = useState(''); const [derivacion, setDerivacion] = useState(''); const [grupoSeleccionado, setGrupoSeleccionado] = useState(''); const [isSubmitting, setIsSubmitting] = useState(false); const resetFormulario = () => { setPacienteSeleccionado(''); setBusqueda(''); setCamaSeleccionada(''); setCamaInput(''); setGrupoSeleccionado(''); setFechaIngresoHospital(''); setFechaIngresoClinica(''); setMotivoConsulta(''); setDiagnosticoIngreso(''); setEnfermedadActual(''); setAntecedentesEnfermedadActual(''); setApache(''); setDerivacion(''); }; const pacientesSinInternar = pacientes.filter(p => { const internacionActiva = internaciones.find(i => i.pacienteId === p.id && i.activa); return !internacionActiva; }); const sortedCamas = sortCamas(camas); const handleSubmit = async () => { // Validaciones explícitas con feedback claro if (!pacienteSeleccionado) { toast.error('Debe seleccionar un paciente de la lista'); return; } if (modoCama === 'seleccionar' && !camaSeleccionada) { toast.error('Debe seleccionar una cama para el paciente'); return; } if (modoCama === 'escribir' && !camaInput.trim()) { toast.error('Debe ingresar el número de cama'); return; } if (!grupoSeleccionado) { toast.error('Debe seleccionar un grupo para el seguimiento'); return; } if (!diagnosticoIngreso.trim()) { toast.error('Debe completar el Diagnóstico de Ingreso'); return; } if (!enfermedadActual.trim()) { toast.error('Debe completar la Enfermedad Actual'); return; } if (!effectiveMedico.trim()) { toast.error('Debe ingresar el nombre del Médico Ingresante'); return; } setIsSubmitting(true); try { let camaId = ''; if (modoCama === 'escribir') { const numeroCama = camaInput.trim(); const camaExistente = camas.find(c => c.numero === numeroCama); if (camaExistente) { toast.error(`La cama ${numeroCama} ya existe en el sistema. Seleccione la cama del listado o ingrese un número diferente.`); setIsSubmitting(false); return; } else if (onAgregarCama) { camaId = await onAgregarCama({ numero: numeroCama, grupoId: grupoSeleccionado, tipo: 'General', estado: 'Ocupada', sector: computeSector(numeroCama) }); } else { toast.error('No se puede crear la cama'); setIsSubmitting(false); return; } } else { const camaElegida = sortedCamas.find(c => c.id === camaSeleccionada); if (!camaElegida) { toast.error('Cama no encontrada'); setIsSubmitting(false); return; } camaId = camaSeleccionada; } await onIniciarInternacion({ pacienteId: pacienteSeleccionado, camaId: camaId, grupoId: grupoSeleccionado, medicoIngresante: effectiveMedico.trim(), diagnosticoIngreso: diagnosticoIngreso.trim(), motivoConsulta: motivoConsulta.trim() || undefined, enfermedadActual: enfermedadActual.trim(), antecedentesEnfermedadActual: antecedentesEnfermedadActual.trim() || undefined, fechaIngresoHospital: fechaIngresoHospital || undefined, fechaIngresoClinica: fechaIngresoClinica || undefined, apache: apache.trim() || undefined, derivacion: derivacion.trim() || undefined, }); toast.success('Ingreso registrado con éxito'); resetFormulario(); onVolver(); } catch (err) { console.error('Error al guardar ingreso:', err); toast.error('Ocurrió un error al guardar el ingreso'); } finally { setIsSubmitting(false); } }; const selectedPaciente = pacientes.find(p => p.id === pacienteSeleccionado); return (

Nuevo Ingreso

Formulario de internación

{/* Columna 1: Datos del Paciente */}

Datos del Paciente

{!pacienteSeleccionado ? ( <> setBusqueda(e.target.value)} />
{(() => { const q = busqueda.trim().toLowerCase(); if (!q) { return
Escriba para buscar
; } const matches = pacientesSinInternar.filter(p => p.apellido.toLowerCase().includes(q) || p.nombre.toLowerCase().includes(q) || p.dni.includes(q) ); if (matches.length === 0) { return
Sin resultados
; } return matches.map(p => ( )); })()}
) : (
{selectedPaciente?.apellido}, {selectedPaciente?.nombre} DNI: {selectedPaciente?.dni}
)}
{/* Columna 2: Cama y Grupo */}

Asignación de Cama y Grupo

{modoCama === 'escribir' && (
)} {modoCama === 'seleccionar' ? ( <>
) : (
setCamaInput(e.target.value)} />

{camaInput.trim() ? `Clasificación: ${computeSector(camaInput.trim())}` : 'Formato XXX-YY (Salas 3XX impares y 4XX son Fuera de Área)'}

)}

Datos de Ingreso

setFechaIngresoHospital(e.target.value)} />
setFechaIngresoClinica(e.target.value)} />
setDerivacion(e.target.value)} />
setApache(e.target.value)} />

Datos Clínicos