/* ============================================================
   HUD — altitude axis, hero multiplier, wager/MOON, boost gauge.
   Exports window.AltAxis, window.HeroMult, window.WagerChip,
           window.BoostGauge, window.ControlButtons, window.BalancePill
   ============================================================ */
(function () {
  const { useState, useEffect, useRef } = React;
  const E = window.Engine;

  /* ---- canonical count-up hook (eases value -> target). Shared by overlays + HUD. ---- */
  window.useCountUp = function useCountUp(target, run, ms = 1100) {
    const [val, setVal] = useState(0);
    useEffect(() => {
      if (!run) { setVal(0); return; }
      let raf; const t0 = performance.now();
      const step = (now) => {
        const p = Math.min(1, (now - t0) / ms);
        const e = 1 - Math.pow(1 - p, 3);
        setVal(target * e);
        if (p < 1) raf = requestAnimationFrame(step);
      };
      raf = requestAnimationFrame(step);
      return () => cancelAnimationFrame(raf);
    }, [target, run, ms]);
    return val;
  };

  /* ---- right-edge altitude axis (trading-chart style) ---- */
  window.AltAxis = function AltAxis({ mult, altKm, speed }) {
    // ticks: show checkpoints near the current window of multiplier
    const ticks = E.CHECKPOINTS.filter(c => c.m <= Math.max(2.2, mult * 1.6) + 0.3 && c.m >= mult - 0.8);
    const lo = mult - 0.8, hi = Math.max(2.2, mult * 1.6) + 0.3;
    const yFor = (m) => 100 - ((m - lo) / (hi - lo)) * 100; // 0 top .. 100 bottom
    const a = E.fmtAlt(altKm);
    return (
      <div className="alt-axis">
        <div className="track" />
        {ticks.map((c, i) => (
          <div key={i} className={'alt-tick' + (c.type === 'major' ? ' cp' : '')} style={{ top: yFor(c.m) + '%', opacity: Math.abs(c.m - mult) < 0.05 ? 1 : 0.7 }}>
            <span className="tx">{c.m.toFixed(2)}x</span><span className="ln" />
          </div>
        ))}
        <div className="alt-read">
          <div className="lab">ALT</div>
          <div className="num">{a.num}<span className="unit"> {a.unit}</span></div>
          <div className="spd">▲ {speed.toFixed(2)}x/s</div>
        </div>
      </div>
    );
  };

  /* ---- hero multiplier in the sky ---- */
  window.HeroMult = function HeroMult({ mult, moon, capLabel, pulse }) {
    const col = E.multColor(mult);
    return (
      <div className="hero-mult">
        <div className="val" style={{ color: col, transform: pulse ? 'scale(1.12)' : 'scale(1)' }}>
          {E.fmtMult(mult)}<span className="x">x</span>
        </div>
        <div className="cap">{capLabel || ' '}</div>
        <div className="moon-pay"><span className="moon-coin" />{E.fmtMoonFull(moon)} MOON</div>
      </div>
    );
  };

  /* ---- wager chip ---- */
  window.WagerChip = function WagerChip({ wagerSol }) {
    return (
      <div className="wager">
        <div className="lab">YOUR WAGER</div>
        <div className="amt"><SolMark />{wagerSol.toFixed(2)} SOL</div>
        <div className="rate">1 SOL = 800,000 MOON</div>
      </div>
    );
  };

  window.BalancePill = function BalancePill({ balance, targetRef }) {
    return (
      <div className="bal-pill" ref={targetRef}>
        <span className="moon-coin" /><span className="v">{E.fmtMoon(balance)}</span>
      </div>
    );
  };

  function SolMark() {
    return (
      <svg className="sol-mark" viewBox="0 0 24 24" fill="none">
        <defs><linearGradient id="solg" x1="0" y1="0" x2="24" y2="24"><stop offset="0" stopColor="#9945FF" /><stop offset="1" stopColor="#14F195" /></linearGradient></defs>
        <path d="M5 7.5h12l-2 2.2H3zM5 11h12l-2 2.2H3zM7 14.3h12l-2 2.2H5z" fill="url(#solg)" />
      </svg>
    );
  }

  /* ---- boost gauge ---- */
  window.BoostGauge = function BoostGauge({ power, cadence, greenTimeMs, hot, inGreen }) {
    const B = E.BOOST;
    const pct = Math.min(100, power);
    return (
      <div className={'gauge' + (hot ? ' hot' : '') + (inGreen ? ' perfect' : '')}>
        <div className="green-band" style={{ left: B.greenLo + '%', width: (B.greenHi - B.greenLo) + '%' }} />
        <div className="fill" style={{ width: pct + '%' }} />
        <div className="needle" style={{ left: pct + '%' }} />
        <div className="cad">{cadence}</div>
        {greenTimeMs > 0 && <div className="gtime">+{(greenTimeMs / 1000).toFixed(2)}s</div>}
      </div>
    );
  };

  /* ---- checkpoint payout burst (floats up at major landmarks) ---- */
  window.CheckpointBurst = function CheckpointBurst({ burst }) {
    if (!burst) return null;
    return (
      <div className="cp-burst" key={burst.key}>
        <span className="cp-burst-amt"><span className="moon-coin" />+{E.fmtMoon(burst.amount)}</span>
        <span className="cp-burst-lab">{burst.label}</span>
      </div>
    );
  };

  /* ---- boost + eject buttons ---- */
  window.ControlButtons = function ControlButtons({ onBoost, onEject, flying, rippleKey }) {
    return (
      <div className="btn-row">
        <button className="gbtn gbtn--boost" onPointerDown={(e) => { e.preventDefault(); onBoost(); }} disabled={!flying}>
          <span className="boost-ripple" key={rippleKey} style={{ animation: rippleKey ? 'bripple .3s ease-out' : 'none' }} />
          BOOST<span className="sub">tap to thrust</span>
        </button>
        <button className="gbtn gbtn--eject" onPointerDown={(e) => { e.preventDefault(); onEject(); }} disabled={!flying}>
          EJECT<span className="sub">cash out</span>
        </button>
      </div>
    );
  };
})();
