
const { useState, useEffect, useRef } = React;

const GZ_DISCORD_URL = 'https://discord.gg/mxDCpdGaGJ';

// ----- icones (SVG inline) -----
const IconDiscord = () => (
  <svg width="19" height="19" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
    <path d="M20.317 4.369A19.79 19.79 0 0016.558 3.2a.074.074 0 00-.079.037c-.34.6-.717 1.385-.98 2.001a18.27 18.27 0 00-5.484 0 12.6 12.6 0 00-.997-2.001.077.077 0 00-.079-.037A19.736 19.736 0 003.677 4.37a.07.07 0 00-.032.027C1.533 7.6.866 10.745 1.214 13.851a.082.082 0 00.031.056 19.9 19.9 0 005.993 3.03.078.078 0 00.084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 00-.041-.106 13.1 13.1 0 01-1.872-.892.077.077 0 01-.008-.128c.126-.094.252-.192.372-.291a.074.074 0 01.077-.01c3.928 1.793 8.18 1.793 12.061 0a.074.074 0 01.078.009c.12.099.246.198.373.292a.077.077 0 01-.006.127c-.598.349-1.22.645-1.873.892a.076.076 0 00-.04.107c.36.698.772 1.362 1.225 1.993a.076.076 0 00.084.028 19.84 19.84 0 006.002-3.03.077.077 0 00.032-.055c.5-3.59-.838-6.711-2.546-9.455a.061.061 0 00-.031-.028zM8.02 11.96c-1.183 0-2.157-1.086-2.157-2.42 0-1.333.955-2.42 2.157-2.42 1.21 0 2.176 1.096 2.157 2.42 0 1.334-.955 2.42-2.157 2.42zm7.975 0c-1.183 0-2.157-1.086-2.157-2.42 0-1.333.955-2.42 2.157-2.42 1.21 0 2.176 1.096 2.157 2.42 0 1.334-.946 2.42-2.157 2.42z"/>
  </svg>
);
const IconArrow = () => (
  <svg width="19" height="19" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
    <path d="M5 12h14M13 6l6 6-6 6"/>
  </svg>
);
const IconLock = () => (
  <svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
    <rect x="4" y="11" width="16" height="9" rx="1.5"/><path d="M8 11V8a4 4 0 018 0v3"/>
  </svg>
);

function GzButton({ href, onClick, variant, label, sub, icon, disabled }) {
  const cls = 'gz-btn gz-btn--' + variant + (disabled ? ' gz-btn--off' : '');
  const inner = (
    <>
      <span className="gz-btn__ic">{icon}</span>
      <span className="gz-btn__txt">
        <span className="gz-btn__label">{label}</span>
        <span className="gz-btn__sub">{sub}</span>
      </span>
    </>
  );
  if (disabled) return <div className={cls} aria-disabled="true">{inner}</div>;
  if (href) return <a className={cls} href={href} target="_blank" rel="noopener noreferrer">{inner}</a>;
  return <button className={cls} onClick={onClick} type="button">{inner}</button>;
}

function GateScreen({ onEnter }) {
  const rootRef = useRef(null);
  const [ready, setReady] = useState(typeof window !== 'undefined' && !!window._gzLoaded);
  const [leaving, setLeaving] = useState(false);

  // spotlight segue o cursor (suavizado via lerp + rAF)
  useEffect(function () {
    const el = rootRef.current;
    if (!el) return;
    let tx = window.innerWidth * 0.5, ty = window.innerHeight * 0.42;
    let cx = tx, cy = ty, raf;
    el.style.setProperty('--mx', cx + 'px');
    el.style.setProperty('--my', cy + 'px');
    function tick() {
      cx += (tx - cx) * 0.16; cy += (ty - cy) * 0.16;
      el.style.setProperty('--mx', cx.toFixed(1) + 'px');
      el.style.setProperty('--my', cy.toFixed(1) + 'px');
      raf = requestAnimationFrame(tick);
    }
    function move(e) { const p = (e.touches && e.touches[0]) ? e.touches[0] : e; tx = p.clientX; ty = p.clientY; }
    window.addEventListener('mousemove', move);
    window.addEventListener('touchmove', move, { passive: true });
    raf = requestAnimationFrame(tick);
    return function () {
      window.removeEventListener('mousemove', move);
      window.removeEventListener('touchmove', move);
      cancelAnimationFrame(raf);
    };
  }, []);

  // ambiente 3D (globo) terminou de carregar atras da gate?
  useEffect(function () {
    if (window._gzLoaded) { setReady(true); return; }
    function on() { setReady(true); }
    window.addEventListener('globe-loaded', on);
    return function () { window.removeEventListener('globe-loaded', on); };
  }, []);

  function enterSite() {
    if (leaving) return;
    setLeaving(true);
    setTimeout(function () { if (onEnter) onEnter(); }, 720);
  }

  return (
    <div ref={rootRef} className="gz-gate" style={{
      position: 'fixed', inset: 0, zIndex: 10000, overflow: 'hidden', background: '#070707',
      opacity: leaving ? 0 : 1, transform: leaving ? 'scale(1.03)' : 'none',
      transition: 'opacity 0.72s ease, transform 0.72s ease', pointerEvents: leaving ? 'none' : 'auto',
    }}>
      <style>{`
        .gz-gate { --mx: 50%; --my: 42%; cursor: crosshair; }
        .gz-gate__layer { position:absolute; inset:0; background-size:cover; background-position:center; }
        .gz-gate__preview { z-index:1; filter:saturate(1.05); }
        .gz-gate__reveal {
          z-index:2;
          -webkit-mask-image: radial-gradient(circle 320px at var(--mx) var(--my), #000 0%, #000 16%, rgba(0,0,0,.82) 40%, rgba(0,0,0,0) 72%);
                  mask-image: radial-gradient(circle 320px at var(--mx) var(--my), #000 0%, #000 16%, rgba(0,0,0,.82) 40%, rgba(0,0,0,0) 72%);
        }
        .gz-gate__ring {
          position:absolute; left:var(--mx); top:var(--my); width:660px; height:660px; z-index:3;
          transform:translate(-50%,-50%); border-radius:50%; pointer-events:none; mix-blend-mode:screen; opacity:.85;
          background: radial-gradient(circle closest-side, transparent 46%, rgba(168,255,0,.16) 48.5%, rgba(255,42,42,.15) 50.5%, transparent 54%);
        }
        .gz-gate__vig { position:absolute; inset:0; z-index:4; pointer-events:none;
          background: radial-gradient(125% 120% at 50% 38%, transparent 42%, rgba(0,0,0,.6) 100%); }
        .gz-gate__scrim { position:absolute; inset:0; z-index:4; pointer-events:none;
          background: linear-gradient(to top, rgba(5,5,5,.94) 0%, rgba(5,5,5,.55) 26%, transparent 54%); }
        .gz-gate__scan { position:absolute; left:0; right:0; height:140px; z-index:5; pointer-events:none; opacity:.5;
          background: linear-gradient(to bottom, transparent, rgba(168,255,0,.05) 45%, rgba(168,255,0,.12) 50%, rgba(168,255,0,.05) 55%, transparent);
          animation: gzScan 7s linear infinite; }
        .gz-gate__noise { position:absolute; inset:0; z-index:5; pointer-events:none; opacity:.05; mix-blend-mode:overlay;
          background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3'/%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23n)'/%3E%3C/svg%3E"); }

        .gz-bracket { position:absolute; width:34px; height:34px; z-index:10; border-color:rgba(168,255,0,.5); border-style:solid; border-width:0; }
        .gz-bracket.tl{ top:20px; left:20px; border-top-width:2px; border-left-width:2px; }
        .gz-bracket.tr{ top:20px; right:20px; border-top-width:2px; border-right-width:2px; }
        .gz-bracket.bl{ bottom:20px; left:20px; border-bottom-width:2px; border-left-width:2px; }
        .gz-bracket.br{ bottom:20px; right:20px; border-bottom-width:2px; border-right-width:2px; }

        .gz-hud { position:absolute; top:30px; z-index:10; font-family:'Share Tech Mono',monospace; font-size:10.5px; letter-spacing:.14em; line-height:1.7; color:rgba(255,255,255,.42); }
        .gz-hud.tl{ left:40px; } .gz-hud.tr{ right:40px; text-align:right; }
        .gz-hud b{ color:#a8ff00; font-weight:400; }
        .gz-hud .dot{ display:inline-block; width:6px; height:6px; border-radius:50%; margin-right:6px; vertical-align:middle; box-shadow:0 0 8px currentColor; animation:gzPulse 1.6s ease-in-out infinite; }

        .gz-content { position:absolute; left:0; right:0; bottom:0; z-index:10; padding:0 5vw 7vh; display:flex; flex-direction:column; align-items:center; text-align:center; }
        .gz-content > * { max-width:760px; }
        .gz-eyebrow { font-family:'Share Tech Mono',monospace; font-size:11px; letter-spacing:.32em; color:#a8ff00; opacity:.85; margin-bottom:14px; text-transform:uppercase; }
        .gz-title { font-family:'Rajdhani',sans-serif; font-weight:700; font-size:clamp(26px,4.4vw,46px); line-height:1.04; color:#fff; text-transform:uppercase; margin-bottom:30px; text-shadow:0 2px 24px rgba(0,0,0,.6); }
        .gz-title span{ color:rgba(255,255,255,.6); }

        .gz-actions { display:flex; gap:16px; justify-content:center; flex-wrap:wrap; }
        .gz-btn { display:flex; align-items:center; gap:13px; text-align:left; text-decoration:none; cursor:pointer; min-width:236px;
          padding:14px 22px; border:1.5px solid; background:transparent; transition:transform .18s ease, box-shadow .25s ease, background .2s ease, border-color .2s ease;
          clip-path: polygon(0 0, calc(100% - 11px) 0, 100% 11px, 100% 100%, 11px 100%, 0 calc(100% - 11px)); }
        .gz-btn__ic { display:flex; }
        .gz-btn__txt { display:flex; flex-direction:column; line-height:1.1; }
        .gz-btn__label { font-family:'Rajdhani',sans-serif; font-weight:700; font-size:15px; letter-spacing:.1em; text-transform:uppercase; }
        .gz-btn__sub { font-family:'Share Tech Mono',monospace; font-size:9.5px; letter-spacing:.08em; opacity:.7; margin-top:3px; }
        .gz-btn:not(.gz-btn--off):hover { transform:translateY(-2px); }

        .gz-btn--primary { background:#a8ff00; color:#0b0b0b; border-color:#a8ff00; }
        .gz-btn--primary:hover { box-shadow:0 0 26px rgba(168,255,0,.55); }
        .gz-btn--discord { color:#cfd6e6; border-color:rgba(120,140,200,.5); background:rgba(40,46,70,.35); }
        .gz-btn--discord:hover { border-color:#7a86c4; background:rgba(60,68,108,.5); box-shadow:0 0 22px rgba(110,125,200,.4); color:#fff; }
        .gz-btn--ghost { color:rgba(255,255,255,.42); border-color:rgba(255,255,255,.16); background:rgba(255,255,255,.02); cursor:not-allowed; }

        .gz-foot { margin-top:30px; display:flex; gap:22px; align-items:center; justify-content:center; flex-wrap:wrap;
          font-family:'Share Tech Mono',monospace; font-size:10px; letter-spacing:.12em; }
        .gz-hint { color:rgba(255,255,255,.38); }
        .gz-ready { transition:color .3s; }

        .gz-in { animation:gzIn .7s cubic-bezier(.2,.8,.2,1) both; }
        @keyframes gzIn { from { opacity:0; transform:translateY(16px); } to { opacity:1; transform:none; } }
        @keyframes gzScan { 0%{ transform:translateY(-160px);} 100%{ transform:translateY(100vh);} }
        @keyframes gzPulse { 0%,100%{ opacity:.45;} 50%{ opacity:1;} }

        @media (max-width:768px){
          .gz-gate__reveal {
            -webkit-mask-image: radial-gradient(circle 175px at var(--mx) var(--my), #000 0%, #000 14%, rgba(0,0,0,.82) 42%, rgba(0,0,0,0) 76%);
                    mask-image: radial-gradient(circle 175px at var(--mx) var(--my), #000 0%, #000 14%, rgba(0,0,0,.82) 42%, rgba(0,0,0,0) 76%);
          }
          .gz-gate__ring{ width:360px; height:360px; }
          .gz-hud.tr{ display:none; }
          .gz-btn{ min-width:0; width:100%; max-width:320px; }
          .gz-actions{ width:100%; }
        }
        @media (prefers-reduced-motion: reduce){ .gz-gate__scan{ animation:none; display:none; } .gz-in{ animation:none; } }
      `}</style>

      {/* camadas de fundo */}
      <div className="gz-gate__layer gz-gate__preview" style={{ backgroundImage: 'url(uploads/bg-preview.webp)' }} />
      <div className="gz-gate__layer gz-gate__reveal" style={{ backgroundImage: 'url(uploads/bg-reveal.webp)' }} />
      <div className="gz-gate__ring" />
      <div className="gz-gate__vig" />
      <div className="gz-gate__scrim" />
      <div className="gz-gate__scan" />
      <div className="gz-gate__noise" />

      {/* molduras de canto (HUD) */}
      <div className="gz-bracket tl" /><div className="gz-bracket tr" />
      <div className="gz-bracket bl" /><div className="gz-bracket br" />

      {/* HUD topo */}
      <div className="gz-hud tl gz-in" style={{ animationDelay: '.05s' }}>
        A.U.R.A. BIOTRACK // PONTO DE ACESSO<br />
        <span className="dot" style={{ color: ready ? '#a8ff00' : '#ffb000' }} />SCANNER <b>{ready ? 'ATIVO' : 'CALIBRANDO'}</b>
      </div>
      <div className="gz-hud tr gz-in" style={{ animationDelay: '.05s' }}>
        SETOR GEN-Z // QUARENTENA<br />LAT 37.8 N / LON 46.2 W
      </div>

      {/* conteudo */}
      <div className="gz-content">
        <img src="uploads/genz-logo.png" alt="Project Gen Z" className="gz-in" style={{ width: 86, height: 86, objectFit: 'contain', marginBottom: 18, filter: 'drop-shadow(0 0 16px rgba(168,255,0,.45))', animationDelay: '.08s' }} />
        <div className="gz-eyebrow gz-in" style={{ animationDelay: '.14s' }}>Acesso ao ecossistema</div>
        <h1 className="gz-title gz-in" style={{ animationDelay: '.2s' }}>A contaminacao e global.<br /><span>Escolha por onde entrar.</span></h1>

        <div className="gz-actions gz-in" style={{ animationDelay: '.28s' }}>
          <GzButton variant="discord" href={GZ_DISCORD_URL} label="Entrar no Discord" sub="comunidade e novidades" icon={<IconDiscord />} />
          <GzButton variant="primary" onClick={enterSite} label="Explorar o site" sub="conheca o servidor" icon={<IconArrow />} />
          <GzButton variant="ghost" disabled label="Painel do jogador" sub="em breve" icon={<IconLock />} />
        </div>

        <div className="gz-foot gz-in" style={{ animationDelay: '.36s' }}>
          <span className="gz-hint">// mova o cursor para revelar a contaminacao</span>
          <span className="gz-ready" style={{ color: ready ? '#a8ff00' : 'rgba(255,255,255,.4)' }}>{ready ? '> ambiente pronto' : '> preparando ambiente...'}</span>
        </div>
      </div>
    </div>
  );
}

Object.assign(window, { GateScreen });
