import { useMemo } from 'react' import { calcularKPIs } from '../utils/calculos' import SerieHistorica, { SERIE_HISTORICA, getPoblacionAnual, } from '../components/charts/SerieHistorica' import PorLocalidad from '../components/charts/PorLocalidad' import PorTipoSiniestro from '../components/charts/PorTipoSiniestro' import FranjaHoraria from '../components/charts/FranjaHoraria' import KPICard from '../components/ui/KPICard' import ChartCard from '../components/ui/ChartCard' import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, } from 'recharts' import { useChartTheme } from '../hooks/useChartTheme' import { COLOR } from '../utils/colores' function calcularPorcentaje(base, actual) { if (!base || base === 0) return '0%' const diff = actual - base const sign = diff >= 0 ? '▲' : '▼' return `${sign} ${Math.abs(((diff / base) * 100).toFixed(1))}%` } export default function SecHistorica({ siniestros, year }) { const yearNum = Number(year) const kpis = calcularKPIs(siniestros) const { tickColor, gridColor, tooltipBg, tooltipBorder, tooltipLabel } = useChartTheme() const serieComparativa = useMemo(() => { const base = [...SERIE_HISTORICA] const yaExiste = base.some((row) => row.ano === yearNum) if (!yaExiste && kpis.total > 0) { const pob = getPoblacionAnual(yearNum) const tasa = Number(((kpis.victimas / pob) * 100000).toFixed(2)) return [ ...base, { ano: yearNum, siniestros: kpis.total, victimas: kpis.victimas, tasa }, ].sort((a, b) => a.ano - b.ano) } return base }, [yearNum, kpis.total, kpis.victimas]) const yearActualData = useMemo( () => serieComparativa.find((row) => row.ano === yearNum) ?? null, [serieComparativa, yearNum], ) const prevYearData = useMemo( () => serieComparativa.find((row) => row.ano === yearNum - 1) ?? null, [serieComparativa, yearNum], ) const victimasPorAno = useMemo( () => serieComparativa.map((row) => ({ ano: row.ano, victimas: row.victimas })), [serieComparativa], ) const dataTabla = serieComparativa const serieParaExtremos = useMemo(() => { const base = [...SERIE_HISTORICA] const existe2025 = base.some((row) => row.ano === 2025) if (!existe2025) base.push({ ano: 2025, siniestros: 0, victimas: 21, tasa: 6.27 }) return base.filter((row) => row.ano !== 2020 && row.victimas != null).sort((a, b) => a.ano - b.ano) }, []) const victimasActual = yearActualData?.victimas ?? kpis.victimas ?? null const comparativoVictimas = prevYearData?.victimas != null && victimasActual != null ? calcularPorcentaje(prevYearData.victimas, victimasActual) : '—' const serieVictimasValidas = serieComparativa.filter( (row) => row.ano !== 2020 && row.victimas != null, ) const maxEntry = serieParaExtremos.length > 0 ? serieParaExtremos.reduce((max, row) => (max == null || row.victimas > max.victimas ? row : max), null) : null const maxHistorico = maxEntry?.victimas ?? null const maxAno = maxEntry?.ano ?? null const minEntry = serieParaExtremos.length > 0 ? serieParaExtremos.reduce((min, row) => (min == null || row.victimas < min.victimas ? row : min), null) : null const minHistorico = minEntry?.victimas ?? null const minAno = minEntry?.ano ?? null const serieOrdenada = [...serieVictimasValidas].sort((a, b) => a.ano - b.ano) const ultimos10 = serieOrdenada.filter((row) => row.ano <= yearNum).slice(-10) const promedio10 = ultimos10.length > 0 ? (ultimos10.reduce((acc, row) => acc + row.victimas, 0) / ultimos10.length).toFixed(1) : null const rango10Desde = ultimos10[0]?.ano ?? null const rango10Hasta = ultimos10[ultimos10.length - 1]?.ano ?? null return (
{/* KPIs */}
{/* Serie histórica + barras de víctimas */}

Nota: el año 2020 no se incluye en la serie histórica. Las restricciones de circulación por la pandemia de COVID-19 generaron una reducción atípica de la movilidad vehicular, por lo que los datos no son comparables con el resto de la serie.

{/* Tipo, franja y localidad */}
{/* Tabla histórica */}

Tabla histórica

Histórico de siniestros

{dataTabla.map((row) => ( r.ano === yearNum) ? 'bg-blue-500/5 font-semibold' : '' }`} > ))}
Año Siniestros Víctimas Tasa
{row.ano} {row.siniestros} {row.victimas ?? '—'} {row.tasa ?? '—'}
) }