import { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Loader2 } from 'lucide-react'; import { cn } from '@/lib/utils'; interface BranchData { branch: string; count: number; amount: number; } interface BranchChartProps { branches: BranchData[]; isLoading?: boolean; } const barColors = [ { gradient: 'from-blue-500 to-blue-400', glow: 'shadow-[0_0_15px_rgba(59,130,246,0.3)]', hover: 'group-hover:text-blue-500' }, { gradient: 'from-purple-500 to-purple-400', glow: 'shadow-[0_0_15px_rgba(139,92,246,0.3)]', hover: 'group-hover:text-purple-500' }, { gradient: 'from-teal-500 to-teal-400', glow: 'shadow-[0_0_15px_rgba(20,184,166,0.3)]', hover: 'group-hover:text-teal-500' }, { gradient: 'from-sky-500 to-sky-400', glow: 'shadow-[0_0_15px_rgba(14,165,233,0.3)]', hover: 'group-hover:text-sky-500' }, { gradient: 'from-indigo-500 to-indigo-400', glow: 'shadow-[0_0_15px_rgba(99,102,241,0.3)]', hover: 'group-hover:text-indigo-500' }, { gradient: 'from-rose-500 to-rose-400', glow: 'shadow-[0_0_15px_rgba(244,63,94,0.3)]', hover: 'group-hover:text-rose-500' }, { gradient: 'from-amber-500 to-amber-400', glow: 'shadow-[0_0_15px_rgba(245,158,11,0.3)]', hover: 'group-hover:text-amber-500' }, { gradient: 'from-emerald-500 to-emerald-400', glow: 'shadow-[0_0_15px_rgba(16,185,129,0.3)]', hover: 'group-hover:text-emerald-500' }, ]; function formatAmount(amount: number): string { if (amount >= 1_000_000) return `${(amount / 1_000_000).toFixed(1)}M`; if (amount >= 1_000) return `${(amount / 1_000).toFixed(0)}k`; return amount.toFixed(0); } export default function BranchChart({ branches, isLoading }: BranchChartProps) { const { t } = useTranslation(); const [hoveredIndex, setHoveredIndex] = useState(null); const maxAmount = Math.max(...branches.map((b) => b.amount), 1); // Generate Y-axis labels based on actual data const yMax = Math.ceil(maxAmount / 1000) * 1000; const yLabels = [formatAmount(yMax), formatAmount(yMax * 0.66), formatAmount(yMax * 0.33), '0']; return (

{t('reports.chart.title')}

{t('reports.chart.subtitle')}

{isLoading ? (
) : branches.length === 0 ? (
{t('reports.chart.noData', 'Aucune donnée disponible')}
) : (
{/* Grid lines */}
{[...Array(3)].map((_, i) => (
))}
{/* Y-axis labels */}
{yLabels.map((label, i) => ( {label} ))}
{/* Bars */} {branches.map((branch, index) => { const color = barColors[index % barColors.length]; const heightPct = Math.max(5, (branch.amount / maxAmount) * 100); const formattedAmt = branch.amount.toLocaleString('fr-CA', { style: 'currency', currency: 'CAD', minimumFractionDigits: 0, }); return (
setHoveredIndex(index)} onMouseLeave={() => setHoveredIndex(null)} >
{/* Tooltip */}
{formattedAmt}
{branch.count} Transactions
{branch.branch || 'Montreal'}
); })}
)}
); }