import React, { useState, useEffect, useMemo } from 'react'; import { useNavigate } from 'react-router-dom'; import { Hospital, CheckCircle, AlertCircle, Plus, Phone, Settings, CheckCircle2, MoreVertical, Shield, User as UserIcon, Navigation2, XCircle, Stethoscope, Lock, Edit2, Trash2, Eye, EyeOff } from 'lucide-react'; import { Card } from '../components/Common'; import { BarChart, Bar, XAxis, YAxis, ResponsiveContainer, Tooltip } from 'recharts'; import { motion, AnimatePresence } from 'framer-motion'; import { authApi } from '../api/auth'; import { incidentsApi } from '../api/incidents'; type ViewMode = 'NETWORK_OVERVIEW' | 'HOSPITAL_MGMT' | 'APPROVAL_QUEUE' | 'ANALYTICS'; export const HospitalsNetwork: React.FC = () => { const [viewMode, setViewMode] = useState('NETWORK_OVERVIEW'); const [isModalOpen, setIsModalOpen] = useState(false); const [isSubmitting, setIsSubmitting] = useState(false); const [realHospitals, setRealHospitals] = useState([]); const [incidents, setIncidents] = useState([]); const [issues, setIssues] = useState([]); const [isLoading, setIsLoading] = useState(true); const [editingHospital, setEditingHospital] = useState(null); const navigate = useNavigate(); const loadIncidents = async () => { try { const token = localStorage.getItem('teleems_token') || ''; if (!token) return; const res = await incidentsApi.getIncidents({ limit: 10 }, token); if (res && res.data) { setIncidents(res.data); } } catch (err) { console.error('Failed to load incidents:', err); } }; const loadHospitals = async () => { try { const token = localStorage.getItem('teleems_token') || ''; if (!token) return; const response = await authApi.getUsers(token); if (response && (response.status === 401 || response.message?.toLowerCase().includes('expired'))) { localStorage.removeItem('teleems_auth'); localStorage.removeItem('teleems_token'); localStorage.removeItem('teleems_user'); navigate('/login'); return; } if (response && response.data) { // Robust Hospital Node extraction const filteredAdmins = response.data.filter((u: any) => { const roles = Array.isArray(u.roles) ? u.roles.map((r: any) => String(r).toUpperCase()) : []; return roles.includes('HOSPITAL ADMIN') || roles.includes('HOSPITAL_ADMIN'); }); const hospitalNodes = filteredAdmins.map((u: any) => { const metaHosp = u.metadata?.hospital || {}; const metaOrg = u.metadata?.organization || {}; // Determine activity status const activeInc = incidents.filter(i => i.hospital_id === u.id && i.status !== 'RESOLVED').length; const [available] = (metaHosp.beds || '0/0').split('/').map((n: string) => parseInt(n) || 0); let activityStatus = 'IDLE'; if (activeInc > 5) activityStatus = 'CRITICAL LOAD'; else if (activeInc > 0) activityStatus = `HANDLING ${activeInc} INCIDENTS`; else if (available < 5) activityStatus = 'NEAR CAPACITY'; return { id: u.id, name: metaHosp.name || metaOrg.company_name || u.name || u.username || 'Unknown Hospital', type: metaHosp.type || metaHosp.specialization || 'Multi-Specialty', beds: metaHosp.beds || '15/60', status: u.status || 'ACTIVE', activity: activityStatus, accreditation: metaHosp.accreditation || 'NABH', admin: u.name || u.username, phone: u.phone || 'Contact Support', email: u.email, city: metaHosp.city || metaOrg.city || 'Chennai', radius: metaHosp.radius || '15km', zones: [metaHosp.city || metaOrg.city || 'Chennai'], rawMetadata: u.metadata, roles: u.roles || [] }; }); setRealHospitals(hospitalNodes); // Derive current issues const newIssues = hospitalNodes.map(h => { const [available] = (h.beds || '0/0').split('/').map((n: string) => parseInt(n) || 0); if (available === 0) return { type: 'CRITICAL', msg: `${h.name}: Zero bed capacity`, hospital: h.name }; if (available < 5) return { type: 'WARNING', msg: `${h.name}: Low bed availability`, hospital: h.name }; return null; }).filter(Boolean); setIssues(newIssues as any[]); } } catch (error) { console.error('Failed to fetch hospitals:', error); } finally { setIsLoading(false); } }; useEffect(() => { loadHospitals(); loadIncidents(); const interval = setInterval(() => { loadHospitals(); loadIncidents(); }, 30000); return () => clearInterval(interval); }, []); const hospitalStats = useMemo(() => { return realHospitals.map(h => { const [available, total] = (h.beds || '0/0').split('/').map((n: string) => parseInt(n) || 0); return { name: h.name, total: total || 100, available: available || 0 }; }); }, [realHospitals]); const handleHospitalSubmit = async (data: any) => { setIsSubmitting(true); try { const token = localStorage.getItem('teleems_token') || ''; if (!token) { throw new Error('No authentication token found. Please login again.'); } const result = await authApi.registerUser(data, token); if (result.error || result.status === 401) { throw new Error(result.error?.message || result.message || 'Unauthorized'); } console.log('Hospital Registration Success:', result); alert('Hospital registered successfully!'); setIsModalOpen(false); loadHospitals(); } catch (error: any) { console.error('Registration failed:', error); const isExpired = error.message.includes('expired'); alert(`Registration failed: ${error.message}${isExpired ? '. Your session has expired, redirecting to login...' : ''}`); if (isExpired) { localStorage.removeItem('teleems_auth'); localStorage.removeItem('teleems_token'); localStorage.removeItem('teleems_user'); navigate('/login'); } } finally { setIsSubmitting(false); } }; const handleStatusToggle = async (hospital: any) => { try { const newStatus = hospital.status === 'ACTIVE' ? 'INACTIVE' : 'ACTIVE'; const token = localStorage.getItem('teleems_token') || ''; const payload = { name: hospital.admin, email: hospital.email, phone: hospital.phone || '', status: newStatus, role: 'HOSPITAL_ADMIN', metadata: hospital.rawMetadata }; const res = await authApi.updateUser(hospital.id, payload, token); if (res.status === 401) { navigate('/login'); return; } loadHospitals(); } catch (error) { console.error('Failed to toggle status:', error); } }; const handleEditHospitalSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!editingHospital) return; setIsSubmitting(true); try { const token = localStorage.getItem('teleems_token') || ''; const payload = { name: editingHospital.admin, email: editingHospital.email, phone: editingHospital.phone || '', status: editingHospital.status, role: 'HOSPITAL_ADMIN', metadata: { ...editingHospital.rawMetadata, hospital: { ...editingHospital.rawMetadata?.hospital, name: editingHospital.name, city: editingHospital.city } } }; const res = await authApi.updateUser(editingHospital.id, payload, token); if (res.status === 401) { navigate('/login'); return; } setEditingHospital(null); loadHospitals(); } catch (error) { console.error('Update failed:', error); } finally { setIsSubmitting(false); } }; const triggerSubmit = () => { const form = document.getElementById('hospital-reg-form') as HTMLFormElement; if (form) form.requestSubmit(); }; return (

Hospital Governance

NETWORK OPERATIONAL CONTROL • {realHospitals.length} ACTIVE NODES

{viewMode === 'NETWORK_OVERVIEW' && ( {/* NETWORK PULSE STRIP */}
Live Incidents
{incidents.filter(i => i.status !== 'RESOLVED').length}
ACTIVE
Critical Issues
{issues.filter(i => i.type === 'CRITICAL').length}
ALERTS
Network Sync
98%
STABLE
System Health
OPTIMAL

HOSPITAL NODES

{realHospitals.length === 0 && !isLoading && (
No hospital nodes registered in network.
)} {realHospitals.map((h) => ( i.hospital === h.name && i.type === 'CRITICAL') ? '1px solid var(--alert-red)' : '1px solid var(--card-border)' }}>
{h.status}
{h.activity}
{h.name}
{h.type} • {h.city}
Available Beds
{h.beds}
Active Cases
{incidents.filter(i => i.hospital_id === h.id && i.status !== 'RESOLVED').length}
))}
{issues.length === 0 ? (
No critical issues detected.
) : ( issues.map((issue, idx) => (
{issue.type}
{issue.msg}
Identified 2m ago
)) )}
{incidents.length === 0 ? (
Monitoring network traffic...
) : ( incidents.slice(0, 5).map((inc, i) => (
{inc.patient_name || 'Emergency Call'}
{inc.status.toUpperCase()} • {inc.priority || 'P1'}
{new Date(inc.created_at).toLocaleTimeString()}
)) )}
{incidents.length > 5 && ( )}
{[ { name: 'Apollo Main', api: 'REST/FHIR', status: 'Healthy', latency: '45ms', lastSync: '12s ago' }, { name: 'MGM Healthcare', api: 'REST/FHIR', status: 'Healthy', latency: '38ms', lastSync: '5s ago' }, { name: 'MIOT Int.', api: 'REST/FHIR', status: 'Healthy', latency: '42ms', lastSync: '8s ago' }, { name: 'Global Health', api: 'HL7v2', status: 'Syncing', latency: '120ms', lastSync: '1m ago' }, { name: 'Stanley Medical', api: 'Direct SQL', status: 'Critical', latency: '--', lastSync: '14h ago' }, ].map((item, i) => (
{item.name}
{item.api} Protocol
{item.latency}
{item.lastSync}
))}
)} {viewMode === 'HOSPITAL_MGMT' && ( setIsModalOpen(true)} onEdit={(h) => setEditingHospital(h)} onToggleStatus={handleStatusToggle} /> )} {viewMode === 'APPROVAL_QUEUE' && ( {[ { id: 'REQ-9901', name: 'Global Health City', city: 'Chennai', admin: 'Dr. S. Karthik', email: 'sk@globalhealth.com', date: '2026-04-16' }, { id: 'REQ-9905', name: 'Fortis Malar', city: 'Chennai', admin: 'Pavitra M.', email: 'p.malar@fortis.com', date: '2026-04-15' } ].map(req => ( ))}
Request Details Admin Info Submitted Actions
{req.name}
{req.city} Node
{req.admin}
{req.email}
{req.date}
)} {viewMode === 'ANALYTICS' && (
1,248
↑ 14% vs last month
12.4m
-1.2m improvement
8.2%
Target: < 10%
{[40, 65, 52, 88, 70, 95, 82, 60, 75, 90, 110, 85].map((h, i) => (
{h}
))}
APR 01 APR 07 APR 14 APR 21 APR 28
)} setIsModalOpen(false)} onSubmit={triggerSubmit} loading={isSubmitting} > {/* EDIT HOSPITAL MODAL */} setEditingHospital(null)} onSubmit={() => { const form = document.getElementById('hospital-edit-form') as HTMLFormElement; if (form) form.requestSubmit(); }} loading={isSubmitting} > {editingHospital && (
setEditingHospital({...editingHospital, name: e.target.value})} style={{ width: '100%', padding: '12px', background: 'rgba(0,0,0,0.02)', border: '1px solid var(--card-border)', borderRadius: '8px', color: 'var(--text-primary)' }} />
setEditingHospital({...editingHospital, city: e.target.value})} style={{ width: '100%', padding: '12px', background: 'rgba(0,0,0,0.02)', border: '1px solid var(--card-border)', borderRadius: '8px', color: 'var(--text-primary)' }} />
setEditingHospital({...editingHospital, admin: e.target.value})} style={{ width: '100%', padding: '12px', background: 'rgba(0,0,0,0.02)', border: '1px solid var(--card-border)', borderRadius: '8px', color: 'var(--text-primary)' }} />
setEditingHospital({...editingHospital, phone: e.target.value})} style={{ width: '100%', padding: '12px', background: 'rgba(0,0,0,0.02)', border: '1px solid var(--card-border)', borderRadius: '8px', color: 'var(--text-primary)' }} />
setEditingHospital({...editingHospital, email: e.target.value})} style={{ width: '100%', padding: '12px', background: 'rgba(0,0,0,0.02)', border: '1px solid var(--card-border)', borderRadius: '8px', color: 'var(--text-primary)' }} />
)}
); }; // 5.3 Hospital Management (CRUD Sub-page) const HospitalManagement: React.FC<{ hospitals: any[]; onRegister: () => void; onEdit: (h: any) => void; onToggleStatus: (h: any) => void; }> = ({ hospitals, onRegister, onEdit, onToggleStatus }) => { const filteredHospitals = hospitals; // realHospitals already filtered in loadHospitals for Admine role return (

Hospital Account Management

{filteredHospitals.map((h, i) => ( ))}
Hospital Details Leadership & Contact Service Area Accreditation Status Actions
{h.name}
{h.type.toUpperCase()}
{h.admin}
{h.phone}
{h.radius}
{h.zones.slice(0, 2).join(', ')}{h.zones.length > 2 ? '...' : ''}
{h.acc}
{h.status === 'ACTIVE' ? : } {h.status}
{[ { trigger: 'Major Cardiac (Red)', target: 'Cath Lab / Cardiac Centre', priority: 'P0' }, { trigger: 'Severe Burns (Red)', target: 'Burns Specialty Unit', priority: 'P0' }, { trigger: 'Pediatric Emergency', target: 'Pediatric ED Node', priority: 'P1' }, ].map((rule, i) => (
{rule.trigger}
Route to: {rule.target}
{rule.priority}
))}
NABH Verification
VALID
Quality Assurance Audit
PENDING

Automatic compliance checks run every 30 days. Last verification was successful for 88% of the hospital network.

); }; // --- COMPONENTS --- const Modal: React.FC<{ isOpen: boolean; title: string; onClose: () => void; children: React.ReactNode; onSubmit?: () => void; loading?: boolean }> = ({ isOpen, title, onClose, children, onSubmit, loading }) => { if (!isOpen) return null; return (

{title}

{children}
); }; const HospitalRegistrationForm: React.FC<{ onSubmit: (data: any) => void }> = ({ onSubmit }) => { const [formData, setFormData] = useState({ admin_name: '', email: '', phone: '', password: '', hospital_name: '', city: '', lat: '13.0827', lon: '80.2707' }); const [showPassword, setShowPassword] = useState(false); const handleChange = (e: React.ChangeEvent) => { setFormData({ ...formData, [e.target.name]: e.target.value }); }; const handleFormSubmit = (e: React.FormEvent) => { e.preventDefault(); const payload = { role: "HOSPITAL_ADMIN", name: formData.admin_name, phone: formData.phone, email: formData.email, password: formData.password, metadata: { hospital: { name: formData.hospital_name, city: formData.city, lat: parseFloat(formData.lat), lon: parseFloat(formData.lon) } } }; onSubmit(payload); }; return (

ADMINISTRATOR DETAILS

HOSPITAL PROFILE

); };