/** * SystemStatusBlock - Block 1: "Estado del Sistema" * * Displays system status including: * - Issues requiring user action * - Issues prevented by AI * - Last intelligent system run timestamp * - AI handling rate and savings */ import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Activity, AlertTriangle, Bot, CheckCircle2, ChevronDown, ChevronUp, Clock, Sparkles, TrendingUp, } from 'lucide-react'; import type { DashboardData, OrchestrationSummary } from '../../../api/hooks/useDashboardData'; interface SystemStatusBlockProps { data: DashboardData | undefined; loading?: boolean; } export function SystemStatusBlock({ data, loading }: SystemStatusBlockProps) { const { t } = useTranslation(['dashboard', 'common']); const [isExpanded, setIsExpanded] = useState(false); if (loading) { return (
); } const issuesRequiringAction = data?.issuesRequiringAction || 0; const issuesPreventedByAI = data?.issuesPreventedByAI || 0; const orchestrationSummary = data?.orchestrationSummary; const preventedIssues = data?.preventedIssues || []; // Determine status: green if no issues, yellow/red if issues exist const hasIssues = issuesRequiringAction > 0; const status = hasIssues ? 'warning' : 'success'; // Format last run time const formatLastRun = (timestamp: string | null | undefined) => { if (!timestamp) return t('dashboard:new_dashboard.system_status.never_run'); const date = new Date(timestamp); const now = new Date(); const diffMs = now.getTime() - date.getTime(); const diffHours = Math.floor(diffMs / (1000 * 60 * 60)); const diffMinutes = Math.floor(diffMs / (1000 * 60)); if (diffMinutes < 1) return t('common:time.just_now', 'Just now'); if (diffMinutes < 60) return t('common:time.minutes_ago', '{{count}} min ago', { count: diffMinutes }); if (diffHours < 24) return t('common:time.hours_ago', '{{count}}h ago', { count: diffHours }); return date.toLocaleDateString(); }; // Status styling const statusStyles = { success: { bg: 'bg-[var(--color-success-50)]', border: 'border-[var(--color-success-200)]', iconBg: 'bg-[var(--color-success-100)]', iconColor: 'text-[var(--color-success-600)]', }, warning: { bg: 'bg-[var(--color-warning-50)]', border: 'border-[var(--color-warning-200)]', iconBg: 'bg-[var(--color-warning-100)]', iconColor: 'text-[var(--color-warning-600)]', }, }; const styles = statusStyles[status]; return (
{/* Main Content */}
{/* Status Icon */}
{hasIssues ? ( ) : ( )}
{/* Content */}
{/* Title */}

{t('dashboard:new_dashboard.system_status.title')}

{/* Status Message */}

{hasIssues ? t('dashboard:new_dashboard.system_status.issues_requiring_action', { count: issuesRequiringAction, }) : t('dashboard:new_dashboard.system_status.all_clear')}

{/* Stats Row */}
{/* Issues Requiring Action */}
0 ? 'text-[var(--color-warning-500)]' : 'text-[var(--text-tertiary)]' }`} /> {issuesRequiringAction} {t('dashboard:new_dashboard.system_status.action_needed_label')}
{/* Issues Prevented by AI */}
{issuesPreventedByAI} {t('dashboard:new_dashboard.system_status.ai_prevented_label')}
{/* Last Run */}
{t('dashboard:new_dashboard.system_status.last_run_label')}: {formatLastRun(orchestrationSummary?.runTimestamp)}
{/* Expand Button (if there are prevented issues to show) */} {issuesPreventedByAI > 0 && ( )}
{/* Expanded AI Details Section */} {isExpanded && issuesPreventedByAI > 0 && (

{t('dashboard:new_dashboard.system_status.ai_prevented_details')}

{/* AI Stats */} {orchestrationSummary && (
{orchestrationSummary.aiHandlingRate !== undefined && (
{t('dashboard:new_dashboard.system_status.ai_handling_rate')}
{Math.round(orchestrationSummary.aiHandlingRate)}%
)} {orchestrationSummary.estimatedSavingsEur !== undefined && orchestrationSummary.estimatedSavingsEur > 0 && (
{t('dashboard:new_dashboard.system_status.estimated_savings')}
€{orchestrationSummary.estimatedSavingsEur.toLocaleString()}
)}
{t('dashboard:new_dashboard.system_status.issues_prevented')}
{issuesPreventedByAI}
)} {/* Prevented Issues List */} {preventedIssues.length > 0 && (
{preventedIssues.slice(0, 5).map((issue: any, index: number) => (

{issue.title || issue.message || t('dashboard:new_dashboard.system_status.issue_prevented')}

{issue.business_impact?.financial_impact_eur && (

{t('dashboard:new_dashboard.system_status.saved')}: €{issue.business_impact.financial_impact_eur.toLocaleString()}

)}
))} {preventedIssues.length > 5 && (

{t('dashboard:new_dashboard.system_status.and_more', { count: preventedIssues.length - 5, })}

)}
)}
)}
); } export default SystemStatusBlock;