import { MainLayout } from '@/components/layout/MainLayout.tsx'; import PageHeader from '@/components/layout/PageHeader.tsx'; import Badge from '@/components/ui/Badge.tsx'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card.tsx'; import Spinner from '@/components/ui/Spinner.tsx'; import { Container, Flex, Grid, Stack } from '@/components/ui/layout'; import { useImpactMetrics, usePlatformStatistics } from '@/hooks/api/useAnalyticsAPI.ts'; import { useTranslation } from '@/hooks/useI18n.tsx'; import { useNavigation } from '@/hooks/useNavigation.tsx'; import { Award, Briefcase, DollarSign, Globe, Target, TrendingUp, Zap } from 'lucide-react'; import { useMemo } from 'react'; import { formatCurrency, formatNumber } from '../lib/fin'; // Types for impact metrics data interface TopImpactingMatch { id?: string; description?: string; resource_type?: string; co2_impact?: number; economic_impact?: number; } interface YearlyProjection { co2_projected?: number; economic_projected?: number; } interface MonthlyImpact { month?: string; co2_savings?: number; economic_value?: number; } interface ResourceImpact { resource_type?: string; co2_impact?: number; economic_impact?: number; count?: number; } // Simple visualization component for impact breakdown const ImpactBreakdownChart = ({ data, title, color = 'hsl(var(--primary))', }: { data: Record; title: string; color?: string; }) => { const entries = Object.entries(data); const maxValue = Math.max(...entries.map(([, value]) => value)); return (

{title}

{entries.map(([key, value]) => (
{key.replace('_', ' ')}
{formatNumber(value)}
))}
); }; const ImpactMetrics = () => { const { t } = useTranslation(); const { handleBackNavigation, handleFooterNavigate } = useNavigation(); const { data: impactMetrics, isLoading: isLoadingImpact } = useImpactMetrics(); const { data: platformStats, isLoading: isLoadingPlatform } = usePlatformStatistics(); const isLoading = isLoadingImpact || isLoadingPlatform; // Process impact data const impact = useMemo(() => { const data = impactMetrics || ({} as typeof impactMetrics); const platform = platformStats || ({} as typeof platformStats); return { // Core impact metrics totalCo2Saved: data.total_co2_savings_tonnes || 0, totalEconomicValue: data.total_economic_value_eur || 0, activeMatchesCount: data.active_matches_count || 0, totalOrganizations: platform.total_organizations || 0, // Environmental breakdown environmentalBreakdown: data.environmental_breakdown || {}, co2BySector: {} as Record, co2ByResourceType: {} as Record, // Economic metrics economicBreakdown: {} as Record, avgValuePerMatch: data.total_economic_value_eur && data.active_matches_count ? data.total_economic_value_eur / data.active_matches_count : 0, // Impact over time monthlyImpact: [] as MonthlyImpact[], yearlyProjections: {} as Record, // Resource-specific impacts resourceImpacts: [] as ResourceImpact[], topImpactingMatches: [] as TopImpactingMatch[], }; }, [impactMetrics, platformStats]); // Impact category icons const getCategoryIcon = (category: string) => { switch (category.toLowerCase()) { case 'energy': case 'electricity': case 'heat': return ; case 'transport': case 'logistics': return ; case 'industrial': case 'manufacturing': return ; case 'buildings': case 'construction': return ; case 'waste': case 'biowaste': return ; default: return ; } }; const getCategoryColor = (category: string) => { switch (category.toLowerCase()) { case 'energy': case 'electricity': case 'heat': return 'text-yellow-600 bg-yellow-50 border-yellow-200'; case 'transport': case 'logistics': return 'text-blue-600 bg-blue-50 border-blue-200'; case 'industrial': case 'manufacturing': return 'text-gray-600 bg-gray-50 border-gray-200'; case 'buildings': case 'construction': return 'text-green-600 bg-green-50 border-green-200'; case 'waste': case 'biowaste': return 'text-amber-600 bg-amber-50 border-amber-200'; default: return 'text-primary bg-primary/5 border-primary/20'; } }; return ( {/* Key Impact Indicators */}

{t('impactMetrics.co2Saved')}

{formatNumber(impact.totalCo2Saved)}

{t('impactMetrics.tonnesPerYear')}

{t('impactMetrics.economicValue')}

{formatCurrency(impact.totalEconomicValue)}

{t('impactMetrics.createdAnnually')}

{t('impactMetrics.activeMatches')}

{formatNumber(impact.activeMatchesCount)}

{t('impactMetrics.operational')}

{t('impactMetrics.avgValuePerMatch')}

{formatCurrency(impact.avgValuePerMatch)}

{t('impactMetrics.perMatch')}
{/* Environmental Impact Breakdown */} {t('impactMetrics.environmentalBreakdown')} {isLoading ? (
) : Object.keys(impact.environmentalBreakdown).length > 0 ? (
) : (

{t('impactMetrics.noEnvironmentalData')}

)}
{/* Economic Impact Breakdown */} {t('impactMetrics.economicBreakdown')} {isLoading ? (
) : Object.keys(impact.economicBreakdown).length > 0 ? ( ) : (

{t('impactMetrics.noEconomicData')}

)}
{/* Top Impacting Matches */} {impact.topImpactingMatches.length > 0 && ( {t('impactMetrics.topImpactingMatches')}
{impact.topImpactingMatches .slice(0, 5) .map((match: TopImpactingMatch, index: number) => (
{index + 1}

{match.description || `Match ${match.id || index}`}

{match.resource_type}

{t('impactMetrics.co2Tonnes', { value: formatNumber(match.co2_impact || 0), })}

{formatCurrency(match.economic_impact || 0)}

))}
)} {/* Impact Categories Overview */} {t('impactMetrics.impactCategoriesOverview')}
{Object.entries(impact.environmentalBreakdown).map(([category, value]) => (
{getCategoryIcon(category)} {category.replace('_', ' ')}
{formatNumber(value as number)}

{t('impactMetrics.tonnesCo2Reduced')}

))}
{/* Projections and Goals */} {/* Yearly Projections */} {t('impactMetrics.yearlyProjections')} {Object.keys(impact.yearlyProjections).length > 0 ? (
{Object.entries(impact.yearlyProjections).map( ([year, projection]: [string, YearlyProjection]) => (
{year}
{t('impactMetrics.co2Tonnes', { value: formatNumber(projection.co2_projected || 0), })}
{formatCurrency(projection.economic_projected || 0)}
) )}
) : (

{t('impactMetrics.noProjectionData')}

)}
{/* Impact Achievements */} {t('impactMetrics.achievements')}
{t('impactMetrics.carbonReduction')}

{impact.totalCo2Saved >= 1000 ? t('impactMetrics.majorContributor') : t('impactMetrics.growingImpact')}

{t('impactMetrics.economicGrowth')}

{impact.totalEconomicValue >= 1000000 ? t('impactMetrics.significantEconomicValue') : t('impactMetrics.economicBenefits')}

{t('impactMetrics.networkGrowth')}

{t('impactMetrics.activeConnections', { count: impact.activeMatchesCount })}

); }; export default ImpactMetrics;