import * as React from "react"; import { Box, Typography, ToggleButtonGroup, ToggleButton, Paper } from "@mui/material"; export interface ChartDataPoint { id: string; amount: number; compareAmount?: number; compareLabel?: string; highlighted?: boolean; } export interface ChartSeries { rolling: ChartDataPoint[]; calendar: ChartDataPoint[]; } export interface ChartData { daily: ChartDataPoint[]; weekly: ChartSeries; monthly: ChartSeries; } export interface HistoryChartProps { header: string; summary?: string; tabs: string[]; data: ChartData; period: "rolling" | "calendar"; onPeriodChange: (mode: "rolling" | "calendar") => void; comparison: boolean; setComparison: (mode: boolean) => void; } const formatDisplay = ( point: ChartDataPoint, tab: string, comparison: boolean ) => { const base = point.amount; const cmp = point.compareAmount ?? 0; const formatShort = (val: number) => { if (tab === "monthly") { if (val >= 100000) return `${(val / 100000).toFixed(2)}L`; } if (tab === "weekly") { if (val >= 1000) return `${(val / 1000).toFixed(1)}K`; } return val.toLocaleString("en-IN"); }; // Only hide diff when comparison OFF or compare is undefined if (!comparison) { return `₹ ${formatShort(base)}`; } const diff = base - cmp; const sign = diff >= 0 ? "+" : "-"; const absDiff = Math.abs(diff); return `₹ ${formatShort(base)} (${sign}${formatShort(absDiff)})`; }; const formatLabel = (label: string, type: string) => { if (type === "monthly") return label; if (type === "weekly") { const parts = label.split(" - "); if (parts.length === 2) { const [start, end] = parts; const startDay = start.split(" ")[0]; const endParts = end.split(" "); const endDay = endParts[0]; const month = endParts[1]; return `${startDay}–${endDay} ${month}`; } } return label; }; export default function HistoryChart({ header, summary, tabs, data, period, onPeriodChange, comparison, setComparison, }: HistoryChartProps) { const [activeTab, setActiveTab] = React.useState(tabs[0] || ""); const handleTabChange = (_: React.MouseEvent, newTab: string | null) => { if (newTab !== null) setActiveTab(newTab); }; const activeDataKey = activeTab.toLowerCase() as keyof ChartData; let rawData: ChartDataPoint[] = []; if (activeDataKey === "daily") { rawData = data.daily || []; } else { const section = data[activeDataKey]; rawData = section?.[period] || []; } const currentData = rawData; const maxAmount = currentData.length > 0 ? Math.max( ...currentData.flatMap((d) => comparison ? [d.amount, d.compareAmount || 0] : [d.amount] ), 1 ) : 1; return ( {header} {summary && ( {summary} )} {tabs.map((tab) => ( {tab} ))} v && onPeriodChange(v)} size="small" sx={{ mb: 2 }} > Rolling Calendar setComparison(v === "on")} size="small" sx={{ mb: 2 }} > Single Compare {currentData.length > 0 ? ( {currentData.map((point) => { const currentHeight = (point.amount / maxAmount) * 100; const compareHeight = ((point.compareAmount || 0) / maxAmount) * 100; return ( {comparison && ( )} {formatDisplay(point, activeTab.toLowerCase(), comparison)} {formatLabel(point.id, activeDataKey)} {point.compareLabel ? formatLabel(point.compareLabel, activeDataKey) : "placeholder"} ); })} ) : ( No Data Available )} ); }