import React, { useMemo } from 'react'; import { Doughnut } from 'react-chartjs-2'; import { Chart as ChartJS, ArcElement, Tooltip, Legend } from 'chart.js'; import Card from '../common/Card'; import { useTranslation } from 'react-i18next'; ChartJS.register(ArcElement, Tooltip, Legend); interface RiskDonutChartProps { results: any[]; } const RiskDonutChart: React.FC = ({ results }) => { const { t } = useTranslation(); const riskDistribution = useMemo(() => { const distribution = { green: 0, yellow: 0, orange: 0, red: 0 }; results.forEach(result => { if (result.riskAssessment?.riskSummary?.semaphore) { const semaphore = result.riskAssessment.riskSummary.semaphore as keyof typeof distribution; if (semaphore in distribution) { distribution[semaphore] += 1; } } }); return distribution; }, [results]); const data = { labels: [ t('risk.low'), t('risk.medium'), t('risk.high'), t('risk.critical') ], datasets: [ { data: [ riskDistribution.green, riskDistribution.yellow, riskDistribution.orange, riskDistribution.red ], backgroundColor: ['#22C55E', '#FBBF24', '#F97316', '#EF4444'], borderColor: ['#22C55E', '#FBBF24', '#F97316', '#EF4444'], borderWidth: 1, }, ], }; const options = { responsive: true, maintainAspectRatio: false, cutout: '70%', plugins: { legend: { position: 'bottom' as const, labels: { padding: 20, usePointStyle: true, pointStyle: 'circle' } }, tooltip: { callbacks: { label: function(context: any) { const label = context.label || ''; const value = context.raw || 0; const total = context.dataset.data.reduce((a: number, b: number) => a + b, 0); const percentage = total > 0 ? Math.round((value / total) * 100) : 0; return `${label}: ${value} (${percentage}%)`; } } } }, }; const totalEvaluations = Object.values(riskDistribution).reduce((a, b) => a + b, 0); return (

{totalEvaluations}

{t('riskDonut.evaluations', { defaultValue: 'Evaluaciones' })}

{riskDistribution.green} {t('risk.low')}

{t('riskDonut.desc.low', { defaultValue: 'Sin riesgos significativos' })}

{riskDistribution.yellow} {t('risk.medium')}

{t('riskDonut.desc.medium', { defaultValue: 'Algunos riesgos significativos' })}

{riskDistribution.orange} {t('risk.high')}

{t('riskDonut.desc.high', { defaultValue: 'Múltiples riesgos significativos' })}

{riskDistribution.red} {t('risk.critical')}

{t('riskDonut.desc.critical', { defaultValue: 'Riesgos severos detectados' })}

); }; export default RiskDonutChart;