import React, { useState, useEffect } from 'react'; import { motion, AnimatePresence } from 'motion/react'; import { Database, RefreshCw, Plus, Trash2, ShieldCheck, ShieldAlert, Wifi, WifiOff, Server, BarChart3, AlertTriangle, Play, HelpCircle, HardDrive } from 'lucide-react'; import { BarChart, Bar, XAxis, YAxis, Tooltip, ResponsiveContainer, Cell } from 'recharts'; import { getAllDatabases, saveDatabase, verifyDatabaseState, deleteDatabase, DatabaseRegistryRecord } from '../utils/vaultManager'; interface DatabaseMonitorProps { lang: 'ar' | 'en'; } const CONST_TRANSLATIONS = { ar: { title: 'مراقبة وإدارة هوية قواعد البيانات السحابية', subtitle: 'تسجيل وتحليل ومزامنة مؤشرات أداء قواعد البيانات، ومراقبة سعات التخزين بدقة لحظية.', addBtn: 'تسجيل قاعدة بيانات جديدة', emptyState: 'لم تقم بتسجيل أي قاعدة بيانات بعد.', emptySub: 'أضف قواعد بيانات PostgreSQL, Supabase, MongoDB Atlas للبدء بمراقبتها.', formTitle: 'تسجيل قاعدة بيانات وتأمين الاتصال', dbName: 'اسم قاعدة البيانات', dbType: 'معمارية محرك البيانات', connString: 'سلسلة الاتصال المشفرة (Connection String)', saveBtn: 'تشفير وحفظ قاعدة البيانات', cancel: 'إلغاء', toastSuccess: 'تم حفظ قاعدة البيانات مشفرة بسجلات الخزنة!', toastDeleted: 'تم إلغاء تسجيل وإزالة خادم قاعدة البيانات.', testBtn: 'فحص الاتصال والنبض', refreshBtn: 'تحديث القياسات والأرقام', alertLimit: 'تنبيه: سعة التخزين تقترب من الحد الأقصى للمستوى المجاني (أكثر من 80 ميغابايت)!', limitExceeded: 'ممتلئة تقريباً', usageTitle: 'توزيع استخدام مساحة التخزين السحابية (ميغابايت)', totalDatabases: 'إجمالي قواعد البيانات المتصلة', totalStorage: 'إجمالي المساحة المستخدمة', avgTables: 'متوسط عدد الجداول/المستندات', statusOnline: 'متصل / مستقر', statusOffline: 'غير متصل / عطل بالتشفير' }, en: { title: 'Cloud Databases Infrastructure Monitor', subtitle: 'Register, analyze, and sync database health, table metrics, and storage capacities in real-time.', addBtn: 'Register New Database', emptyState: 'No databases registered in your key vault yet.', emptySub: 'Connect PostgreSQL, Supabase, or MongoDB Atlas clusters to monitor health.', formTitle: 'Register & Encrypt New DB Connection', dbName: 'Database Custom Name', dbType: 'Database Architecture Type', connString: 'Secured Connection String (URI)', saveBtn: 'Encrypt & Save Connection', cancel: 'Cancel', toastSuccess: 'Database secured and registered to Supabase key vault successfully.', toastDeleted: 'Database registry erased from the cluster list.', testBtn: 'Test Connection Ping', refreshBtn: 'Retrieve Stats & Metrics', alertLimit: 'Warning: Storage space is nearing free trial thresholds (> 80 MB)!', limitExceeded: 'Nearing Limit', usageTitle: 'Cloud Storage Capacity Spent (MB)', totalDatabases: 'Connected Databases', totalStorage: 'Total Storage Spent', avgTables: 'Average Tables Count', statusOnline: 'Stable / Connected', statusOffline: 'Offline / Encryption error' } }; export default function DatabaseMonitor({ lang }: DatabaseMonitorProps) { const t = CONST_TRANSLATIONS[lang]; const [databases, setDatabases] = useState([]); const [loading, setLoading] = useState(false); const [isModalOpen, setIsModalOpen] = useState(false); const [dbName, setDbName] = useState(''); const [dbType, setDbType] = useState('PostgreSQL'); const [connString, setConnString] = useState(''); const [testingId, setTestingId] = useState(null); const [toast, setToast] = useState(null); useEffect(() => { loadDatabases(); }, []); const triggerToast = (msg: string) => { setToast(msg); setTimeout(() => setToast(null), 3000); }; const loadDatabases = async () => { setLoading(true); const data = await getAllDatabases(); setDatabases(data); setLoading(false); }; const handleSave = async (e: React.FormEvent) => { e.preventDefault(); if (!dbName || !connString) return; setLoading(true); const masterPass = sessionStorage.getItem('dynamic_vault_auth_token') || 'Eissa2026'; const res = await saveDatabase(dbName, dbType, connString, masterPass); if (res.success) { triggerToast(t.toastSuccess); setIsModalOpen(false); setDbName(''); setConnString(''); await loadDatabases(); } else { triggerToast(res.error || 'Failed to save.'); } setLoading(false); }; const handleDelete = async (id: string) => { if (confirm(lang === 'ar' ? 'هل أنت متأكد من حذف اتصال قاعدة البيانات هذا نهائياً؟' : 'Are you sure you want to permanently erase this database registry?')) { const ok = await deleteDatabase(id); if (ok) { triggerToast(t.toastDeleted); await loadDatabases(); } } }; const handleTestConnection = async (item: DatabaseRegistryRecord) => { setTestingId(item.id); const masterPass = sessionStorage.getItem('dynamic_vault_auth_token') || 'Eissa2026'; const res = await verifyDatabaseState(item.id, item.connection_string, masterPass); if (res.success) { triggerToast(`${item.db_name}: ${res.text}`); await loadDatabases(); } else { triggerToast(`${item.db_name}: ${res.text}`); } setTestingId(null); }; // Metrics indicators const totalStorage = databases.reduce((acc, current) => acc + Number(current.storage_used), 0); const averageTables = databases.length > 0 ? Math.round(databases.reduce((acc, current) => acc + current.tables_count, 0) / databases.length) : 0; // Chart modeling const chartData = databases.map(d => ({ name: d.db_name, storage: Number(d.storage_used) })); const COLORS = ['#6366f1', '#8b5cf6', '#06b6d4', '#ec4899', '#f59e0b', '#10b981']; return (
{/* Toast Notification */} {toast && ( {toast} )} {/* Main Stats HUD Summary */}
{t.totalDatabases}
{databases.length}
{t.totalStorage}
{totalStorage.toFixed(1)} MB
{t.avgTables}
{averageTables}
{/* Controller Area */}

{t.title}

{t.subtitle}

{/* databases list details */}
{databases.length === 0 ? (
{t.emptyState}

{t.emptySub}

) : ( databases.map(db => { const isNearingLimit = db.storage_used > 80; return (
{db.db_type.charAt(0).toUpperCase()}

{db.db_name}

{db.db_type}
{db.status === 'online' ? : } {db.status === 'online' ? t.statusOnline : t.statusOffline} {isNearingLimit && ( {t.limitExceeded} )}
{/* Warning strip */} {isNearingLimit && (
{t.alertLimit}
)} {/* Meter detail stats */}
TABLES COUNT
{db.tables_count} tables
ESTIMATED STORAGE
{db.storage_used} MB / 500 MB
{/* Database action controllers */}
); }) )}
{/* Storage charts visualizer side panels */}

{t.usageTitle}

{chartData.length === 0 ? (
No storage distribution metrics to show.
) : (
{chartData.map((entry, index) => ( ))}
)}
{/* ADD DATABASE MODAL */} {isModalOpen && (

{t.formTitle}

setDbName(e.target.value)} placeholder="e.g. Supabase Production API" className="w-full bg-slate-50 border border-slate-200 text-slate-800 px-4 py-3 rounded-2xl outline-none text-xs font-bold focus:border-indigo-500" />
setConnString(e.target.value)} placeholder="postgresql://username:passphrase@host:5432/dbname" className="w-full bg-slate-50 border border-slate-200 text-slate-800 px-4 py-3.5 rounded-2xl outline-none text-xs font-mono focus:border-indigo-500" />
)}
); }