import { useHospitalStore } from '@/hooks/useHospitalStore';
import { Layout } from '@/sections/Layout';
import { toast } from 'sonner';
import { Dashboard } from '@/sections/Dashboard';
import { MapaCamas } from '@/sections/MapaCamas';
import { Pacientes } from '@/sections/Pacientes';
import { Internaciones } from '@/sections/Internaciones';
import { Evoluciones } from '@/sections/Evoluciones';
import { AcidoBaseSection } from '@/sections/AcidoBase';
import { Cultivos } from '@/sections/Cultivos';
import { HistoriaClinica } from '@/sections/HistoriaClinica';
import { NuevoIngreso } from '@/sections/NuevoIngreso';
import { EditIngreso } from '@/sections/EditIngreso';
import { Login } from '@/sections/Login';
import { GestionUsuarios } from '@/sections/GestionUsuarios';
import { PendientesSala } from '@/sections/PendientesSala';
import { SeccionSistema } from '@/sections/SeccionSistema';
import { Spinner } from '@/components/ui/spinner';
import { Button } from '@/components/ui/button';
import { ThemeProvider } from "@/components/theme-provider";
import { Toaster } from '@/components/ui/sonner';
import type { Indicacion, MovimientoIndicacion } from '@/types';

function AppContent() {
  const store = useHospitalStore();

  if (!store.isLoaded) {
    return (
      <div className="min-h-screen flex items-center justify-center">
        <Spinner className="h-8 w-8" />
      </div>
    );
  }

  if (!store.isAuthenticated) {
    return <Login />;
  }

  const renderVista = () => {
    switch (store.vistaActual) {
      case 'dashboard':
        return (
          <Dashboard
            estadisticas={store.getEstadisticas()}
            internaciones={store.internaciones}
            cultivos={store.cultivos}
            onCambiarVista={store.setVista}
            getPacienteById={store.getPacienteById}
          />
        );
      case 'camas':
        return (
          <MapaCamas
            camas={store.camas}
            grupos={store.grupos}
            pacientes={store.pacientes}
            internaciones={store.internaciones}
            onActualizarCama={store.actualizarCama}
            onAgregarCama={store.agregarCama}
            onEliminarCama={store.eliminarCama}
            onIniciarInternacion={store.iniciarInternacion}
            getPacienteById={store.getPacienteById}
            getInternacionById={store.getInternacionById}
            onAgregarGrupo={store.agregarGrupo}
            onActualizarGrupo={store.actualizarGrupo}
            onEliminarGrupo={store.eliminarGrupo}
          />
        );
      case 'pacientes':
        return (
          <Pacientes
            pacientes={store.pacientes}
            internaciones={store.internaciones}
            onAgregar={store.agregarPaciente}
            onActualizar={store.actualizarPaciente}
            onEliminar={store.eliminarPaciente}
          />
        );
      case 'internaciones':
        return (
          <Internaciones
            internaciones={store.internaciones}
            pacientes={store.pacientes}
            camas={store.camas}
            grupos={store.grupos}
            evoluciones={store.evoluciones}
            laboratorios={store.laboratorios}
            cultivos={store.cultivos}
            onIniciarInternacion={store.iniciarInternacion}
            onFinalizarInternacion={store.finalizarInternacion}
            onEliminarInternacion={store.eliminarInternacion}
            getPacienteById={store.getPacienteById}
            getCamaById={store.getCamaById}
            onVerHC={(id) => { store.setCurrentInternacion(id); store.setVista('historiaclinica'); }}
            onNuevoIngreso={() => store.setVista('nuevoingreso')}
            onVerPendientesDeSala={() => store.setVista('pendientessala')}
          />
        );
      case 'pendientessala':
        return (
          <PendientesSala
            pendientes={store.pendientes}
            internaciones={store.internaciones}
            pacientes={store.pacientes}
            camas={store.camas}
            onActualizarPendiente={store.actualizarPendiente}
            onEliminarPendiente={store.eliminarPendiente}
            onVerHC={(id) => { store.setCurrentInternacion(id); store.setVista('historiaclinica'); }}
            onVolver={() => store.setVista('internaciones')}
            getPacienteById={store.getPacienteById}
            getCamaById={store.getCamaById}
          />
        );
      case 'evoluciones':
        return (
          <Evoluciones
            evoluciones={store.evoluciones}
            internaciones={store.internaciones}
            pacientes={store.pacientes}
            camas={store.camas}
            getCamaById={store.getCamaById}
            onAgregarEvolucion={store.agregarEvolucion}
            onActualizarEvolucion={store.actualizarEvolucion}
            onEliminarEvolucion={store.eliminarEvolucion}
            getPacienteById={store.getPacienteById}
            getInternacionActivaByPaciente={store.getInternacionActivaByPaciente}
          />
        );
      case 'acidobase':
        return (
          <AcidoBaseSection
            acidosBase={store.acidosBase}
            pacientes={store.pacientes}
            onAgregarAcidoBase={store.agregarAcidoBase}
            onEliminarAcidoBase={store.eliminarAcidoBase}
            getPacienteById={store.getPacienteById}
          />
        );
      case 'cultivos':
        return (
          <Cultivos
            cultivos={store.cultivos}
            pacientes={store.pacientes}
            internaciones={store.internaciones}
            camas={store.camas}
            getPacienteById={store.getPacienteById}
            getInternacionActivaByPaciente={store.getInternacionActivaByPaciente}
            canEdit={false}
          />
        );
      case 'historiaclinica': {
        const internacionId = store.currentInternacionId || sessionStorage.getItem('hospital_current_internacion_id') || '';
        const internacion = store.getInternacionById(internacionId);
        const paciente = internacion
          ? (store.getPacienteById(internacion.pacienteId) || store.pacientes.find(p => p.id === internacion.pacienteId || p.dni === internacion.pacienteId) || {
              id: internacion.pacienteId || 'paciente-unknown',
              apellido: 'Paciente',
              nombre: 'Sin registrar',
              dni: internacion.pacienteId || 'N/A',
              fechaNacimiento: '1990-01-01',
              sexo: 'Otro' as const,
              fechaRegistro: new Date().toISOString()
            })
          : undefined;

        if (!internacion) {
          if (!store.isLoaded) {
            return (
              <div className="p-8 text-center text-gray-500">
                <p>Cargando información de la internación...</p>
              </div>
            );
          }
          return (
            <div className="p-4 text-center space-y-4">
              <p className="text-gray-500 dark:text-gray-400">Internación no encontrada (id: {internacionId})</p>
              <Button onClick={() => store.setVista('internaciones')}>Volver a Internaciones</Button>
            </div>
          );
        }
        return (
          <HistoriaClinica
            internacion={internacion}
            paciente={paciente}
            cama={store.getCamaById(internacion.camaId)}
            allCamas={store.camas}
            evoluciones={store.getEvolucionesByInternacion(internacion.id)}
            laboratorios={store.getLaboratoriosByInternacion(internacion.id)}
            glucemias={store.getGlucemiasByInternacion(internacion.id)}
            acidosBase={store.getAcidosBaseByInternacion(internacion.id)}
            cultivos={store.getCultivosByInternacion(internacion.id)}
            estudiosComplementarios={store.estudiosComplementarios.filter(e => e.internacionId === internacion.id)}
            interconsultas={(store.interconsultas || []).filter(ic => ic.internacionId === internacion.id)}
            atb={(store.atb || []).filter(a => a.internacionId === internacion.id)}
            onAgregarEvolucion={store.agregarEvolucion}
            onActualizarEvolucion={store.actualizarEvolucion}
            onEliminarEvolucion={store.eliminarEvolucion}
            onAgregarLaboratorio={(l) => store.agregarLaboratorio({ ...l, internacionId: internacion.id })}
            onActualizarLaboratorio={store.actualizarLaboratorio}
            onEliminarLaboratorio={store.eliminarLaboratorio}
            onAgregarGlucemia={(g) => store.agregarGlucemia({ ...g, internacionId: internacion.id })}
            onActualizarGlucemia={store.actualizarGlucemia}
            onEliminarGlucemia={store.eliminarGlucemia}
            onAgregarAcidoBase={(a) => store.agregarAcidoBase({ ...a, internacionId: internacion.id })}
            onActualizarAcidoBase={store.actualizarAcidoBase}
            onEliminarAcidoBase={store.eliminarAcidoBase}
            onAgregarCultivo={(c) => store.agregarCultivo({ ...c, internacionId: internacion.id })}
            onActualizarCultivo={store.actualizarCultivo}
            onEliminarCultivo={store.eliminarCultivo}
            onAgregarEstudioComplementario={(e) => store.agregarEstudioComplementario({ ...e, internacionId: internacion.id })}
            onActualizarEstudioComplementario={store.actualizarEstudioComplementario}
            onEliminarEstudioComplementario={store.eliminarEstudioComplementario}
            onAgregarInterconsulta={(ic) => store.agregarInterconsulta({ ...ic, internacionId: internacion.id })}
            onActualizarInterconsulta={store.actualizarInterconsulta}
            onEliminarInterconsulta={store.eliminarInterconsulta}
            onAgregarATB={(atb) => store.agregarATB({ ...atb, internacionId: internacion.id })}
            onActualizarATB={store.actualizarATB}
            onEliminarATB={store.eliminarATB}
            indicadores={(Array.isArray(store.indicaciones) ? store.indicaciones : []).filter((i: Indicacion) => i.internacionId === internacion.id)}
            movimientos={store.getMovimientosByInternacion ? store.getMovimientosByInternacion(internacion.id) : []}
            onAgregarIndicacion={(i) => store.agregarIndicacion({ ...i, internacionId: internacion.id })}
            onActualizarIndicacion={store.actualizarIndicacion}
            onEliminarIndicacion={store.eliminarIndicacion}
            onAgregarMovimiento={(m: MovimientoIndicacion) => store.agregarMovimientoIndicacion ? store.agregarMovimientoIndicacion({ ...m, internacionId: internacion.id }) : null}
            onActualizarInternacion={store.actualizarInternacion}
            onActualizarCama={store.actualizarCama}
            onVolver={() => store.setVista('internaciones')}
            onEditarIngreso={() => {
              if (store.canEditIngreso(internacion.id)) {
                store.setVista('editaringreso');
              } else {
                toast.error(`Solo el usuario que creó esta internación (${internacion.medicoIngresante}) puede modificar el ingreso.`);
              }
            }}
            canEdit={store.canEditInternacion(internacion.id)}
          />
        );
      }
      case 'nuevoingreso':
        return (
          <NuevoIngreso
            pacientes={store.pacientes}
            camas={store.camas}
            grupos={store.grupos}
            onIniciarInternacion={store.iniciarInternacion}
            onAgregarCama={store.agregarCama}
            onVolver={() => store.setVista('internaciones')}
            getGrupoName={(grupoId) => store.grupos.find(a => a.id === grupoId)?.nombre || ''}
            internaciones={store.internaciones}
          />
        );

      case 'editaringreso': {
        const internacionId = store.currentInternacionId || sessionStorage.getItem('hospital_current_internacion_id') || '';
        const internacion = store.getInternacionById(internacionId);
        const paciente = internacion
          ? (store.getPacienteById(internacion.pacienteId) || store.pacientes.find(p => p.id === internacion.pacienteId || p.dni === internacion.pacienteId) || {
              id: internacion.pacienteId || 'paciente-unknown',
              apellido: 'Paciente',
              nombre: 'Sin registrar',
              dni: internacion.pacienteId || 'N/A',
              fechaNacimiento: '1990-01-01',
              sexo: 'Otro' as const,
              fechaRegistro: new Date().toISOString()
            })
          : undefined;

        if (!internacion) {
          if (!store.isLoaded) {
            return (
              <div className="p-8 text-center text-gray-500">
                <p>Cargando información de la internación...</p>
              </div>
            );
          }
          return (
            <div className="p-4 text-center space-y-4">
              <p className="text-gray-500 dark:text-gray-400">Internación no encontrada (id: {internacionId})</p>
              <Button onClick={() => store.setVista('internaciones')}>Volver a Internaciones</Button>
            </div>
          );
        }
        return (
          <EditIngreso
            internacion={internacion}
            paciente={paciente}
            cama={store.getCamaById(internacion.camaId)}
            pacientes={store.pacientes}
            camas={store.camas}
            grupos={store.grupos}
            onActualizarInternacion={store.actualizarInternacion}
            onAgregarCama={store.agregarCama}
            onVolver={() => store.setVista('historiaclinica')}
            getGrupoName={(grupoId) => store.grupos.find(a => a.id === grupoId)?.nombre || ''}
          />
        );
      }
      case 'usuarios':
        if (store.currentUser?.rol !== 'admin') {
          return (
            <div className="p-8 text-center text-red-500 font-semibold">
              <p>No tiene permisos para acceder a esta sección.</p>
              <Button className="mt-4" onClick={() => store.setVista('dashboard')}>Volver al Dashboard</Button>
            </div>
          );
        }
        return (
          <GestionUsuarios />
        );
      case 'sistema':
        if (store.currentUser?.rol !== 'admin') {
          return (
            <div className="p-8 text-center text-red-500 font-semibold">
              <p>No tiene permisos para acceder a esta sección.</p>
              <Button className="mt-4" onClick={() => store.setVista('dashboard')}>Volver al Dashboard</Button>
            </div>
          );
        }
        return <SeccionSistema />;
      default:
        return null;
    }
  };

  return (
    <Layout vistaActual={store.vistaActual} onCambiarVista={store.setVista} currentUser={store.currentUser} onLogout={store.logout}>
      {renderVista()}
    </Layout>
  );
}

function App() {
  return (
    <ThemeProvider defaultTheme="dark" storageKey="vite-ui-theme">
      <AppContent />
      <Toaster position="top-right" />
    </ThemeProvider>
  );
}

export default App;