'use client' import { useState, useEffect, useCallback } from 'react' import { useTranslations } from 'next-intl' import { Card, CardContent } from '@/components/ui/card' import { Skeleton } from "@/components/ui/skeleton" import { FiscalYearSelector } from '@/components/common/FiscalYearSelector' import { KPIHeroCards } from '@/components/kpi/KPIHeroCards' import { KPITrendChart } from '@/components/kpi/KPITrendChart' import { KPIExpenseMixChart } from '@/components/kpi/KPIExpenseMixChart' import { KPITopSuppliersChart } from '@/components/kpi/KPITopSuppliersChart' import { KPISettingsDialog } from '@/components/kpi/KPISettingsDialog' import { getDefaultPreferences } from '@/lib/reports/kpi-definitions' import type { KPIReport, KPIPreferences } from '@/types' export default function KpiPage() { const t = useTranslations('kpi') const [selectedPeriod, setSelectedPeriod] = useState('') const [report, setReport] = useState(null) const [preferences, setPreferences] = useState(getDefaultPreferences()) const [isLoadingReport, setIsLoadingReport] = useState(false) const [isSavingPrefs, setIsSavingPrefs] = useState(false) const [error, setError] = useState(null) useEffect(() => { let cancelled = false ;(async () => { try { const res = await fetch('/api/kpi/preferences') const { data } = await res.json() if (!cancelled && data) setPreferences(data) } catch { // Silently fall back to defaults } })() return () => { cancelled = true } }, []) const fetchReport = useCallback(async (periodId: string) => { setIsLoadingReport(true) setError(null) try { const res = await fetch(`/api/reports/kpi?period_id=${periodId}`) if (!res.ok) throw new Error(t('fetch_failed')) const { data } = await res.json() setReport(data) } catch { setError(t('fetch_failed')) } finally { setIsLoadingReport(false) } }, [t]) useEffect(() => { if (!selectedPeriod) return let cancelled = false fetchReport(selectedPeriod).then(() => { if (cancelled) setReport(null) }) return () => { cancelled = true } }, [selectedPeriod, fetchReport]) async function handleSavePreferences(prefs: KPIPreferences) { setIsSavingPrefs(true) try { const res = await fetch('/api/kpi/preferences', { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(prefs), }) if (!res.ok) throw new Error() const { data } = await res.json() setPreferences(data) if (selectedPeriod) await fetchReport(selectedPeriod) } catch { // Silently fail — user can retry } finally { setIsSavingPrefs(false) } } return (

{t('title')}

setSelectedPeriod(id || '')} includeAllOption={false} hideFuturePeriods /> {error && (

{error}

)} {isLoadingReport && } {!isLoadingReport && !error && report && ( <> {report.months.length > 0 && }
)}
) } function LoadingSkeleton() { return (
{[1, 2, 3, 4].map((i) => ( ))}
{[1, 2].map((i) => ( ))}
) }