'use client' import { FMResult, FMComputeResponse } from '@/lib/types' import { XAxis, YAxis, Tooltip, ResponsiveContainer, Line, ComposedChart, Area, ReferenceLine, Brush, } from 'recharts' interface FinancialChartProps { activeResults: FMComputeResponse | null compareResults?: Map compareMode?: boolean scenarioColors?: Record lang: 'de' | 'en' } export default function FinancialChart({ activeResults, compareResults, compareMode = false, scenarioColors = {}, lang, }: FinancialChartProps) { if (!activeResults) { return (
{lang === 'de' ? 'Lade Daten...' : 'Loading data...'}
) } const results = activeResults.results const breakEvenMonth = activeResults.summary.break_even_month // Build chart data — monthly const data = results.map((r) => { const entry: Record = { label: `${r.year.toString().slice(2)}/${String(r.month_in_year).padStart(2, '0')}`, month: r.month, revenue: Math.round(r.revenue_eur), costs: Math.round(r.total_costs_eur), customers: r.total_customers, cashBalance: Math.round(r.cash_balance_eur), } // Add compare scenario data if (compareMode && compareResults) { compareResults.forEach((cr, scenarioId) => { const crMonth = cr.results.find(m => m.month === r.month) if (crMonth) { entry[`revenue_${scenarioId}`] = Math.round(crMonth.revenue_eur) entry[`customers_${scenarioId}`] = crMonth.total_customers } }) } return entry }) const formatValue = (value: number) => { if (Math.abs(value) >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}M` if (Math.abs(value) >= 1_000) return `${(value / 1_000).toFixed(0)}k` return value.toString() } return (
{ const label = name === 'revenue' ? (lang === 'de' ? 'Umsatz' : 'Revenue') : name === 'costs' ? (lang === 'de' ? 'Kosten' : 'Costs') : name === 'customers' ? (lang === 'de' ? 'Kunden' : 'Customers') : name === 'cashBalance' ? 'Cash' : name return [name === 'customers' ? value : formatValue(value) + ' EUR', label] }} /> {/* Break-even reference line */} {breakEvenMonth && ( )} {/* Revenue area */} {/* Cost area */} {/* Customers line */} {/* Compare mode: overlay other scenarios */} {compareMode && compareResults && Array.from(compareResults.entries()).map(([scenarioId]) => ( ))} {/* Brush for zooming */}
) }