"use client"; import { useState, useEffect } from "react"; import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, BarChart, Bar, ComposedChart, PieChart, Pie, Cell } from 'recharts'; import { useTranslation } from "@/lib/i18n"; import PageContainer from "@/components/ui/PageContainer"; export default function TeamLeadsDashboard() { const { t } = useTranslation(); const [chartData, setChartData] = useState([]); const [summaryData, setSummaryData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [selectedYear, setSelectedYear] = useState(null); useEffect(() => { fetchDashboardData(); }, [selectedYear]); const fetchDashboardData = async () => { try { const params = new URLSearchParams(); if (selectedYear) { params.append('year', selectedYear.toString()); } const url = `/api/dashboard${params.toString() ? '?' + params.toString() : ''}`; const response = await fetch(url); if (!response.ok) { throw new Error('Failed to fetch dashboard data'); } const data = await response.json(); setChartData(data.chartData || []); setSummaryData(data.summary || null); } catch (err) { setError(err.message); } finally { setLoading(false); } }; const currentYear = new Date().getFullYear(); const availableYears = []; for (let year = currentYear; year >= 2023; year--) { availableYears.push(year); } const handleYearChange = (year) => { setSelectedYear(year === 'all' ? null : parseInt(year)); }; const formatCurrency = (value) => { return new Intl.NumberFormat('pl-PL', { style: 'currency', currency: 'PLN', minimumFractionDigits: 0, maximumFractionDigits: 0 }).format(value); }; const CustomTooltip = ({ active, payload, label }) => { if (active && payload && payload.length) { // Find the monthly and cumulative values const monthlyData = payload.find(p => p.dataKey === 'value'); const cumulativeData = payload.find(p => p.dataKey === 'cumulative'); return (

{`${t('teamDashboard.monthLabel')} ${label}`}

{`${t('teamDashboard.monthlyValue')} ${monthlyData ? formatCurrency(monthlyData.value) : t('teamDashboard.na')}`}

{`${t('teamDashboard.cumulative')} ${cumulativeData ? formatCurrency(cumulativeData.value) : t('teamDashboard.na')}`}

); } return null; }; return (

{t('teamDashboard.title')}

{/* Year Filter */}

{t('teamDashboard.projectCompletionTitle')}

{loading ? (
{t('teamDashboard.loadingChart')}
) : error ? (
{t('teamDashboard.errorPrefix')} {error}
) : chartData.length === 0 ? (
{t('teamDashboard.noData')}
) : (
`${(value / 1000).toFixed(0)}k`} /> } />
)}
{/* Main Total Chart */}

{t('teamDashboard.totalPortfolio')}

{summaryData?.total ? (
`${name}: ${(percent * 100).toFixed(0)}%`} > formatCurrency(value)} />
) : (
{t('teamDashboard.noSummaryData')}
)} {summaryData?.total && (
{t('teamDashboard.realisedValue')}
{formatCurrency(summaryData.total.realisedValue)}
{t('teamDashboard.unrealisedValue')}
{formatCurrency(summaryData.total.unrealisedValue)}
)}
{/* Project Type Charts */}

{t('teamDashboard.byProjectType')}

{summaryData?.byType && Object.entries(summaryData.byType).map(([type, data]) => (

{t(`projectType.${type}`)}

{/* Mini pie chart */}
percent > 0.1 ? `${(percent * 100).toFixed(0)}%` : ''} > formatCurrency(value)} />
{t('teamDashboard.realised')} {formatCurrency(data.realisedValue)}
{t('teamDashboard.unrealised')} {formatCurrency(data.unrealisedValue)}
))}
{/* By Contract Section */} {summaryData?.byContract && Object.keys(summaryData.byContract).length > 0 && (

{t('teamDashboard.byContract')}

({ name: contractNumber, fullName: data.contract_name, realised: data.realisedValue, unrealised: data.unrealisedValue, total: data.totalValue }))} margin={{ top: 20, right: 30, left: 20, bottom: 100, }} > `${(value / 1000).toFixed(0)}k`} /> { if (active && payload && payload.length) { return (

{payload[0].payload.fullName}

{payload[0].payload.name}

{`${t('teamDashboard.realised')}: ${formatCurrency(payload[0].payload.realised)}`}

{`${t('teamDashboard.unrealised')}: ${formatCurrency(payload[0].payload.unrealised)}`}

{`${t('teamDashboard.total')}: ${formatCurrency(payload[0].payload.total)}`}

); } return null; }} />
)}
); }