'use client' import { Language } from '@/lib/types' import { useFinancialModel } from '@/lib/hooks/useFinancialModel' import { t } from '@/lib/i18n' import GradientText from '../ui/GradientText' import FadeInView from '../ui/FadeInView' import GlassCard from '../ui/GlassCard' import { SlidersHorizontal, TrendingUp, TrendingDown, Minus } from 'lucide-react' interface AssumptionsSlideProps { lang: Language } interface SensitivityResult { label: string base: string bull: string bear: string } export default function AssumptionsSlide({ lang }: AssumptionsSlideProps) { const i = t(lang) const fm = useFinancialModel() const de = lang === 'de' const baseScenario = fm.scenarios.find(s => s.name === 'Base Case') const bullScenario = fm.scenarios.find(s => s.name === 'Bull Case') const bearScenario = fm.scenarios.find(s => s.name === 'Bear Case') function getVal(scenario: typeof baseScenario, key: string): string { if (!scenario) return '-' const a = scenario.assumptions.find(a => a.key === key) if (!a) return '-' const v = a.value if (typeof v === 'number') return String(v) return String(v) } const rows: SensitivityResult[] = [ { label: de ? 'Monatliches Wachstum' : 'Monthly Growth Rate', base: getVal(baseScenario, 'monthly_growth_rate') + '%', bull: getVal(bullScenario, 'monthly_growth_rate') + '%', bear: getVal(bearScenario, 'monthly_growth_rate') + '%', }, { label: de ? 'Monatliche Churn Rate' : 'Monthly Churn Rate', base: getVal(baseScenario, 'churn_rate_monthly') + '%', bull: getVal(bullScenario, 'churn_rate_monthly') + '%', bear: getVal(bearScenario, 'churn_rate_monthly') + '%', }, { label: de ? 'Startkunden' : 'Initial Customers', base: getVal(baseScenario, 'initial_customers'), bull: getVal(bullScenario, 'initial_customers'), bear: getVal(bearScenario, 'initial_customers'), }, { label: 'ARPU Mini', base: getVal(baseScenario, 'arpu_mini') + ' EUR', bull: getVal(bullScenario, 'arpu_mini') + ' EUR', bear: getVal(bearScenario, 'arpu_mini') + ' EUR', }, { label: 'ARPU Studio', base: getVal(baseScenario, 'arpu_studio') + ' EUR', bull: getVal(bullScenario, 'arpu_studio') + ' EUR', bear: getVal(bearScenario, 'arpu_studio') + ' EUR', }, { label: 'ARPU Cloud', base: getVal(baseScenario, 'arpu_cloud') + ' EUR', bull: getVal(bullScenario, 'arpu_cloud') + ' EUR', bear: getVal(bearScenario, 'arpu_cloud') + ' EUR', }, { label: 'CAC', base: getVal(baseScenario, 'cac') + ' EUR', bull: getVal(bullScenario, 'cac') + ' EUR', bear: getVal(bearScenario, 'cac') + ' EUR', }, { label: de ? 'Produktmix Mini/Studio/Cloud' : 'Product Mix Mini/Studio/Cloud', base: `${getVal(baseScenario, 'product_mix_mini')}/${getVal(baseScenario, 'product_mix_studio')}/${getVal(baseScenario, 'product_mix_cloud')}`, bull: `${getVal(bullScenario, 'product_mix_mini')}/${getVal(bullScenario, 'product_mix_studio')}/${getVal(bullScenario, 'product_mix_cloud')}`, bear: `${getVal(bearScenario, 'product_mix_mini')}/${getVal(bearScenario, 'product_mix_studio')}/${getVal(bearScenario, 'product_mix_cloud')}`, }, { label: de ? 'Marketing / Monat' : 'Marketing / Month', base: getVal(baseScenario, 'marketing_monthly') + ' EUR', bull: getVal(bullScenario, 'marketing_monthly') + ' EUR', bear: getVal(bearScenario, 'marketing_monthly') + ' EUR', }, ] // Summary KPIs from computed results const baseSummary = fm.results.get(baseScenario?.id || '')?.summary const bullSummary = fm.results.get(bullScenario?.id || '')?.summary const bearSummary = fm.results.get(bearScenario?.id || '')?.summary return (

{de ? 'Anhang' : 'Appendix'}

{i.annex.assumptions.title}

{i.annex.assumptions.subtitle}

{/* Sensitivity Table */} {rows.map((row, idx) => ( ))}
{de ? 'Annahme' : 'Assumption'} Bear Base Bull
{row.label} {row.bear} {row.base} {row.bull}
{/* Outcome Summary */} {baseSummary && (
{[ { label: 'Bear', summary: bearSummary, color: 'text-red-400', bg: 'bg-red-500/5 border-red-500/10' }, { label: 'Base', summary: baseSummary, color: 'text-indigo-400', bg: 'bg-indigo-500/5 border-indigo-500/10' }, { label: 'Bull', summary: bullSummary, color: 'text-emerald-400', bg: 'bg-emerald-500/5 border-emerald-500/10' }, ].map((s, idx) => (

{s.label} Case

ARR 2030 {s.summary ? `${(s.summary.final_arr / 1_000_000).toFixed(1)}M` : '-'}
{de ? 'Kunden 2030' : 'Customers 2030'} {s.summary?.final_customers?.toLocaleString('de-DE') || '-'}
Break-Even {s.summary?.break_even_month ? `${de ? 'Monat' : 'Month'} ${s.summary.break_even_month}` : (de ? 'Nicht erreicht' : 'Not reached')}
LTV/CAC {s.summary?.final_ltv_cac ? `${s.summary.final_ltv_cac.toFixed(1)}x` : '-'}
))}
)}
) }