File size: 3,642 Bytes
dec56a6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import { fmt, fmtSigned } from '../utils/format.js';

function Stat({ label, value, delta, deltaDir, hint }) {
  return (
    <div className="stat">
      <span className="label">{label}</span>
      <span className="value">{value}</span>
      {delta !== undefined && delta !== null && (
        <span className={`delta ${deltaDir || ''}`}>{delta}</span>
      )}
      {hint && <span className="hint">{hint}</span>}
    </div>
  );
}

function deltaArrow(curr, prev) {
  if (prev === undefined || prev === null) return { delta: undefined };
  const d = curr - prev;
  if (Math.abs(d) < 1e-6) return { delta: '·', dir: '' };
  return { delta: fmtSigned(d, Math.abs(d) < 1 ? 3 : 1), dir: d > 0 ? 'up' : 'down' };
}

export default function RoundOverview({ round, prevRound, summary }) {
  if (!round) return null;

  const treasuryDelta = deltaArrow(round.treasury_after, prevRound?.treasury_after);
  const prodDelta = deltaArrow(round.productivity, prevRound?.productivity);
  const popDelta = deltaArrow(round.population, prevRound?.population);
  const revDelta = deltaArrow(round.total_revenue, prevRound?.total_revenue);

  const treasuryHint = round.is_critical_failure
    ? 'frozen — failure before debit'
    : undefined;

  return (
    <div className="card">
      <h3>
        Round {round.round_num}
        <span className="meta">Y{round.year} · Q{round.quarter}</span>
      </h3>
      <div className="body">
        <div className="stat-grid">
          <Stat
            label="Treasury"
            value={fmt(round.treasury_after)}
            delta={treasuryDelta.delta}
            deltaDir={treasuryDelta.dir}
            hint={treasuryHint}
          />
          <Stat
            label="Total revenue"
            value={fmt(round.total_revenue)}
            delta={revDelta.delta}
            deltaDir={revDelta.dir}
          />
          <Stat
            label="Productivity"
            value={round.productivity.toFixed(3)}
            delta={prodDelta.delta}
            deltaDir={prodDelta.dir}
          />
          <Stat
            label="Population"
            value={fmt(round.population)}
            delta={popDelta.delta}
            deltaDir={popDelta.dir}
          />
          <Stat label="Allocations" value={fmt(round.total_allocation)} />
          <Stat label="Surplus returned" value={fmt(round.surplus_returned)} />
          <Stat label="Avg revenue ×" value={round.avg_revenue_factor.toFixed(2)} />
          <Stat label="Prosperity" value={(round.prosperity * 1000).toFixed(3) + ' /1k'} />
        </div>

        <div
          style={{
            borderTop: '1px solid var(--border)',
            paddingTop: 10,
            fontSize: 12,
            color: 'var(--text-dim)',
            display: 'grid',
            gridTemplateColumns: '1fr 1fr',
            gap: 6,
          }}
        >
          <div>Cumulative reward (so far)</div>
          <div style={{ textAlign: 'right', color: 'var(--text-hi)', fontFamily: 'var(--mono)' }}>
            {fmtSigned(round.cumulative_reward, 1)}
          </div>
          {round.done && summary && (
            <>
              <div>Final prosperity</div>
              <div style={{ textAlign: 'right', color: 'var(--text-hi)', fontFamily: 'var(--mono)' }}>
                {(summary.final_prosperity * 1000).toFixed(3)} /1k
              </div>
              <div>Termination</div>
              <div style={{ textAlign: 'right', color: 'var(--text-hi)', fontFamily: 'var(--mono)' }}>
                {summary.termination_reason}
              </div>
            </>
          )}
        </div>
      </div>
    </div>
  );
}