import { useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Progress } from '@/components/ui/progress'; import { supabase } from '@/lib/supabase'; import { Shield, AlertTriangle, CheckCircle, XCircle, Users, Key, Activity } from 'lucide-react'; import { AreaChart, Area, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, PieChart, Pie, Cell } from 'recharts'; interface SecurityMetrics { totalUsers: number; activeUsers: number; twoFactorEnabled: number; suspiciousActivities: number; failedLogins: number; securityScore: number; } interface AuditLog { id: string; action: string; user_id: string; ip_address: string; created_at: string; severity: 'low' | 'medium' | 'high' | 'critical'; } export function SecurityAudit() { const { t } = useTranslation(); const [metrics, setMetrics] = useState({ totalUsers: 0, activeUsers: 0, twoFactorEnabled: 0, suspiciousActivities: 0, failedLogins: 0, securityScore: 0, }); const [auditLogs, setAuditLogs] = useState([]); // const _loading = useState(true); useEffect(() => { loadSecurityData(); }, []); const loadSecurityData = async () => { try { // Load user metrics const { data: users } = await supabase .from('profiles') .select('id, created_at'); const { data: twoFactor } = await supabase .from('two_factor_auth') .select('user_id') .eq('enabled', true); const { data: sessions } = await supabase .from('user_sessions') .select('user_id') .eq('is_active', true); const { data: logs } = await supabase .from('activity_logs') .select('*') .order('created_at', { ascending: false }) .limit(100); // Calculate metrics const totalUsers = users?.length || 0; const activeUsers = sessions?.length || 0; const twoFactorEnabled = twoFactor?.length || 0; const suspiciousActivities = logs?.filter(l => l.action.includes('failed') || l.action.includes('suspicious') ).length || 0; const failedLogins = logs?.filter(l => l.action === 'login_failed' ).length || 0; // Calculate security score const score = Math.round( ((twoFactorEnabled / Math.max(totalUsers, 1)) * 40) + ((activeUsers / Math.max(totalUsers, 1)) * 20) + (Math.max(0, 40 - (suspiciousActivities * 2))) ); setMetrics({ totalUsers, activeUsers, twoFactorEnabled, suspiciousActivities, failedLogins, securityScore: score, }); setAuditLogs(logs || []); } catch (error) { if (import.meta.env.DEV) console.error('Error loading security data:', error); } finally { setLoading(false); } }; const getScoreColor = (score: number) => { if (score >= 80) return 'text-green-500'; if (score >= 60) return 'text-yellow-500'; if (score >= 40) return 'text-orange-500'; return 'text-red-500'; }; const getScoreBadge = (score: number) => { if (score >= 80) return { text: t('securityAudit.excellent'), variant: 'default' as const }; if (score >= 60) return { text: t('securityAudit.good'), variant: 'secondary' as const }; if (score >= 40) return { text: t('securityAudit.fair'), variant: 'outline' as const }; return { text: t('securityAudit.poor'), variant: 'destructive' as const }; }; const pieData = [ { name: t('securityAudit.pieEnabled'), value: metrics.twoFactorEnabled, color: '#10b981' }, { name: t('securityAudit.pieNotEnabled'), value: metrics.totalUsers - metrics.twoFactorEnabled, color: '#ef4444' }, ]; const activityData = [ { name: t('securityAudit.dayMon'), logins: 45, failures: 2 }, { name: t('securityAudit.dayTue'), logins: 52, failures: 3 }, { name: t('securityAudit.dayWed'), logins: 48, failures: 1 }, { name: t('securityAudit.dayThu'), logins: 61, failures: 4 }, { name: t('securityAudit.dayFri'), logins: 55, failures: 2 }, { name: t('securityAudit.daySat'), logins: 32, failures: 1 }, { name: t('securityAudit.daySun'), logins: 28, failures: 0 }, ]; const scoreBadge = getScoreBadge(metrics.securityScore); return (
{/* Security Score Card */} {t('securityAudit.scoreTitle')} {scoreBadge.text}
{metrics.securityScore}

{t('securityAudit.outOf')}

{/* Metrics Grid */}

{t('securityAudit.totalUsers')}

{metrics.totalUsers}

{t('securityAudit.twoFaEnabled')}

{metrics.twoFactorEnabled}

{t('securityAudit.activeSessions')}

{metrics.activeUsers}

{t('securityAudit.suspicious')}

{metrics.suspiciousActivities}

{/* Charts */}
{t('securityAudit.loginActivity')} {t('securityAudit.twoFaAdoption')} `${entry.name}: ${entry.value}`} outerRadius={80} fill="#8884d8" dataKey="value" > {pieData.map((entry, index) => ( ))}
{/* Recent Security Events */} {t('securityAudit.recentEvents')}
{auditLogs.slice(0, 10).map((log) => (
{log.severity === 'critical' && } {log.severity === 'high' && } {log.severity === 'medium' && } {log.severity === 'low' && }

{log.action}

{t('securityAudit.ip')}: {log.ip_address}

{log.severity}
))}
); }