import React, { useMemo } from 'react'; import Plot from 'react-plotly.js'; import { useAnalysisStore } from '../../store/analysisStore'; import { useProjectStore } from '../../store/projectStore'; import MapViewer from '../map/MapViewer'; import './ScenarioComparison.css'; const ScenarioComparison: React.FC = () => { const scenarios = useAnalysisStore((s) => s.scenarios); const activeScenarioId = useAnalysisStore((s) => s.activeScenarioId); const projectState = useProjectStore((s) => s.state); const loadScenario = useAnalysisStore((s) => s.loadScenario); const deleteScenario = useAnalysisStore((s) => s.deleteScenario); // Group data for comparison charts const chartData = useMemo(() => { if (!scenarios || scenarios.length === 0) return null; const names = scenarios.map(sc => sc.name); const hotUtilities = scenarios.map(sc => sc.pinchResult?.hot_utility ?? 0); const coldUtilities = scenarios.map(sc => sc.pinchResult?.cold_utility ?? 0); const heatingSavings = scenarios.map(sc => sc.statusQuoResult?.heating_savings_pct ?? 0); const bestCOPs = scenarios.map(sc => { const caps = sc.hpiResult?.heat_pumps?.filter(hp => hp.available).map(hp => hp.cop ?? 0) || []; return caps.length > 0 ? Math.max(...caps) : 0; }); return { names, hotUtilities, coldUtilities, heatingSavings, bestCOPs }; }, [scenarios]); if (scenarios.length < 2) return null; return (

📊 Scenario Comparison Dashboard

Analyze and compare saved exploration states side-by-side

{/* 1. Scenario Cards - Now at Top */}
{scenarios.map((scen, idx) => { const isActive = scen.id === activeScenarioId; return (

loadScenario(idx)} style={{ cursor: 'pointer', margin: 0 }} title="Click to load this scenario"> {scen.name} {isActive && ACTIVE}

ΔTmin: {scen.tMin}K
{/* Map Preview */}
{}} onMoveEnd={() => {}} subprocessMapExpanded={{}} childMapExpanded={{}} selectionActive={false} selectedStreams={scen.selectedStreams} onProcessesSelect={() => {}} onSelectionToggle={() => {}} />
Pinch Temp. {scen.pinchResult?.pinch_temperature.toFixed(1)} °C
Heat Savings {scen.statusQuoResult?.heating_savings_pct.toFixed(1)}%
); })}
{/* 2. Combined Comparison Table - Now in Middle */}

📊 Combined Status Quo vs. Proposal Comparison

Aggregated performance data across all saved scenarios.

{scenarios.map((sc) => { const sq = sc.statusQuoResult; const pr = sc.pinchResult; const hpi = sc.hpiResult; const bestHP = hpi?.heat_pumps ?.filter(hp => hp.available) .sort((a, b) => (b.cop ?? 0) - (a.cop ?? 0))[0]; const hCov = (bestHP && pr && pr.hot_utility > 0) ? Math.min(100, (bestHP.q_sink ?? 0) / pr.hot_utility * 100) : 0; return ( ); })}
Scenario Heating (kW) Cooling (kW) Heat Recovery Potential HP Integration
Status Quo Pinch Min. Status Quo Pinch Min. Savings (kW) Savings (%) Best COP Coverage (%)
{sc.name} {sc.id === activeScenarioId && (Active)} {(sq?.total_current_heating ?? 0).toFixed(1)} {(pr?.hot_utility ?? 0).toFixed(1)} {(sq?.total_current_cooling ?? 0).toFixed(1)} {(pr?.cold_utility ?? 0).toFixed(1)} {(sq?.heating_savings_kW ?? 0).toFixed(1)} {(sq?.heating_savings_pct ?? 0).toFixed(1)}% {bestHP?.cop?.toFixed(2) || '—'} {hCov.toFixed(1)}%
{/* 3. Comparison Plots - Now at Bottom */} {chartData && (
)}
); }; export default ScenarioComparison;