'use client' import { useEffect } from 'react' import { ChevronDown, ChevronRight, Minimize2 } from 'lucide-react' import { AnnualRow, MonthlyRow, AccountingStandard, fmt, fmtMonth, getLineItems, MONTH_NAMES_DE, MONTH_NAMES_EN, } from './AnnualPLTable.types' interface AnnualTableProps { rows: AnnualRow[] lang: 'de' | 'en' expandedYear: number | null onToggleYear: (year: number) => void monthlyData: Map isFullscreen: boolean standard: AccountingStandard } export function AnnualTable({ rows, lang, expandedYear, onToggleYear, monthlyData, isFullscreen, standard, }: AnnualTableProps) { const de = lang === 'de' const monthNames = de ? MONTH_NAMES_DE : MONTH_NAMES_EN const lineItems = getLineItems(lang, standard) const monthlyExtraItems: { label: string; key: keyof MonthlyRow; isBold?: boolean }[] = isFullscreen ? [ { label: 'MRR', key: 'mrr', isBold: true }, { label: de ? 'Cash-Bestand' : 'Cash Balance', key: 'cashBalance', isBold: true }, ] : [] const textSize = isFullscreen ? 'text-xs' : 'text-[11px]' const minColWidth = isFullscreen ? 'min-w-[70px]' : 'min-w-[80px]' return ( {rows.map(r => ( ))} {lineItems.map((item) => ( {rows.map(r => { const val = r[item.key] as number return ( ) })} ))} {/* Monthly Drill-Down */} {expandedYear && monthlyData.has(expandedYear) && ( {monthlyData.get(expandedYear)!.map(m => ( ))} {lineItems.map((item) => { const mKey = item.monthKey if (!mKey) return null return ( {monthlyData.get(expandedYear)!.map(m => { const val = m[mKey] as number return ( ) })} ) })} {monthlyExtraItems.map((item) => ( {monthlyData.get(expandedYear)!.map(m => { const val = m[item.key] as number return ( ) })} ))} )}
{standard === 'hgb' ? (de ? 'GuV-Position (HGB)' : 'P&L Line Item (HGB)') : (de ? 'GuV-Position (US GAAP)' : 'P&L Line Item (US GAAP)') } onToggleYear(r.year)} title={de ? 'Klicken fuer Monatsdetails' : 'Click for monthly details'} > {expandedYear === r.year ? ( ) : ( )} {r.year}
{item.label} 0 && item.key === 'ebitda' ? 'text-emerald-400' : ''} ${!item.isPercent && !item.isBold ? 'text-white/60' : 'text-white'} `} > {item.isPercent ? `${val.toFixed(1)}%` : (item.isNegative && val > 0 ? '-' : '') + fmt(Math.abs(val)) }

{de ? `Monatsdetails ${expandedYear}` : `Monthly Details ${expandedYear}`}

{de ? 'Monat' : 'Month'} {monthNames[m.monthInYear - 1]}
{item.label} 0 && item.key === 'ebitda' ? 'text-emerald-400/70' : ''} ${!item.isPercent ? 'text-white/40' : ''} `} > {item.isPercent ? `${val.toFixed(0)}%` : (item.isNegative && val > 0 ? '-' : '') + fmtMonth(Math.abs(val)) }
{item.label} {fmtMonth(Math.round(val))}
) } interface FullscreenOverlayProps { children: React.ReactNode onClose: () => void lang: 'de' | 'en' standard: AccountingStandard onStandardChange: (s: AccountingStandard) => void } export function FullscreenOverlay({ children, onClose, lang, standard, onStandardChange, }: FullscreenOverlayProps) { const de = lang === 'de' // ESC to close useEffect(() => { const handler = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose() } window.addEventListener('keydown', handler) return () => window.removeEventListener('keydown', handler) }, [onClose]) return (

{de ? 'Gewinn- und Verlustrechnung' : 'Profit & Loss Statement'}

{de ? 'Klicke auf ein Jahr um die Monatsdetails zu sehen · ESC zum Schliessen' : 'Click on a year to see monthly details · ESC to close'}

{/* HGB / US GAAP Toggle */}
{children}
) }