'use client' import { useState } from 'react' import { Language } from '@/lib/types' import { t } from '@/lib/i18n' import { useFinancialModel } from '@/lib/hooks/useFinancialModel' import GradientText from '../ui/GradientText' import FadeInView from '../ui/FadeInView' import FinancialChart from '../ui/FinancialChart' import FinancialSliders from '../ui/FinancialSliders' import KPICard from '../ui/KPICard' import RunwayGauge from '../ui/RunwayGauge' import WaterfallChart from '../ui/WaterfallChart' import UnitEconomicsCards from '../ui/UnitEconomicsCards' import ScenarioSwitcher from '../ui/ScenarioSwitcher' import AnnualPLTable from '../ui/AnnualPLTable' import AnnualCashflowChart from '../ui/AnnualCashflowChart' type FinTab = 'overview' | 'guv' | 'cashflow' interface FinancialsSlideProps { lang: Language } export default function FinancialsSlide({ lang }: FinancialsSlideProps) { const i = t(lang) const fm = useFinancialModel() const [activeTab, setActiveTab] = useState('overview') const de = lang === 'de' const activeResults = fm.activeResults const summary = activeResults?.summary const lastResult = activeResults?.results[activeResults.results.length - 1] // Build scenario color map const scenarioColors: Record = {} fm.scenarios.forEach(s => { scenarioColors[s.id] = s.color }) // Build compare results (exclude active scenario) const compareResults = new Map( Array.from(fm.results.entries()).filter(([id]) => id !== fm.activeScenarioId) ) // Initial funding from assumptions const initialFunding = (fm.activeScenario?.assumptions.find(a => a.key === 'initial_funding')?.value as number) || 200000 const tabs: { id: FinTab; label: string }[] = [ { id: 'overview', label: de ? 'Uebersicht' : 'Overview' }, { id: 'guv', label: de ? 'GuV (Jahres)' : 'P&L (Annual)' }, { id: 'cashflow', label: de ? 'Cashflow & Finanzbedarf' : 'Cashflow & Funding' }, ] if (fm.loading) { return (
) } return (

{i.financials.title}

{i.financials.subtitle}

{/* Hero KPI Cards */}
= 3 ? 'up' : 'down'} color="#a855f7" delay={0.25} />
{/* Tab Navigation */}
{tabs.map((tab) => ( ))}
{/* Main content: 3-column layout */}
{/* Left: Charts (8 columns) */}
{/* TAB: Overview — monatlicher Chart + Waterfall + Unit Economics */} {activeTab === 'overview' && ( <>

{de ? 'Umsatz vs. Kosten (60 Monate)' : 'Revenue vs. Costs (60 months)'}

{de ? 'Umsatz' : 'Revenue'} {de ? 'Kosten' : 'Costs'} {de ? 'Kunden' : 'Customers'}

{de ? 'Cash-Flow (Quartal)' : 'Cash Flow (Quarterly)'}

{activeResults && }
{lastResult && ( a.key === 'churn_rate_monthly')?.value as number || 3} lang={lang} /> )}
)} {/* TAB: GuV — Annual P&L Table */} {activeTab === 'guv' && activeResults && (

{de ? 'Gewinn- und Verlustrechnung (5 Jahre)' : 'Profit & Loss Statement (5 Years)'}

{de ? 'Alle Werte in EUR' : 'All values in EUR'}

)} {/* TAB: Cashflow & Finanzbedarf */} {activeTab === 'cashflow' && activeResults && (

{de ? 'Jaehrlicher Cashflow & Finanzbedarf' : 'Annual Cash Flow & Funding Requirements'}

)}
{/* Right: Controls (4 columns) */}
{/* Scenario Switcher */}
{ fm.setActiveScenarioId(id) }} onToggleCompare={() => { if (!fm.compareMode) { fm.computeAll() } fm.setCompareMode(!fm.compareMode) }} lang={lang} />
{/* Assumption Sliders */}

{i.financials.adjustAssumptions}

{fm.activeScenario && ( { if (fm.activeScenarioId) { fm.updateAssumption(fm.activeScenarioId, key, value) } }} lang={lang} /> )} {fm.computing && (
{de ? 'Berechne...' : 'Computing...'}
)}
) }