const { useState: usePsBodyState, useEffect: usePsBodyEffect, useRef: usePsBodyRef } = React;

const PS_HU = new Intl.NumberFormat('hu-HU');
const PS_FIG = 'assets/vitruvian-sm.png';

const PS_SYSTEMS = [
  { id: 'ideg', cls: 'ps-lyr-nerve', side: 'l', label: 'IDEGRENDSZER', big: '86 milliárd', bigSub: 'idegsejt egyetlen testben',
    lines: ['kb. 100 billió szinaptikus kapcsolat', 'egy neuron kb. 7 000 másikkal beszél', 'az inger akár 120 m/s sebességgel fut'] },
  { id: 'er', cls: 'ps-lyr-vasc', side: 'l', label: 'ÉRRENDSZER', big: '100 000 km', bigSub: 'érhálózat — kétszer a Föld körül, kétszer',
    lines: ['kb. 7 500 liter vér naponta', 'kb. 100 000 szívverés naponta', 'egy vörösvértest kb. 120 napot él, majd cserélődik'] },
  { id: 'bel', cls: 'ps-lyr-gut', side: 'l', label: 'BÉLFLÓRA', big: '38 billió', bigSub: 'mikroba — nagyjából annyi, mint ahány sejted van',
    lines: ['kb. 1 000 faj, mindenkinél más összetételben', 'kb. 32 m² felület, amin a szervezet érintkezik velük', 'kb. 500 millió idegsejt a bélfalban'] },
  { id: 'sejt', cls: 'ps-lyr-cell', side: 'r', label: 'SEJTSZINT', big: '36 billió', bigSub: 'sejt, kb. 400 különböző típusban',
    lines: ['minden sejtben kb. 2 méter DNS, összetekerve', 'sejtenként kb. 1–3 milliárd fehérje dolgozik', 'másodpercenként kb. 3,8 millió sejt születik újra'] },
  { id: 'szerk', cls: 'ps-lyr-bone', side: 'r', label: 'SZERKEZET', big: '78 szerv', bigSub: '11 szervrendszerbe rendezve',
    lines: ['206 csont, kb. 600 izom', 'kb. 100 000 milliárd kémiai reakció másodpercenként', 'egyetlen rendszer sem működik a többi nélkül'] },
];

const PS_LIVE = [
  { cap: 'SZÍVVERÉS', rate: 1.2, unit: '×' },
  { cap: 'MOZGATOTT VÉR', rate: 83, unit: 'ml' },
  { cap: 'ÚJ SEJT', rate: 3800000, unit: '' },
  { cap: 'LÉLEGZETVÉTEL', rate: 0.25, unit: '×' },
];

function PsSystemBox({ s, active, onEnter, onLeave }) {
  return (
    <div className={'ps-box' + (active ? ' on' : '')} onMouseEnter={onEnter} onMouseLeave={onLeave} onFocus={onEnter} onBlur={onLeave} tabIndex={0}>
      <div className="ps-box-label">{s.label}</div>
      <div className="ps-box-big ps-display">{s.big}</div>
      <div className="ps-box-sub">{s.bigSub}</div>
      <ul className="ps-box-lines">
        {s.lines.map((l) => <li key={l}>{l}</li>)}
      </ul>
    </div>
  );
}

function LivingBody() {
  const [hover, setHover] = usePsBodyState(null);
  const reduce = usePsBodyRef(!!(window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches)).current;
  const refs = usePsBodyRef([]);
  const activeId = hover;
  const active = PS_SYSTEMS.find((s) => s.id === activeId) || null;

  usePsBodyEffect(() => {
    if (reduce) {
      PS_LIVE.forEach((c, i) => { const n = refs.current[i]; if (n) n.textContent = PS_HU.format(Math.floor(c.rate * 60)); });
      return;
    }
    const t0 = performance.now();
    let raf = 0, last = 0;
    const tick = (t) => {
      if (t - last > 70) {
        last = t;
        const s = (t - t0) / 1000;
        PS_LIVE.forEach((c, i) => { const n = refs.current[i]; if (n) n.textContent = PS_HU.format(Math.floor(c.rate * s)); });
      }
      raf = requestAnimationFrame(tick);
    };
    raf = requestAnimationFrame(tick);
    return () => cancelAnimationFrame(raf);
  }, [reduce]);

  const col = (side) => PS_SYSTEMS.filter((s) => s.side === side);

  return (
    <section id="most" data-screen-label="Komplexitás" style={{ position: 'relative', background: 'var(--bg)', borderBottom: '1px solid var(--line)', padding: 'var(--sp-10) var(--gutter)' }}>
      <style dangerouslySetInnerHTML={{ __html: `
.ps-plate{position:relative;background:var(--ink-900);border:1px solid var(--line-gold);padding:clamp(24px,3vw,52px) clamp(16px,3vw,48px);overflow:hidden}
.ps-plate-grid{position:relative;display:grid;grid-template-columns:minmax(0,1fr) minmax(220px,27%) minmax(0,1fr);gap:clamp(18px,2.4vw,38px);align-items:center}
.ps-box-col{display:flex;flex-direction:column;gap:clamp(12px,1.6vw,20px)}
.ps-box{position:relative;z-index:1;border:1px solid rgba(198,168,104,.20);background:rgba(233,227,214,.025);padding:clamp(18px,1.7vw,26px) clamp(18px,1.8vw,28px);cursor:default;outline:none;transition:border-color 300ms var(--ease,ease),background 300ms ease,transform 340ms cubic-bezier(.16,1,.3,1),box-shadow 340ms ease}
.ps-box.on{z-index:3;border-color:var(--accent);background:rgba(198,168,104,.11);transform:scale(1.075) translateY(-6px);box-shadow:0 30px 70px -28px rgba(0,0,0,.95)}
.ps-box-label{font-family:var(--font-sans);font-size:12px;letter-spacing:.24em;color:rgba(233,227,214,.5);transition:color 300ms ease}
.ps-box.on .ps-box-label{color:var(--gold-bright)}
.ps-box-big{margin-top:10px;font-weight:300;line-height:.95;font-size:clamp(2.1rem,3.4vw,3.1rem);color:var(--bone-100);transition:color 300ms ease,font-size 300ms ease}
.ps-box.on .ps-box-big{color:var(--gold-bright);font-size:clamp(2.6rem,4.6vw,4.1rem)}
.ps-box-sub{margin-top:8px;font-family:var(--font-sans);font-size:.94rem;line-height:1.45;color:rgba(233,227,214,.72)}
.ps-box-lines{list-style:none;margin:0;padding:0;max-height:0;opacity:0;overflow:hidden;transition:max-height 460ms var(--ease,ease),opacity 380ms ease,margin-top 380ms ease}
.ps-box.on .ps-box-lines{max-height:340px;opacity:1;margin-top:16px}
.ps-box-lines li{position:relative;padding-left:18px;font-family:var(--font-sans);font-size:.92rem;line-height:1.6;color:rgba(233,227,214,.88)}
.ps-box-lines li+li{margin-top:7px}
.ps-box-lines li::before{content:"＋";position:absolute;left:0;top:0;color:var(--accent);font-size:.7rem}
.ps-fig{position:relative;aspect-ratio:620/591;width:100%}
.ps-fig-inner{position:absolute;inset:0}
.ps-fig-halo{position:absolute;inset:-14%;background:radial-gradient(circle at 50% 44%,rgba(198,168,104,.26),rgba(198,168,104,.08) 46%,transparent 70%)}
.ps-fig-lyr,.ps-fig-scanwrap{position:absolute;inset:0;-webkit-mask-image:url(${PS_FIG});mask-image:url(${PS_FIG});-webkit-mask-size:contain;mask-size:contain;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center}
.ps-fig-img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;opacity:.5;filter:invert(1) sepia(1) saturate(.55) brightness(1.5)}
.ps-fig-lyr{mix-blend-mode:screen;opacity:0;transition:opacity 1600ms ease}
.ps-fig-lyr.on{opacity:1}
.ps-lyr-nerve{background:linear-gradient(180deg,rgba(246,240,226,1) 0%,rgba(214,222,236,.8) 24%,rgba(160,180,210,.45) 56%,rgba(120,140,175,.15) 84%,transparent 98%)}
.ps-lyr-vasc{background:radial-gradient(ellipse 44% 32% at 50% 34%,rgba(255,170,142,1),rgba(226,120,96,.6) 44%,rgba(198,168,104,.3) 74%,transparent 94%)}
.ps-lyr-gut{background:radial-gradient(ellipse 30% 22% at 50% 52%,rgba(214,232,178,1),rgba(157,184,126,.7) 40%,rgba(198,168,104,.26) 74%,transparent 94%)}
.ps-lyr-cell{background:radial-gradient(circle at 50% 50%,rgba(198,168,104,.85),rgba(198,168,104,.5) 72%,rgba(198,168,104,.28) 100%)}
.ps-lyr-bone{background:radial-gradient(ellipse 62% 64% at 50% 50%,rgba(255,244,214,1),rgba(226,196,126,.75) 50%,rgba(198,168,104,.42) 80%,transparent 98%)}
.ps-lyr-cell-dots{position:absolute;inset:0;background-image:radial-gradient(rgba(255,240,206,.95) 1.1px,transparent 1.4px);background-size:10px 10px;mix-blend-mode:screen}
.ps-fig-scan{position:absolute;left:0;right:0;height:24%;background:linear-gradient(180deg,transparent,rgba(255,246,222,.4) 46%,rgba(255,246,222,.48) 56%,transparent);mix-blend-mode:screen}
.ps-fig-cap{position:absolute;left:0;right:0;bottom:-10px;text-align:center;font-family:var(--font-sans);font-size:12.5px;letter-spacing:.26em;color:var(--gold-bright)}
.ps-live{display:grid;grid-template-columns:1fr 1fr;gap:14px 22px;margin-top:clamp(18px,2.2vw,30px);padding-top:16px;border-top:1px solid rgba(198,168,104,.22)}
.ps-live-cap{font-family:var(--font-sans);font-size:11px;letter-spacing:.22em;color:rgba(233,227,214,.45)}
.ps-live-val{font-family:var(--font-sans);font-weight:300;font-size:1.35rem;color:var(--bone-100);font-variant-numeric:tabular-nums;font-feature-settings:"tnum";margin-top:3px}
.ps-live-u{font-size:.78rem;letter-spacing:.12em;color:var(--accent);margin-left:5px}
.ps-plate-corner{position:absolute;width:16px;height:16px;border:1px solid var(--line-gold);opacity:.6}
@keyframes psBodyBreathe{0%,100%{transform:scale(1)}50%{transform:scale(1.005)}}
@keyframes psBodyBeat{0%,100%{opacity:.5;transform:scale(1)}9%{opacity:1;transform:scale(1.035)}26%{opacity:.62;transform:scale(1.008)}}
@keyframes psBodyScan{0%{top:-24%}100%{top:100%}}
@keyframes psBodyShimmer{0%,100%{opacity:.5}50%{opacity:1}}
.ps-anim .ps-fig-inner{animation:psBodyBreathe 4s ease-in-out infinite;transform-origin:50% 96%}
.ps-anim .ps-fig-halo{animation:psBodyBeat .833s ease-out infinite}
.ps-anim .ps-fig-scan{animation:psBodyScan 9s linear infinite}
.ps-anim .ps-lyr-cell-dots{animation:psBodyShimmer 2.6s ease-in-out infinite}
@media (max-width:980px){.ps-plate-grid{grid-template-columns:1fr}.ps-fig{order:-1;max-width:380px;margin:0 auto 8px}.ps-box-big{font-size:2rem}.ps-box.on .ps-box-big{font-size:2.4rem}.ps-box.on{transform:scale(1.03) translateY(-4px)}}
@media (prefers-reduced-motion: reduce){.ps-anim .ps-fig-inner,.ps-anim .ps-fig-halo,.ps-anim .ps-fig-scan,.ps-anim .ps-lyr-cell-dots{animation:none}}
`}} />
      <div style={{ maxWidth: 'var(--container)', margin: '0 auto' }}>
        <div style={{ maxWidth: 780, marginBottom: 'var(--sp-8)' }}>
          <Eyebrow gold style={{ marginBottom: 18 }}>AZ EMBERI TEST</Eyebrow>
          <h2 className="ps-h1" style={{ margin: '0 0 16px' }}>Ilyen komplex <em style={{ fontStyle: 'italic', color: 'var(--accent)' }}>egy emberi test.</em></h2>
          <p className="ps-lead" style={{ margin: 0, color: 'var(--fg-2)', maxWidth: 640 }}>Nem szervek gyűjteménye, hanem egymásra utalt rendszerek hálózata — és mindegyik ugyanabban a másodpercben dolgozik. <span style={{ color: 'var(--accent)' }}>Vidd az egeret bármelyikre.</span></p>
        </div>

        <div className={'ps-plate' + (reduce ? '' : ' ps-anim')}>
          <span className="ps-plate-corner" style={{ left: 10, top: 10, borderRight: 'none', borderBottom: 'none' }} />
          <span className="ps-plate-corner" style={{ right: 10, top: 10, borderLeft: 'none', borderBottom: 'none' }} />
          <span className="ps-plate-corner" style={{ left: 10, bottom: 10, borderRight: 'none', borderTop: 'none' }} />
          <span className="ps-plate-corner" style={{ right: 10, bottom: 10, borderLeft: 'none', borderTop: 'none' }} />
          <div className="ps-plate-grid">
            <div className="ps-box-col">
              {col('l').map((s) => <PsSystemBox key={s.id} s={s} active={activeId === s.id} onEnter={() => setHover(s.id)} onLeave={() => setHover(null)} />)}
            </div>
            <div className="ps-fig">
              <div className="ps-fig-inner">
                <div className="ps-fig-halo" />
                <img className="ps-fig-img" src={PS_FIG} alt="Leonardo da Vinci — Vitruvius-tanulmány (kb. 1490, közkincs)" />
                {PS_SYSTEMS.map((s) => (
                  <div key={s.id} className={'ps-fig-lyr ' + s.cls + (activeId === s.id ? ' on' : '')}>
                    {s.id === 'sejt' ? <div className="ps-lyr-cell-dots" /> : null}
                  </div>
                ))}
                <div className="ps-fig-scanwrap"><div className="ps-fig-scan" /></div>
              </div>
              <div className="ps-fig-cap">{active ? active.label : 'A TELJES RENDSZER'}</div>
            </div>
            <div className="ps-box-col">
              {col('r').map((s) => <PsSystemBox key={s.id} s={s} active={activeId === s.id} onEnter={() => setHover(s.id)} onLeave={() => setHover(null)} />)}
              <div className="ps-box" style={{ cursor: 'default' }}>
                <div className="ps-box-label">MIÓTA EZT NÉZED</div>
                <div className="ps-live">
                  {PS_LIVE.map((c, i) => (
                    <div key={c.cap}>
                      <div className="ps-live-cap">{c.cap}</div>
                      <div className="ps-live-val"><span ref={(n) => { refs.current[i] = n; }}>0</span>{c.unit ? <span className="ps-live-u">{c.unit}</span> : null}</div>
                    </div>
                  ))}
                </div>
              </div>
            </div>
          </div>
        </div>

        <div style={{ maxWidth: 700, margin: 'var(--sp-9) auto 0', textAlign: 'center' }}>
          <p style={{ margin: '0', fontFamily: 'var(--font-sans)', fontSize: '0.68rem', lineHeight: 1.7, letterSpacing: '0.04em', color: 'var(--fg-3)' }}>
            Azevedo és mtsai., Journal of Comparative Neurology, 2009 · Sender, Fuchs &amp; Milo, PLOS Biology, 2016 · Sender &amp; Milo, Nature Medicine, 2021 · Helander &amp; Fändriks, Scandinavian Journal of Gastroenterology, 2014 · NCBI Bookshelf · Az ábra Leonardo da Vinci Vitruvius-tanulmánya alapján (kb. 1490, közkincs)
          </p>
          <p style={{ margin: '10px 0 0', fontFamily: 'var(--font-sans)', fontSize: '0.68rem', fontStyle: 'italic', letterSpacing: '0.04em', color: 'var(--fg-3)' }}>
            A számok reprezentatív felnőtt szervezetre vonatkozó becslések, nem egyéni mérési adatok.
          </p>
        </div>
      </div>
    </section>
  );
}

function PsBodyBreath() {
  return (
    <section aria-hidden="true" style={{ position: 'relative', background: 'var(--bg)', minHeight: '100vh', borderBottom: '1px solid var(--line)' }}>
      <div style={{ position: 'absolute', left: '50%', top: '18%', bottom: '18%', width: 1, background: 'linear-gradient(to bottom, transparent, var(--line-strong), transparent)' }} />
    </section>
  );
}

Object.assign(window, { LivingBody, PsBodyBreath });
