/* global React */
// Sections — Hero / How it works / Stats ticker
// Components exported: Nav, Hero, StatsTicker, HowItWorks

const { useState, useEffect, useRef } = React;

/* ───────────────────── Reveal-on-scroll hook ───────────────────── */
function useReveal(deps = []) {
  useEffect(() => {
    const showAll = () => document.querySelectorAll('.reveal:not(.in)').forEach(el => el.classList.add('in'));
    if (!('IntersectionObserver' in window)) {
      showAll();
      return;
    }
    // Reveal anything already in viewport on mount (synchronous)
    const vh = window.innerHeight;
    document.querySelectorAll('.reveal:not(.in)').forEach(el => {
      const r = el.getBoundingClientRect();
      if (r.top < vh * 0.95 && r.bottom > 0) el.classList.add('in');
    });
    // IO for what's still hidden
    const io = new IntersectionObserver((entries) => {
      entries.forEach(e => {
        if (e.isIntersecting) {
          e.target.classList.add('in');
          io.unobserve(e.target);
        }
      });
    }, { threshold: 0.05, rootMargin: '0px 0px -4% 0px' });
    document.querySelectorAll('.reveal:not(.in)').forEach(el => io.observe(el));
    // Safety net: after 1.2s, anything still hidden gets revealed (so screenshots/SSR don't break)
    const t = setTimeout(showAll, 1200);
    return () => { io.disconnect(); clearTimeout(t); };
    // eslint-disable-next-line
  }, deps);
}

/* ───────────────────── Animated counter ───────────────────── */
function CountUp({ to, prefix='', suffix='', duration=1800, decimals=0 }) {
  const ref = useRef(null);
  const [val, setVal] = useState(0);
  const [seen, setSeen] = useState(false);
  useEffect(() => {
    const el = ref.current;
    if (!el) return;
    const io = new IntersectionObserver((entries) => {
      entries.forEach(e => {
        if (e.isIntersecting && !seen) {
          setSeen(true);
          const start = performance.now();
          const step = (now) => {
            const t = Math.min(1, (now - start) / duration);
            const eased = 1 - Math.pow(1 - t, 3);
            setVal(to * eased);
            if (t < 1) requestAnimationFrame(step);
            else setVal(to);
          };
          requestAnimationFrame(step);
        }
      });
    }, { threshold: 0.5 });
    io.observe(el);
    return () => io.disconnect();
  }, [to, duration, seen]);
  const fmt = decimals
    ? val.toLocaleString('pt-BR', { minimumFractionDigits: decimals, maximumFractionDigits: decimals })
    : Math.round(val).toLocaleString('pt-BR');
  return <span ref={ref}>{prefix}{fmt}{suffix}</span>;
}

/* ───────────────────── NAV ───────────────────── */
function Nav() {
  const [scrolled, setScrolled] = useState(false);
  useEffect(() => {
    const f = () => setScrolled(window.scrollY > 8);
    f();
    window.addEventListener('scroll', f, { passive:true });
    return () => window.removeEventListener('scroll', f);
  }, []);
  return (
    <nav className={"nav " + (scrolled ? 'nav-scrolled' : '')}>
      <div className="container nav-inner">
        <a href="#top" className="nav-brand">
          <img src="/landing-original/assets/brand-head-transparent.png" alt="Gorilla Barber" />
          <span className="nav-wordmark">
            <span className="nav-wm1">GORILLA</span><span className="nav-wm2">BARBER</span>
          </span>
        </a>
        <div className="nav-links">
          <a href="#how">Como funciona</a>
          <a href="#features">Features</a>
          <a href="#compare">Comparativo</a>
          <a href="#pricing">Preços</a>
          <a href="#faq">FAQ</a>
        </div>
        <div className="nav-cta">
          <a className="nav-login" href="/login">Entrar</a>
          <a className="btn btn-primary btn-sm" href="#trial">Comece grátis →</a>
        </div>
      </div>

      <style>{`
        .nav { position: sticky; top: 0; z-index: 50;
          transition: background .25s ease, border-color .25s ease, backdrop-filter .25s ease;
          border-bottom: 1px solid transparent;
        }
        .nav-scrolled {
          background: rgba(12,12,14,.72);
          -webkit-backdrop-filter: blur(16px) saturate(140%);
          backdrop-filter: blur(16px) saturate(140%);
          border-bottom-color: var(--line-soft);
        }
        .nav-inner {
          display:flex; align-items:center; justify-content:space-between;
          padding: 16px 28px;
          gap: 24px;
        }
        .nav-brand { display:flex; align-items:center; gap:10px; }
        .nav-brand img { width: 40px; height: 40px; display:block; }
        .nav-wordmark {
          font-family: var(--font-display); font-weight: 800;
          letter-spacing: -0.01em; font-size: 16px;
          display:flex;
        }
        .nav-wm1 { color: var(--ink); }
        .nav-wm2 { color: var(--accent); margin-left: 4px; }
        .nav-links { display:flex; gap: 4px; }
        .nav-links a {
          padding: 8px 14px; border-radius: 999px;
          font-size: 14px; font-weight: 500;
          color: var(--ink-soft);
          transition: color .15s, background .15s;
        }
        .nav-links a:hover { color: var(--ink); background: var(--bg-card); }
        .nav-cta { display:flex; align-items:center; gap: 10px; }
        .nav-login { font-size: 14px; font-weight: 500; color: var(--ink-soft); padding: 8px 4px; }
        .nav-login:hover { color: var(--ink); }
        @media (max-width: 900px) {
          .nav-links { display:none; }
        }
      `}</style>
    </nav>
  );
}

/* ───────────────────── HERO ───────────────────── */
function Hero() {
  useReveal();
  return (
    <section className="hero" id="top">
      <div className="hero-bg">
        {/* Giant gorilla mascot watermark */}
        <img src="/landing-original/assets/brand-head-transparent.png" alt="" className="hero-mascot" aria-hidden="true" />
        <div className="hero-glow" />
        <div className="hero-grid" />
      </div>

      <div className="container hero-inner">
        <div className="hero-copy reveal">
          <span className="eyebrow">SaaS para barbearias · Beta aberto</span>
          <h1 className="hero-h1">
            O SaaS que <span className="hero-paint">paga sua barbearia</span>.
          </h1>
          <p className="hero-sub">
            Gerencie agenda, comanda, comissão, assinatura recorrente, recovery de inadimplência e crescimento — em um único login.
          </p>

          <div className="hero-replace">
            <span className="hero-replace-l">Substitui</span>
            <span className="hero-replace-pill">AppBarber</span>
            <span className="hero-replace-pill">Trinks</span>
            <span className="hero-replace-pill">Tagarela ZAP</span>
          </div>

          <div className="hero-ctas">
            <a className="btn btn-primary btn-lg" href="#trial">
              Comece grátis 90 dias
              <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round"><line x1="5" y1="12" x2="19" y2="12"/><polyline points="12 5 19 12 12 19"/></svg>
            </a>
            <a className="btn btn-ghost btn-lg" href="#demo">
              <span className="hero-play">
                <svg width="10" height="10" viewBox="0 0 24 24" fill="currentColor"><polygon points="5,3 19,12 5,21"/></svg>
              </span>
              Ver demo de 3 minutos
            </a>
          </div>

          <p className="hero-micro">Sem cartão. Migra do AppBarber/Trinks em 1 clique.</p>

          <div className="hero-social">
            <div className="hero-stars">
              {[0,1,2,3,4].map(i => (
                <svg key={i} width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style={{color:'var(--accent)'}}>
                  <polygon points="12,2 15.09,8.26 22,9.27 17,14.14 18.18,21.02 12,17.77 5.82,21.02 7,14.14 2,9.27 8.91,8.26" />
                </svg>
              ))}
            </div>
            <p className="hero-social-text">
              Barbearias que já trocaram economizam em média <strong>R$ <CountUp to={1800} />/mês</strong> em comissão recalculada, comandas resgatadas e assinatura recuperada.
            </p>
          </div>
        </div>

        <div className="hero-visual reveal">
          <div className="hero-photo-wrap">
            <image-slot
              id="hero-shop"
              shape="rounded"
              radius="20"
              placeholder="Foto da sua barbearia · arraste aqui"
              style={{width:'100%', aspectRatio:'4/5', display:'block'}}
            ></image-slot>

            {/* Floating stat cards */}
            <div className="hero-stat hero-stat-1">
              <div className="hero-stat-l">Pote Vindi · ao vivo</div>
              <div className="hero-stat-v">R$ <CountUp to={14720} /></div>
              <div className="hero-stat-d">
                <span className="hero-live">●</span> +R$ 89 há 6s
              </div>
            </div>

            <div className="hero-stat hero-stat-2">
              <div className="hero-stat-l">Recovery hoje</div>
              <div className="hero-stat-v"><CountUp to={47} suffix="%" /></div>
              <div className="hero-stat-d">23 de 49 inadimplentes</div>
            </div>

            <div className="hero-stat hero-stat-3">
              <div className="hero-stat-l">Comanda #1284</div>
              <div className="hero-stat-v">R$ 155,00</div>
              <div className="hero-stat-d">Margem barbearia <strong style={{color:'#86efac'}}>R$ 73,45</strong></div>
            </div>
          </div>
        </div>
      </div>

      <style>{`
        .hero { padding: 80px 0 140px; overflow: hidden; border-top: none; }
        .hero-bg { position:absolute; inset:0; pointer-events:none; }
        .hero-mascot {
          position:absolute;
          right: -10%; top: 50%;
          transform: translateY(-50%);
          width: min(80vw, 1100px);
          opacity: .055;
          filter: grayscale(1) contrast(1.4);
          pointer-events: none;
          user-select: none;
        }
        .hero-glow {
          position:absolute; right:-200px; top:-200px;
          width: 800px; height: 800px;
          background: radial-gradient(closest-side, var(--accent-glow), transparent 70%);
          filter: blur(20px);
        }
        .hero-grid {
          position:absolute; inset:0;
          background-image:
            linear-gradient(rgba(255,255,255,.025) 1px, transparent 1px),
            linear-gradient(90deg, rgba(255,255,255,.025) 1px, transparent 1px);
          background-size: 64px 64px;
          mask-image: radial-gradient(circle at 30% 40%, black 0%, transparent 70%);
        }

        .hero-inner {
          position: relative; z-index: 2;
          display: grid;
          grid-template-columns: 1.15fr .85fr;
          gap: 80px;
          align-items: center;
          padding-top: 40px;
        }

        .hero-copy { max-width: 640px; }
        .hero-h1 {
          margin-top: 22px;
          font-weight: 800;
          font-size: clamp(48px, 7vw, 104px);
          line-height: .96;
          letter-spacing: -0.04em;
        }
        .hero-paint {
          background: linear-gradient(180deg, var(--accent-soft) 0%, var(--accent) 60%, var(--accent-deep) 100%);
          -webkit-background-clip: text; background-clip: text;
          color: transparent;
          position: relative;
        }
        .hero-paint::after {
          content:"";
          position:absolute; left:0; right:0; bottom:-2px;
          height: 2px;
          background: linear-gradient(90deg, transparent, var(--accent) 30%, var(--accent) 70%, transparent);
          opacity:.5;
        }
        .hero-sub {
          margin-top: 22px;
          font-size: clamp(17px, 1.4vw, 21px);
          line-height: 1.5;
          color: var(--ink-soft);
          max-width: 580px;
        }

        .hero-replace {
          margin-top: 28px;
          display:flex; align-items:center; gap: 8px; flex-wrap: wrap;
        }
        .hero-replace-l {
          font-family: var(--font-mono);
          font-size: 11px;
          color: var(--ink-mute);
          text-transform: uppercase;
          letter-spacing: .14em;
          margin-right: 2px;
        }
        .hero-replace-pill {
          display:inline-flex; align-items:center;
          padding: 5px 11px;
          border-radius: 6px;
          border: 1px solid var(--line);
          background: var(--bg-card);
          font-size: 12.5px;
          font-weight: 500;
          color: var(--ink-soft);
          text-decoration: line-through;
          text-decoration-color: var(--accent);
          text-decoration-thickness: 1.5px;
          font-family: var(--font-body);
        }

        .hero-ctas {
          display: flex; gap: 12px; margin-top: 36px;
          flex-wrap: wrap;
        }
        .hero-play {
          width: 20px; height: 20px; border-radius: 50%;
          background: var(--accent); color: #fff;
          display:flex; align-items:center; justify-content:center;
          padding-left: 1px;
        }

        .hero-micro {
          margin-top: 16px;
          font-size: 13px;
          color: var(--ink-mute);
          font-family: var(--font-mono);
        }

        .hero-social {
          margin-top: 40px;
          padding-top: 24px;
          border-top: 1px solid var(--line-soft);
          display: grid;
          grid-template-columns: auto 1fr;
          gap: 16px;
          align-items: center;
          max-width: 560px;
        }
        .hero-stars { display:flex; gap: 2px; }
        .hero-social-text { font-size: 13.5px; line-height: 1.5; color: var(--ink-soft); }
        .hero-social-text strong { color: var(--ink); font-weight: 600; }

        /* Hero visual */
        .hero-visual { position: relative; }
        .hero-photo-wrap {
          position: relative;
          max-width: 420px;
          margin-left: auto;
        }
        .hero-photo-wrap image-slot {
          border-radius: 20px;
          box-shadow: 0 30px 80px -20px rgba(0,0,0,.5), 0 0 0 1px var(--line);
        }
        .hero-stat {
          position: absolute;
          background: rgba(22,22,26,.86);
          -webkit-backdrop-filter: blur(14px);
          backdrop-filter: blur(14px);
          border: 1px solid var(--line);
          border-radius: 14px;
          padding: 12px 16px;
          min-width: 180px;
          box-shadow: 0 20px 60px -10px rgba(0,0,0,.6);
          animation: flyIn .8s cubic-bezier(.2,.7,.2,1) both;
        }
        .hero-stat-l {
          font-family: var(--font-mono);
          font-size: 10px;
          color: var(--ink-mute);
          text-transform: uppercase;
          letter-spacing: .1em;
        }
        .hero-stat-v {
          font-family: var(--font-display);
          font-weight: 700;
          font-size: 22px;
          margin-top: 3px;
          color: var(--ink);
        }
        .hero-stat-d {
          margin-top: 4px;
          font-size: 11.5px;
          color: var(--ink-soft);
        }
        .hero-live { color: var(--accent); animation: pulseDot 1.6s infinite; }

        .hero-stat-1 { top: -16px; left: -60px; animation-delay: .15s; }
        .hero-stat-2 { top: 38%; right: -40px; animation-delay: .3s; }
        .hero-stat-3 { bottom: -10px; left: -40px; animation-delay: .45s; }

        @media (max-width: 980px) {
          .hero-inner { grid-template-columns: 1fr; gap: 40px; }
          .hero-photo-wrap { max-width: 360px; margin: 0 auto; }
          .hero-stat-1 { left: -20px; top: 0; }
          .hero-stat-3 { left: -20px; }
          .hero-stat-2 { right: -10px; }
        }
      `}</style>
    </section>
  );
}

/* ───────────────────── STATS TICKER ───────────────────── */
function StatsTicker() {
  const items = [
    { v: 'R$ 1.800', l: 'economia média/mês' },
    { v: '30–60%', l: 'recovery em 14 dias' },
    { v: '12', l: 'categorias de comissão' },
    { v: '9 telas', l: 'portal do cliente PWA' },
    { v: '32', l: 'rankings BI nativos' },
    { v: '< 10 min', l: 'pra abrir 1ª comanda' },
    { v: '1 clique', l: 'migração AppBarber/Trinks' },
    { v: '90 dias', l: 'trial sem cartão' },
  ];
  const doubled = [...items, ...items];
  return (
    <section className="ticker" aria-label="Métricas">
      <div className="ticker-track">
        {doubled.map((it, i) => (
          <div key={i} className="ticker-item">
            <span className="ticker-v">{it.v}</span>
            <span className="ticker-l">{it.l}</span>
          </div>
        ))}
      </div>
      <style>{`
        .ticker {
          padding: 36px 0;
          border-top: 1px solid var(--line-soft);
          border-bottom: 1px solid var(--line-soft);
          background: linear-gradient(180deg, rgba(255,65,3,.04), transparent);
          overflow: hidden;
          mask-image: linear-gradient(90deg, transparent, black 8%, black 92%, transparent);
        }
        .ticker-track {
          display: flex;
          gap: 80px;
          animation: ticker 55s linear infinite;
          width: max-content;
        }
        .ticker-item {
          display:flex; align-items:baseline; gap: 18px;
          white-space: nowrap;
        }
        .ticker-v {
          font-family: var(--font-display);
          font-weight: 800;
          font-size: clamp(36px, 4.5vw, 56px);
          color: var(--ink);
          letter-spacing: -0.03em;
          line-height: 1;
        }
        .ticker-l {
          font-size: clamp(16px, 1.4vw, 22px);
          color: var(--ink-mute);
          font-family: var(--font-mono);
        }
      `}</style>
    </section>
  );
}

/* ───────────────────── COMO FUNCIONA ───────────────────── */
function HowItWorks() {
  useReveal();
  const steps = [
    {
      n: '01',
      t: 'Conecte sua barbearia',
      d: 'Cadastre nome, CNPJ e seu 1º colaborador. 3 minutos.',
      time: '~3 min',
      icon: (
        <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
          <path d="M3 9.5L12 4l9 5.5"/><path d="M5 10v9a1 1 0 0 0 1 1h4v-6h4v6h4a1 1 0 0 0 1-1v-9"/>
        </svg>
      ),
    },
    {
      n: '02',
      t: 'Importe seus dados',
      d: 'Faça upload do CSV do AppBarber ou Trinks. Gorilla mapeia colunas, dedupa clientes e cria histórico em background.',
      time: 'opcional',
      icon: (
        <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
          <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="17 8 12 3 7 8"/><line x1="12" y1="3" x2="12" y2="15"/>
        </svg>
      ),
    },
    {
      n: '03',
      t: 'Comece a operar',
      d: 'Catálogo seed com 40 serviços e 80 produtos curados pra barbearia masculina já vem populado. Você ajusta preços e abre a primeira comanda em menos de 10 minutos.',
      time: '< 10 min',
      icon: (
        <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
          <circle cx="12" cy="12" r="10"/><polyline points="9 12 11 14 15 10"/>
        </svg>
      ),
    },
  ];
  return (
    <section id="how" className="how">
      <div className="container">
        <div className="how-head reveal">
          <span className="eyebrow">Onboarding</span>
          <h2>Em 3 passos você está operando.</h2>
          <p className="how-lede">Da assinatura à primeira comanda em menos de 15 minutos. Sem treinamento, sem onboarding pago.</p>
        </div>

        <div className="how-steps">
          {steps.map((s, i) => (
            <div key={i} className="how-card reveal" style={{transitionDelay: `${i*80}ms`}}>
              <div className="how-card-top">
                <span className="how-n">{s.n}</span>
                <span className="how-time">{s.time}</span>
              </div>
              <div className="how-icon">{s.icon}</div>
              <h3>{s.t}</h3>
              <p>{s.d}</p>
              {i < steps.length - 1 && (
                <div className="how-arrow" aria-hidden="true">
                  <svg width="24" height="12" viewBox="0 0 24 12" fill="none">
                    <path d="M0 6 H22 M18 2 L22 6 L18 10" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"/>
                  </svg>
                </div>
              )}
            </div>
          ))}
        </div>
      </div>

      <style>{`
        .how-head { max-width: 720px; }
        .how-head h2 { margin-top: 18px; }
        .how-lede { margin-top: 16px; font-size: 17px; max-width: 580px; }

        .how-steps {
          display: grid;
          grid-template-columns: repeat(3, 1fr);
          gap: 16px;
          margin-top: 72px;
        }
        .how-card {
          position: relative;
          padding: 28px;
          background: var(--bg-card);
          border: 1px solid var(--line-soft);
          border-radius: var(--r-lg);
          transition: border-color .25s ease, transform .25s ease;
        }
        .how-card:hover { border-color: var(--line); transform: translateY(-2px); }
        .how-card-top {
          display:flex; justify-content:space-between; align-items:center;
          margin-bottom: 24px;
        }
        .how-n {
          font-family: var(--font-display);
          font-weight: 700;
          font-size: 13px;
          letter-spacing: .1em;
          color: var(--accent);
          background: rgba(255,65,3,.1);
          padding: 4px 10px;
          border-radius: 999px;
        }
        .how-time {
          font-family: var(--font-mono);
          font-size: 11px;
          color: var(--ink-mute);
          text-transform: uppercase;
          letter-spacing: .1em;
        }
        .how-icon {
          width: 48px; height: 48px;
          color: var(--accent);
          margin-bottom: 18px;
        }
        .how-icon svg { width: 100%; height: 100%; }
        .how-card h3 { margin-bottom: 10px; }
        .how-card p { font-size: 14.5px; }

        .how-arrow {
          position: absolute;
          right: -14px; top: 50%;
          width: 28px; height: 28px;
          border-radius: 50%;
          background: var(--bg-soft);
          border: 1px solid var(--line);
          color: var(--accent);
          display:flex; align-items:center; justify-content:center;
          z-index: 2;
        }

        @media (max-width: 880px) {
          .how-steps { grid-template-columns: 1fr; }
          .how-arrow { display: none; }
        }
      `}</style>
    </section>
  );
}

Object.assign(window, { Nav, Hero, StatsTicker, HowItWorks, useReveal, CountUp });
