import { useState, useCallback } from "react"; import { useTranslation } from "react-i18next"; import { useReports } from "../hooks/useReports"; import { PageHelp } from "../components/shared/PageHelp"; import type { ReportTab, CategoryBreakdownItem, DashboardPeriod } from "../shared/types"; import PeriodSelector from "../components/dashboard/PeriodSelector"; import MonthNavigator from "../components/budget/MonthNavigator"; import MonthlyTrendsChart from "../components/reports/MonthlyTrendsChart"; import CategoryBarChart from "../components/reports/CategoryBarChart"; import CategoryOverTimeChart from "../components/reports/CategoryOverTimeChart"; import BudgetVsActualTable from "../components/reports/BudgetVsActualTable"; import DynamicReport from "../components/reports/DynamicReport"; import TransactionDetailModal from "../components/shared/TransactionDetailModal"; const TABS: ReportTab[] = ["trends", "byCategory", "overTime", "budgetVsActual", "dynamic"]; function computeDateRange( period: DashboardPeriod, customDateFrom?: string, customDateTo?: string, ): { dateFrom?: string; dateTo?: string } { if (period === "all") return {}; if (period === "custom" && customDateFrom && customDateTo) { return { dateFrom: customDateFrom, dateTo: customDateTo }; } const now = new Date(); const year = now.getFullYear(); const month = now.getMonth(); const day = now.getDate(); const dateTo = `${year}-${String(month + 1).padStart(2, "0")}-${String(day).padStart(2, "0")}`; let from: Date; switch (period) { case "month": from = new Date(year, month, 1); break; case "3months": from = new Date(year, month - 2, 1); break; case "6months": from = new Date(year, month - 5, 1); break; case "year": from = new Date(year, 0, 1); break; case "12months": from = new Date(year, month - 11, 1); break; default: from = new Date(year, month, 1); break; } const dateFrom = `${from.getFullYear()}-${String(from.getMonth() + 1).padStart(2, "0")}-${String(from.getDate()).padStart(2, "0")}`; return { dateFrom, dateTo }; } export default function ReportsPage() { const { t } = useTranslation(); const { state, setTab, setPeriod, setCustomDates, navigateBudgetMonth, setPivotConfig } = useReports(); const [hiddenCategories, setHiddenCategories] = useState>(new Set()); const [detailModal, setDetailModal] = useState(null); const toggleHidden = useCallback((name: string) => { setHiddenCategories((prev) => { const next = new Set(prev); if (next.has(name)) next.delete(name); else next.add(name); return next; }); }, []); const showAll = useCallback(() => setHiddenCategories(new Set()), []); const viewDetails = useCallback((item: CategoryBreakdownItem) => { setDetailModal(item); }, []); const { dateFrom, dateTo } = computeDateRange(state.period, state.customDateFrom, state.customDateTo); return (

{t("reports.title")}

{state.tab === "budgetVsActual" ? ( ) : ( )}
{TABS.map((tab) => ( ))}
{state.error && (
{state.error}
)} {state.tab === "trends" && } {state.tab === "byCategory" && ( )} {state.tab === "overTime" && ( )} {state.tab === "budgetVsActual" && ( )} {state.tab === "dynamic" && ( )} {detailModal && ( setDetailModal(null)} /> )}
); }