import { Skeleton, Text } from '@moex-vibe/design-system' import { Box } from '@mui/material' import type { BrokerAnalytics, BrokerMoney } from '@/shared/api' import { formatDashboardCurrency, type MoneyTone, moneyTone } from '../lib/dashboardVisual' import { BrokerDashboardCard } from './BrokerDashboardCard' type AnalyticsField = | 'totalDeposits' | 'totalWithdrawn' | 'totalDividends' | 'totalCoupons' | 'totalFees' | 'totalTaxesPaid' const ANALYTICS_METRICS: readonly { field: AnalyticsField label: string testId: string }[] = [ { field: 'totalDeposits', label: 'Пополнения', testId: 'dashboard-analytics-totalDeposits' }, { field: 'totalWithdrawn', label: 'Выводы', testId: 'dashboard-analytics-totalWithdrawn' }, { field: 'totalDividends', label: 'Дивиденды', testId: 'dashboard-analytics-totalDividends' }, { field: 'totalCoupons', label: 'Купоны', testId: 'dashboard-analytics-totalCoupons' }, { field: 'totalFees', label: 'Комиссия', testId: 'dashboard-analytics-totalFees' }, { field: 'totalTaxesPaid', label: 'Уплаченные налоги', testId: 'dashboard-analytics-totalTaxesPaid', }, ] function analyticsTone(field: AnalyticsField, value: number): MoneyTone { if (field === 'totalFees' || field === 'totalTaxesPaid') return 'negative' if (field === 'totalWithdrawn') { return value > 0 ? 'negative' : moneyTone(value) } return moneyTone(value) } function analyticsDisplay(field: AnalyticsField, value: number, currency: string): string { if (field === 'totalFees' || field === 'totalTaxesPaid') { const formatted = formatDashboardCurrency({ currency, value: Math.abs(value) }) return `\u2212${formatted}` } const formatted = formatDashboardCurrency({ currency, value }) if (field === 'totalWithdrawn' && value > 0) return `\u2212${formatted}` return formatted } export function BrokerDashboardAnalyticsCard({ data, portfolioValue, isLoading, isError, }: { data: BrokerAnalytics | undefined portfolioValue?: BrokerMoney isLoading: boolean isError: boolean }) { return ( {isError ? ( Не удалось загрузить аналитику ) : isLoading ? ( ) : !data ? ( Нет данных для аналитики ) : ( Стоимость портфеля {formatDashboardCurrency({ currency: portfolioValue?.currency ?? data.currency, value: portfolioValue?.value ?? 0, })} Всего доходов {formatDashboardCurrency({ currency: data.currency, value: data.totalDividends + data.totalCoupons, })} {ANALYTICS_METRICS.map(({ field, label, testId }) => { const value = data[field] const tone = analyticsTone(field, value) return ( {label} {analyticsDisplay(field, value, data.currency)} ) })} )} ) }