// rev-parts.jsx — Revenue tab section components

const { HelpIcon } = window.OV2_UI;

const REV_T = {
  ru: {
    sec1: 'Snapshot',
    sec1sub: '10 главных метрик за 30 дней',
    sec2: 'Структура выручки',
    sec2sub: 'Откуда приходят деньги',
    sec3: 'Расходы',
    sec3sub: 'Куда уходят деньги — P&L по группам',
    sec4: 'Прибыльность',
    sec4sub: 'GOP × Загрузка по 5 домикам',
    sec5: 'Прогноз и What-if',
    sec5sub: 'Сценарии на 4 недели вперёд',

    snap: {
      gross: 'Валовая выручка',
      net: 'Чистая выручка',
      cogs: 'COGS',
      grossPr: 'Валовая прибыль',
      opex: 'OPEX',
      ebitda: 'EBITDA',
      ebMargin: 'EBITDA маржа',
      tax: 'Налоги',
      net2: 'Чистая прибыль',
      cash: 'Cash on hand',
    },
    mixWeeks: 'Динамика по неделям',
    mixDonut: 'Доли',
    sources: 'Источники выручки',
    th: { source: 'Источник', rev: 'Выручка', share: 'Доля', mom: 'Δ MoM' },
    plTitle: 'P&L по группам расходов',
    plDonut: 'Структура расходов',
    plTotal: 'Итого расходов',
    cabinAxisX: 'Загрузка →',
    cabinAxisY: 'GOP маржа ↑',
    qHigh: 'Топ',
    qLow: 'Слабые',
    qOcc: 'Загружены, но мало маржи',
    qMargin: 'Высокая маржа, но мало гостей',
    fcTitle: 'Прогноз выручки',
    fcSub: 'Факт + сценарии Low / Base / High',
    fcLegend: { actual: 'Факт', base: 'Базовый', low: 'Low', high: 'High' },
    whatif: 'What-if калькулятор',
    whatifBeta: 'beta',
    wPrice: 'Цена за ночь',
    wOcc: 'Загрузка',
    wADR: 'Доп. услуги на гостя',
    wResult: 'Результат на месяц',
    wRev: 'Выручка',
    wOpex: 'OPEX (фикс)',
    wGop: 'GOP',
    wMargin: 'Маржа',
    src: {
      'Размещение (5 домиков)': 'Размещение (5 домиков)',
      'СПА и процедуры': 'СПА и процедуры',
      'Завтраки и кейтеринг': 'Завтраки и кейтеринг',
      'Сувениры и доп. услуги': 'Сувениры и доп. услуги',
      'Аренда залов и события': 'Аренда залов и события',
    },
    pl: {
      'Персонал': 'Персонал',
      'Продукты и F&B': 'Продукты и F&B',
      'Коммуналка': 'Коммуналка',
      'Маркетинг': 'Маркетинг',
      'Содержание объекта': 'Содержание объекта',
      'Админ. и сервисы': 'Админ. и сервисы',
    },
  },
  en: {
    sec1: 'Snapshot',
    sec1sub: '10 key metrics for the last 30 days',
    sec2: 'Revenue mix',
    sec2sub: 'Where the money comes from',
    sec3: 'Expenses',
    sec3sub: 'Where the money goes — P&L by group',
    sec4: 'Profitability',
    sec4sub: 'GOP × Occupancy across 5 cabins',
    sec5: 'Forecast & What-if',
    sec5sub: 'Scenarios for the next 4 weeks',

    snap: {
      gross: 'Gross revenue',
      net: 'Net revenue',
      cogs: 'COGS',
      grossPr: 'Gross profit',
      opex: 'OPEX',
      ebitda: 'EBITDA',
      ebMargin: 'EBITDA margin',
      tax: 'Tax',
      net2: 'Net profit',
      cash: 'Cash on hand',
    },
    mixWeeks: 'Weekly trend',
    mixDonut: 'Shares',
    sources: 'Revenue sources',
    th: { source: 'Source', rev: 'Revenue', share: 'Share', mom: 'Δ MoM' },
    plTitle: 'P&L by expense group',
    plDonut: 'Expense breakdown',
    plTotal: 'Total expenses',
    cabinAxisX: 'Occupancy →',
    cabinAxisY: 'GOP margin ↑',
    qHigh: 'Stars',
    qLow: 'Weak',
    qOcc: 'Full but low margin',
    qMargin: 'High margin, low occupancy',
    fcTitle: 'Revenue forecast',
    fcSub: 'Actual + Low / Base / High scenarios',
    fcLegend: { actual: 'Actual', base: 'Base', low: 'Low', high: 'High' },
    whatif: 'What-if calculator',
    whatifBeta: 'beta',
    wPrice: 'Nightly price',
    wOcc: 'Occupancy',
    wADR: 'Add-ons per guest',
    wResult: 'Result for the month',
    wRev: 'Revenue',
    wOpex: 'OPEX (fixed)',
    wGop: 'GOP',
    wMargin: 'Margin',
    src: {
      'Размещение (5 домиков)': 'Lodging (5 cabins)',
      'СПА и процедуры': 'Spa & treatments',
      'Завтраки и кейтеринг': 'Breakfast & catering',
      'Сувениры и доп. услуги': 'Add-ons & retail',
      'Аренда залов и события': 'Events & venue rent',
    },
    pl: {
      'Персонал': 'Staff',
      'Продукты и F&B': 'F&B supplies',
      'Коммуналка': 'Utilities',
      'Маркетинг': 'Marketing',
      'Содержание объекта': 'Property maintenance',
      'Админ. и сервисы': 'Admin & services',
    },
  },
};

// ---------- Section 1: Snapshot strip (10 cards, EBITDA featured) ----------
function RevSnapshot({ state, lang }) {
  const t = REV_T[lang];
  const data = REV.snapshot[state] || REV.snapshot.default;
  const help = REV_HELP[lang];
  const ord = ['gross', 'net', 'cogs', 'grossPr', 'opex', 'ebitda', 'ebMargin', 'tax', 'net2', 'cash'];
  return (
    <section data-screen-label="Rev S1 Snapshot">
      <div className="rev-section-header">
        <div className="rev-section-title">{t.sec1}</div>
        <div className="rev-section-sub">{t.sec1sub}</div>
      </div>
      <div className="rev-snapshot">
        {ord.map((k) => {
          const d = data[k];
          const featured = k === 'ebitda';
          return (
            <div key={k} className={`rev-snap ${featured ? 'featured' : ''} ${d.alert ? 'alert' : ''}`}>
              <div className="rev-snap-label">
                <span>{t.snap[k]}</span>
                <HelpIcon help={help[k]} />
              </div>
              <div className={`rev-snap-value ${featured ? 'lg' : ''}`}>{d.value}</div>
              <div className={`rev-snap-delta ${d.sign}`}>{d.delta}</div>
            </div>
          );
        })}
      </div>
    </section>
  );
}

// ---------- Section 2: Revenue mix ----------
function StackedAreaChart({ data, width = 520, height = 200 }) {
  const { weeks, lodging, spa, fnb, other } = data;
  const totals = weeks.map((_, i) => lodging[i] + spa[i] + fnb[i] + other[i]);
  const max = Math.max(...totals);
  const w = width, h = height, pad = { l: 32, r: 8, t: 8, b: 22 };
  const cw = w - pad.l - pad.r;
  const ch = h - pad.t - pad.b;
  const xs = (i) => pad.l + (i / (weeks.length - 1)) * cw;
  const ys = (v) => pad.t + ch - (v / max) * ch;

  const layers = [
    { key: 'lodging', vals: lodging, color: 'var(--chart-1)' },
    { key: 'spa', vals: spa, color: 'var(--chart-2)' },
    { key: 'fnb', vals: fnb, color: 'var(--chart-3)' },
    { key: 'other', vals: other, color: 'var(--chart-4)' },
  ];

  const stacks = [];
  let acc = weeks.map(() => 0);
  layers.forEach(L => {
    const top = acc.map((a, i) => a + L.vals[i]);
    const path = [
      ...top.map((v, i) => `${i === 0 ? 'M' : 'L'}${xs(i)},${ys(v)}`),
      ...acc.slice().reverse().map((v, i) => `L${xs(weeks.length - 1 - i)},${ys(v)}`),
      'Z',
    ].join(' ');
    stacks.push({ ...L, path });
    acc = top;
  });

  const yTicks = [0, max * 0.5, max].map(v => ({ v, y: ys(v) }));

  return (
    <svg width="100%" viewBox={`0 0 ${w} ${h}`} style={{ display: 'block' }}>
      {yTicks.map((t, i) => (
        <g key={i}>
          <line x1={pad.l} x2={w - pad.r} y1={t.y} y2={t.y} stroke="var(--border)" strokeDasharray="2 3" />
          <text x={pad.l - 6} y={t.y + 3} fontSize="9" fill="var(--text-3)" textAnchor="end">
            €{Math.round(t.v / 1000)}k
          </text>
        </g>
      ))}
      {stacks.map(s => <path key={s.key} d={s.path} fill={s.color} opacity="0.85" />)}
      {weeks.map((wk, i) => i % 2 === 0 && (
        <text key={wk} x={xs(i)} y={h - 6} fontSize="9" fill="var(--text-3)" textAnchor="middle">{wk}</text>
      ))}
    </svg>
  );
}

function Donut({ slices, size = 120, thickness = 18 }) {
  const total = slices.reduce((s, x) => s + x.value, 0);
  const r = (size - thickness) / 2;
  const c = size / 2;
  const C = 2 * Math.PI * r;
  let off = 0;
  return (
    <svg width={size} height={size} viewBox={`0 0 ${size} ${size}`} style={{ transform: 'rotate(-90deg)' }}>
      <circle cx={c} cy={c} r={r} fill="none" stroke="var(--surface-alt)" strokeWidth={thickness} />
      {slices.map((s, i) => {
        const len = (s.value / total) * C;
        const dash = `${len} ${C - len}`;
        const el = (
          <circle
            key={i}
            cx={c} cy={c} r={r}
            fill="none"
            stroke={s.color}
            strokeWidth={thickness}
            strokeDasharray={dash}
            strokeDashoffset={-off}
          />
        );
        off += len;
        return el;
      })}
    </svg>
  );
}

function RevMix({ state, lang }) {
  const t = REV_T[lang];
  const help = REV_HELP[lang];
  const sources = REV.sources[state] || REV.sources.default;
  const totals = REV.mixSeries.weeks.map((_, i) =>
    REV.mixSeries.lodging[i] + REV.mixSeries.spa[i] + REV.mixSeries.fnb[i] + REV.mixSeries.other[i]
  );
  const totalSum = totals.reduce((s, v) => s + v, 0);

  const colors = ['var(--chart-1)', 'var(--chart-2)', 'var(--chart-3)', 'var(--chart-4)', 'var(--chart-5)'];
  const donutSlices = sources.map((s, i) => ({
    value: parseInt(s.rev.replace(/[^\d]/g, ''), 10),
    color: colors[i % colors.length],
  }));
  const donutTotal = donutSlices.reduce((s, x) => s + x.value, 0);

  return (
    <section data-screen-label="Rev S2 Mix">
      <div className="rev-section-header">
        <div className="rev-section-title">{t.sec2}</div>
        <div className="rev-section-sub">{t.sec2sub}</div>
      </div>
      <div className="rev-mix-grid">
        <div className="rev-card">
          <div className="rev-card-head">
            <div className="rev-card-title" style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
              {t.mixWeeks}<HelpIcon help={help.mixWeeks} />
            </div>
            <div className="rev-legend">
              <span><span className="rev-legend-dot" style={{ background: 'var(--chart-1)' }}></span>{t.src['Размещение (5 домиков)']}</span>
              <span><span className="rev-legend-dot" style={{ background: 'var(--chart-2)' }}></span>{t.src['СПА и процедуры']}</span>
              <span><span className="rev-legend-dot" style={{ background: 'var(--chart-3)' }}></span>{t.src['Завтраки и кейтеринг']}</span>
              <span><span className="rev-legend-dot" style={{ background: 'var(--chart-4)' }}></span>{t.src['Сувениры и доп. услуги']}</span>
            </div>
          </div>
          <StackedAreaChart data={REV.mixSeries} />
        </div>

        <div className="rev-card">
          <div className="rev-card-head">
            <div className="rev-card-title" style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
              {t.mixDonut}<HelpIcon help={help.mixDonut} />
            </div>
            <div className="rev-card-sub">€{Math.round(donutTotal / 1000)}k</div>
          </div>
          <div className="rev-donut-wrap">
            <Donut slices={donutSlices} />
            <div className="rev-donut-legend">
              {sources.map((s, i) => (
                <div key={s.name} className="rev-donut-row">
                  <span className="rev-legend-dot" style={{ background: colors[i] }}></span>
                  <span className="name">{t.src[s.name] || s.name}</span>
                  <span className="val">{s.share}%</span>
                </div>
              ))}
            </div>
          </div>
        </div>
      </div>

      <div className="rev-card" style={{ marginTop: 'var(--gap-card)' }}>
        <div className="rev-card-head">
          <div className="rev-card-title" style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
            {t.sources}<HelpIcon help={help.sources} />
          </div>
        </div>
        <table className="rev-table">
          <thead>
            <tr>
              <th>{t.th.source}</th>
              <th className="num">{t.th.rev}</th>
              <th>{t.th.share}</th>
              <th className="num">{t.th.mom}</th>
            </tr>
          </thead>
          <tbody>
            {sources.map((s, i) => (
              <tr key={s.name}>
                <td>{t.src[s.name] || s.name}</td>
                <td className="num">{s.rev}</td>
                <td>
                  <div className="rev-share-cell">
                    <span className="rev-share-bar" style={{ width: `${s.share * 1.4}px`, background: colors[i] }}></span>
                    <span className="pct">{s.share}%</span>
                  </div>
                </td>
                <td className="num" style={{ color: s.sign === 'pos' ? 'var(--pos)' : s.sign === 'neg' ? 'var(--neg)' : 'var(--text-2)' }}>{s.mom}</td>
              </tr>
            ))}
          </tbody>
        </table>
      </div>
    </section>
  );
}

// ---------- Section 3: Expenses (P&L + donut) ----------
function RevExpenses({ state, lang }) {
  const t = REV_T[lang];
  const help = REV_HELP[lang];
  const pl = REV.pl[state] || REV.pl.default;
  const [open, setOpen] = React.useState({ staff: true });
  const colors = ['var(--chart-1)', 'var(--chart-2)', 'var(--chart-3)', 'var(--chart-4)', 'var(--chart-5)', '#9CA3AF'];

  const totalSum = pl.reduce((s, g) => s + parseInt(g.total.replace(/[^\d]/g, ''), 10), 0);
  const donutSlices = pl.map((g, i) => ({
    value: parseInt(g.total.replace(/[^\d]/g, ''), 10),
    color: colors[i % colors.length],
  }));

  const toggle = (id) => setOpen((o) => ({ ...o, [id]: !o[id] }));

  return (
    <section data-screen-label="Rev S3 Expenses">
      <div className="rev-section-header">
        <div className="rev-section-title">{t.sec3}</div>
        <div className="rev-section-sub">{t.sec3sub}</div>
      </div>
      <div className="rev-exp-grid">
        <div className="rev-card">
          <div className="rev-card-head">
            <div className="rev-card-title" style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
              {t.plTitle}<HelpIcon help={help.plTitle} />
            </div>
            <div className="rev-card-sub">{t.plTotal}: €{totalSum.toLocaleString('en-US')}</div>
          </div>
          <div>
            {pl.map((g, gi) => {
              const isOpen = !!open[g.id];
              const isAlert = g.items.some((it) => it.alert);
              return (
                <React.Fragment key={g.id}>
                  <div className={`rev-pl-row ${isAlert ? 'alert' : ''}`} onClick={() => toggle(g.id)}>
                    <div className="rev-pl-label">
                      <span className={`rev-pl-caret ${isOpen ? 'open' : ''}`}>▶</span>
                      {t.pl[g.label] || g.label}
                    </div>
                    <div className="rev-pl-bar" style={{ width: 80 }}>
                      <span style={{ width: `${g.share * 1.5}%`, background: colors[gi] }}></span>
                    </div>
                    <div className="rev-pl-total">{g.total}</div>
                  </div>
                  {isOpen && g.items.map((it, ii) => (
                    <div key={ii} className="rev-pl-row subitem">
                      <div>{it.label}</div>
                      <div className="rev-pl-total">
                        {it.value}
                        <span className={`rev-pl-delta ${it.delta.startsWith('-') || it.delta.startsWith('−') ? 'pos' : it.alert ? 'neg' : 'flat'}`}>{it.delta}</span>
                      </div>
                    </div>
                  ))}
                </React.Fragment>
              );
            })}
          </div>
        </div>

        <div className="rev-card">
          <div className="rev-card-head">
            <div className="rev-card-title" style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
              {t.plDonut}<HelpIcon help={help.plDonut} />
            </div>
            <div className="rev-card-sub">€{Math.round(totalSum / 1000)}k</div>
          </div>
          <div className="rev-donut-wrap">
            <Donut slices={donutSlices} size={140} />
            <div className="rev-donut-legend">
              {pl.map((g, i) => (
                <div key={g.id} className="rev-donut-row">
                  <span className="rev-legend-dot" style={{ background: colors[i] }}></span>
                  <span className="name">{t.pl[g.label] || g.label}</span>
                  <span className="val">{g.share}%</span>
                </div>
              ))}
            </div>
          </div>
        </div>
      </div>
    </section>
  );
}

// ---------- Section 4: Profitability 2x2 ----------
function RevProfitability({ state, lang }) {
  const t = REV_T[lang];
  const help = REV_HELP[lang];
  const cabins = REV.cabins[state] || REV.cabins.default;
  const xMin = 40, xMax = 95;
  const yMin = 0, yMax = 45;

  const px = (occ) => ((occ - xMin) / (xMax - xMin)) * 100;
  const py = (gop) => 100 - ((gop - yMin) / (yMax - yMin)) * 100;

  return (
    <section data-screen-label="Rev S4 Profitability">
      <div className="rev-section-header">
        <div className="rev-section-title" style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
          {t.sec4}<HelpIcon help={help.matrix} />
        </div>
        <div className="rev-section-sub">{t.sec4sub}</div>
      </div>
      <div className="rev-2x2-wrap">
        <div className="rev-2x2">
          <div className="quadrant-bg q-tl"></div>
          <div className="quadrant-bg q-tr"></div>
          <div className="quadrant-bg q-bl"></div>
          <div className="quadrant-bg q-br"></div>
          <div className="axis-x" style={{ top: '50%' }}></div>
          <div className="axis-y" style={{ left: '50%' }}></div>

          <div className="q-label" style={{ top: 8, right: 12 }}>{t.qHigh}</div>
          <div className="q-label" style={{ bottom: 8, left: 12 }}>{t.qLow}</div>
          <div className="q-label" style={{ top: 8, left: 12 }}>{t.qMargin}</div>
          <div className="q-label" style={{ bottom: 8, right: 12 }}>{t.qOcc}</div>

          {cabins.map((c) => (
            <div
              key={c.id}
              className={`rev-cabin-dot ${c.flag === 'warn' ? 'warn' : c.flag === 'danger' ? 'danger' : ''} ${c.flag === 'star' ? 'star' : ''}`}
              style={{ left: `${px(c.occ)}%`, top: `${py(c.gop)}%` }}
              title={`${c.name} · ${c.rev} · GOP ${c.gop}% · Occ ${c.occ}%`}
            >
              <span>{c.name}</span>
              <span className="gop">{c.gop}%</span>
            </div>
          ))}

          <div className="rev-2x2-axislabel" style={{ bottom: -18, left: '50%', transform: 'translateX(-50%)' }}>{t.cabinAxisX}</div>
          <div className="rev-2x2-axislabel" style={{ top: '50%', left: -22, transform: 'translateY(-50%) rotate(-90deg)', transformOrigin: 'center' }}>{t.cabinAxisY}</div>
        </div>
      </div>
    </section>
  );
}

// ---------- Section 5: Forecast + What-if ----------
function ForecastChart({ data, lang }) {
  const t = REV_T[lang].fcLegend;
  const { weeks, actual, forecast, low, high } = data;
  const all = [...actual, ...forecast, ...low, ...high].filter(v => v !== null);
  const max = Math.max(...all) * 1.05;
  const min = 0;
  const w = 560, h = 220, pad = { l: 36, r: 12, t: 12, b: 26 };
  const cw = w - pad.l - pad.r, ch = h - pad.t - pad.b;
  const xs = (i) => pad.l + (i / (weeks.length - 1)) * cw;
  const ys = (v) => pad.t + ch - ((v - min) / (max - min)) * ch;

  const buildPath = (arr) => {
    let started = false;
    return arr.map((v, i) => {
      if (v === null) return '';
      const cmd = !started ? 'M' : 'L';
      started = true;
      return `${cmd}${xs(i)},${ys(v)}`;
    }).filter(Boolean).join(' ');
  };

  // Confidence band
  const bandPath = (() => {
    const top = high.map((v, i) => v !== null ? `${xs(i)},${ys(v)}` : null).filter(Boolean);
    const bot = low.map((v, i) => v !== null ? `${xs(i)},${ys(v)}` : null).filter(Boolean).reverse();
    if (!top.length) return '';
    return `M${top.join(' L')} L${bot.join(' L')} Z`;
  })();

  const yTicks = [0, max * 0.5, max].map(v => ({ v, y: ys(v) }));

  return (
    <svg width="100%" viewBox={`0 0 ${w} ${h}`} style={{ display: 'block' }}>
      {yTicks.map((tk, i) => (
        <g key={i}>
          <line x1={pad.l} x2={w - pad.r} y1={tk.y} y2={tk.y} stroke="var(--border)" strokeDasharray="2 3" />
          <text x={pad.l - 6} y={tk.y + 3} fontSize="9" fill="var(--text-3)" textAnchor="end">€{Math.round(tk.v / 1000)}k</text>
        </g>
      ))}
      <path d={bandPath} fill="var(--info)" opacity="0.10" />
      <path d={buildPath(low)} fill="none" stroke="var(--info)" strokeWidth="1" strokeDasharray="3 3" opacity="0.6" />
      <path d={buildPath(high)} fill="none" stroke="var(--info)" strokeWidth="1" strokeDasharray="3 3" opacity="0.6" />
      <path d={buildPath(forecast)} fill="none" stroke="var(--info)" strokeWidth="2" strokeDasharray="5 4" />
      <path d={buildPath(actual)} fill="none" stroke="var(--text)" strokeWidth="2" />

      {weeks.map((wk, i) => i % 2 === 0 && (
        <text key={wk} x={xs(i)} y={h - 8} fontSize="9" fill="var(--text-3)" textAnchor="middle">{wk}</text>
      ))}
    </svg>
  );
}

function WhatIf({ lang }) {
  const t = REV_T[lang];
  const help = REV_HELP[lang];
  const [price, setPrice] = React.useState(280);
  const [occ, setOcc] = React.useState(78);
  const [addons, setAddons] = React.useState(85);
  const nights = 30 * 5; // 30 days × 5 cabins
  const occNights = Math.round(nights * occ / 100);
  const lodging = price * occNights;
  const guestsApprox = Math.round(occNights * 2.2);
  const addonsRev = addons * guestsApprox;
  const revenue = lodging + addonsRev;
  const opex = 15203;
  const gop = revenue - opex;
  const margin = revenue > 0 ? Math.round((gop / revenue) * 100) : 0;
  const fmt = (v) => '€' + Math.round(v).toLocaleString('en-US');

  return (
    <div className="rev-card">
      <div className="rev-card-head">
        <div className="rev-card-title" style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
          {t.whatif}
          <span className="rev-whatif-badge">{t.whatifBeta}</span>
          <HelpIcon help={help.whatif} />
        </div>
      </div>
      <div className="rev-whatif">
        <div className="rev-whatif-row">
          <label>{t.wPrice}<b>€{price}</b></label>
          <input type="range" min="180" max="450" step="10" value={price} onChange={(e) => setPrice(+e.target.value)} />
        </div>
        <div className="rev-whatif-row">
          <label>{t.wOcc}<b>{occ}%</b></label>
          <input type="range" min="40" max="100" step="1" value={occ} onChange={(e) => setOcc(+e.target.value)} />
        </div>
        <div className="rev-whatif-row">
          <label>{t.wADR}<b>€{addons}</b></label>
          <input type="range" min="0" max="200" step="5" value={addons} onChange={(e) => setAddons(+e.target.value)} />
        </div>

        <div className="rev-whatif-result">
          <div className="row"><span>{t.wRev}</span><b>{fmt(revenue)}</b></div>
          <div className="row"><span>{t.wOpex}</span><b>−{fmt(opex)}</b></div>
          <div className="row total"><span>{t.wGop} · {margin}%</span><b style={{ color: gop >= 0 ? 'var(--pos)' : 'var(--neg)' }}>{fmt(gop)}</b></div>
        </div>
      </div>
    </div>
  );
}

function RevForecast({ state, lang }) {
  const t = REV_T[lang];
  const help = REV_HELP[lang];
  return (
    <section data-screen-label="Rev S5 Forecast">
      <div className="rev-section-header">
        <div className="rev-section-title">{t.sec5}</div>
        <div className="rev-section-sub">{t.sec5sub}</div>
      </div>
      <div className="rev-fc-grid">
        <div className="rev-card">
          <div className="rev-card-head">
            <div className="rev-card-title" style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
              {t.fcTitle}<HelpIcon help={help.fcTitle} />
            </div>
            <div className="rev-legend">
              <span><span className="rev-legend-dot" style={{ background: 'var(--text)' }}></span>{t.fcLegend.actual}</span>
              <span><span className="rev-legend-dot" style={{ background: 'var(--info)' }}></span>{t.fcLegend.base}</span>
              <span><span className="rev-legend-dot" style={{ background: 'var(--info)', opacity: 0.4 }}></span>{t.fcLegend.low} / {t.fcLegend.high}</span>
            </div>
          </div>
          <ForecastChart data={REV.forecast} lang={lang} />
          <div className="rev-card-sub">{t.fcSub}</div>
        </div>
        <WhatIf lang={lang} />
      </div>
    </section>
  );
}

window.RevSnapshot = RevSnapshot;
window.RevMix = RevMix;
window.RevExpenses = RevExpenses;
window.RevProfitability = RevProfitability;
window.RevForecast = RevForecast;
