import { useState } from 'react'; import { AlertTriangle, Plus, Trash2, Edit2, Power, PowerOff, Shield, Cpu, HardDrive, Network, UserX, Users, Clock, AlertCircle, ChevronDown, Activity } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Switch } from '@/components/ui/switch'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from '@/components/ui/collapsible'; import { toast } from '@/hooks/use-toast'; import { useAlertRules, AlertRule, MetricType, Operator, METRIC_CONFIG, OPERATOR_CONFIG } from '@/hooks/useAlertRules'; import { NotificationSeverity } from '@/contexts/NotificationContext'; import { cn } from '@/lib/utils'; const metricIcons: Record = { threat_count: Shield, cpu_usage: Cpu, memory_usage: HardDrive, network_traffic: Network, failed_logins: UserX, active_connections: Users, response_time: Clock, error_rate: AlertCircle, }; const severityColors: Record = { critical: 'text-destructive', warning: 'text-orange-400', info: 'text-primary', }; const AlertRulesManager = () => { const { rules, currentMetrics, createRule, updateRule, deleteRule, toggleRule } = useAlertRules(); const [isOpen, setIsOpen] = useState(false); const [dialogOpen, setDialogOpen] = useState(false); const [editingRule, setEditingRule] = useState(null); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const [ruleToDelete, setRuleToDelete] = useState(null); // Form state const [formName, setFormName] = useState(''); const [formDescription, setFormDescription] = useState(''); const [formMetric, setFormMetric] = useState('threat_count'); const [formOperator, setFormOperator] = useState('gt'); const [formThreshold, setFormThreshold] = useState('50'); const [formSeverity, setFormSeverity] = useState('warning'); const [formCooldown, setFormCooldown] = useState('5'); const resetForm = () => { setFormName(''); setFormDescription(''); setFormMetric('threat_count'); setFormOperator('gt'); setFormThreshold('50'); setFormSeverity('warning'); setFormCooldown('5'); setEditingRule(null); }; const openCreateDialog = () => { resetForm(); setDialogOpen(true); }; const openEditDialog = (rule: AlertRule) => { setEditingRule(rule); setFormName(rule.name); setFormDescription(rule.description || ''); setFormMetric(rule.metric); setFormOperator(rule.operator); setFormThreshold(String(rule.threshold)); setFormSeverity(rule.severity); setFormCooldown(String(rule.cooldownMinutes)); setDialogOpen(true); }; const handleSaveRule = () => { if (!formName.trim()) { toast({ title: "Navn påkrævet", variant: "destructive" }); return; } const threshold = parseFloat(formThreshold); if (isNaN(threshold)) { toast({ title: "Ugyldig threshold værdi", variant: "destructive" }); return; } const cooldown = parseInt(formCooldown); if (isNaN(cooldown) || cooldown < 1) { toast({ title: "Cooldown skal være mindst 1 minut", variant: "destructive" }); return; } if (editingRule) { updateRule(editingRule.id, { name: formName.trim(), description: formDescription.trim() || undefined, metric: formMetric, operator: formOperator, threshold, severity: formSeverity, cooldownMinutes: cooldown, }); toast({ title: "Regel opdateret" }); } else { createRule({ name: formName.trim(), description: formDescription.trim() || undefined, enabled: true, metric: formMetric, operator: formOperator, threshold, severity: formSeverity, cooldownMinutes: cooldown, }); toast({ title: "Regel oprettet" }); } setDialogOpen(false); resetForm(); }; const confirmDelete = (rule: AlertRule) => { setRuleToDelete(rule); setDeleteDialogOpen(true); }; const handleDelete = () => { if (ruleToDelete) { deleteRule(ruleToDelete.id); toast({ title: "Regel slettet" }); setRuleToDelete(null); setDeleteDialogOpen(false); } }; const activeRules = rules.filter(r => r.enabled).length; return ( <>

Alert Rules

Definer custom alerts baseret på metrics

{/* Current Metrics Overview */}
{(Object.keys(METRIC_CONFIG) as MetricType[]).map((metric) => { const config = METRIC_CONFIG[metric]; const Icon = metricIcons[metric]; const value = currentMetrics[metric]; return (
{value ?? '-'}{config.unit}
{config.label}
); })}
{/* Rules List */} {rules.length === 0 ? (

Ingen regler defineret endnu

) : (
{rules.map((rule) => { const Icon = metricIcons[rule.metric]; const config = METRIC_CONFIG[rule.metric]; const opConfig = OPERATOR_CONFIG[rule.operator]; return (
{rule.name} {rule.severity}
{config.label} {opConfig.symbol} {rule.threshold}{config.unit} {rule.triggerCount > 0 && ( • Triggered {rule.triggerCount}x )}
toggleRule(rule.id)} />
); })}
)}
{/* Create/Edit Dialog */} {editingRule ? 'Rediger regel' : 'Opret ny regel'} Definer betingelser for hvornår du vil modtage alerts
setFormName(e.target.value)} className="bg-secondary/30 border-border" />
setFormDescription(e.target.value)} className="bg-secondary/30 border-border" />
setFormThreshold(e.target.value)} className="bg-secondary/30 border-border" />
setFormCooldown(e.target.value)} className="bg-secondary/30 border-border" />
{/* Delete Confirmation */} Slet regel Er du sikker på at du vil slette "{ruleToDelete?.name}"? ); }; export default AlertRulesManager;