// Componentes do site da Profcoruja
// Lúdico, colorido, formas orgânicas

const PALETTE = {
  cream: '#FBF4E4',
  creamDeep: '#F5E9CF',
  ink: '#2A2118',
  inkSoft: '#5A4A38',
  terracota: '#D4623A',
  mostarda: '#E8A53A',
  verde: '#6B8E4E',
  rosa: '#E89B8C',
  azul: '#4A7C9E',
  lilas: '#A78BB8',
};

const TYPE_LABELS = {
  alfabetizacao: 'Alfabetização',
  contacao: 'Contação',
  sensorial: 'Sensorial',
  projeto: 'Projeto',
  'producao-textual': 'Produção textual',
  matematica: 'Matemática',
};

// ------- API client utilitário -------
const API = (window.PROF_CORUJA && window.PROF_CORUJA.API_URL) || 'https://profcoruja-api.vercel.app';

async function apiGet(path, headers) {
  const hdrs = headers || {};
  const res = await fetch(API + path, { headers: hdrs });
  const json = await res.json().catch(function() { return {}; });
  if (!res.ok) {
    const msg = (json && json.error && json.error.message) || ('Erro ' + res.status);
    const err = new Error(msg);
    err.code = json && json.error && json.error.code;
    err.status = res.status;
    throw err;
  }
  return json.data;
}

async function apiPost(path, body, headers) {
  const hdrs = Object.assign({ 'Content-Type': 'application/json' }, headers || {});
  const res = await fetch(API + path, {
    method: 'POST',
    headers: hdrs,
    body: JSON.stringify(body),
  });
  const json = await res.json().catch(function() { return {}; });
  if (!res.ok) {
    const msg = (json && json.error && json.error.message) || ('Erro ' + res.status);
    const err = new Error(msg);
    err.code = json && json.error && json.error.code;
    err.status = res.status;
    throw err;
  }
  return json.data;
}

function formatBRL(cents) {
  return (cents / 100).toLocaleString('pt-BR', { style: 'currency', currency: 'BRL' });
}

function formatPhoneBR(value) {
  const digits = String(value).replace(/\D/g, '').slice(0, 11);
  if (digits.length <= 2) return digits;
  if (digits.length <= 7) return '(' + digits.slice(0, 2) + ') ' + digits.slice(2);
  return '(' + digits.slice(0, 2) + ') ' + digits.slice(2, 7) + '-' + digits.slice(7);
}

function normalizePhoneE164(masked) {
  const digits = String(masked).replace(/\D/g, '');
  if (digits.length === 10 || digits.length === 11) return '+55' + digits;
  return null;
}

function getQueryParam(name) {
  return new URLSearchParams(window.location.search).get(name);
}

function slugify(s) {
  return String(s).toLowerCase().normalize('NFD').replace(/[̀-ͯ]/g, '').replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
}

// ------- Blobs orgânicos como placeholders ilustrativos -------
function Blob({ shape, color, accent }) {
  const fill = PALETTE[color] || color;
  const ink = PALETTE.ink;
  const cream = PALETTE.cream;
  // Cada "shape" é uma composição diferente
  const paths = {
    blob1: (
      <g>
        <path d="M40,20 Q90,10 130,40 Q170,80 150,140 Q120,200 60,180 Q10,160 20,90 Q25,30 40,20 Z" fill={fill}/>
        <circle cx="70" cy="80" r="14" fill={cream}/>
        <circle cx="115" cy="85" r="14" fill={cream}/>
        <circle cx="70" cy="80" r="6" fill={ink}/>
        <circle cx="115" cy="85" r="6" fill={ink}/>
        <path d="M65,125 Q92,145 120,125" stroke={ink} strokeWidth="4" fill="none" strokeLinecap="round"/>
      </g>
    ),
    blob2: (
      <g>
        <path d="M30,90 Q20,30 80,25 Q150,15 165,70 Q180,140 130,170 Q60,190 35,150 Q15,120 30,90 Z" fill={fill}/>
        <path d="M55,60 L60,75 M85,50 L88,68 M115,55 L118,72 M145,65 L148,80" stroke={ink} strokeWidth="3" strokeLinecap="round"/>
        <ellipse cx="100" cy="120" rx="35" ry="22" fill={cream}/>
        <ellipse cx="100" cy="118" rx="20" ry="10" fill={fill} opacity="0.6"/>
      </g>
    ),
    blob3: (
      <g>
        <path d="M20,100 Q15,50 70,30 Q140,10 170,60 Q195,130 145,170 Q70,200 30,160 Q10,130 20,100 Z" fill={fill}/>
        <rect x="55" y="60" width="90" height="80" rx="6" fill={cream}/>
        <line x1="65" y1="80" x2="135" y2="80" stroke={ink} strokeWidth="3"/>
        <line x1="65" y1="100" x2="125" y2="100" stroke={ink} strokeWidth="3"/>
        <line x1="65" y1="120" x2="130" y2="120" stroke={ink} strokeWidth="3"/>
        <path d="M50,55 Q100,45 150,55" stroke={ink} strokeWidth="4" fill="none" strokeLinecap="round"/>
      </g>
    ),
    blob4: (
      <g>
        <path d="M25,80 Q35,20 100,25 Q170,30 175,90 Q180,160 110,180 Q40,195 25,140 Q15,110 25,80 Z" fill={fill}/>
        <text x="100" y="115" fontSize="64" fontWeight="800" fontFamily="Bricolage Grotesque, sans-serif" textAnchor="middle" fill={cream}>Aa</text>
        <circle cx="50" cy="55" r="6" fill={cream}/>
        <circle cx="150" cy="60" r="8" fill={cream}/>
        <circle cx="160" cy="135" r="5" fill={cream}/>
      </g>
    ),
    blob5: (
      <g>
        <path d="M30,110 Q20,40 90,30 Q160,25 170,80 Q180,150 120,175 Q50,190 25,150 Q15,130 30,110 Z" fill={fill}/>
        <circle cx="65" cy="85" r="12" fill={PALETTE.mostarda}/>
        <circle cx="100" cy="70" r="14" fill={PALETTE.verde}/>
        <circle cx="135" cy="90" r="10" fill={PALETTE.rosa}/>
        <circle cx="80" cy="125" r="10" fill={PALETTE.azul}/>
        <circle cx="120" cy="135" r="13" fill={PALETTE.lilas}/>
        <circle cx="100" cy="105" r="7" fill={cream}/>
      </g>
    ),
    blob6: (
      <g>
        <path d="M35,70 Q25,15 95,20 Q165,15 175,75 Q185,150 130,180 Q55,195 30,150 Q15,110 35,70 Z" fill={fill}/>
        <path d="M60,80 Q70,60 90,75 Q100,55 115,75 Q130,55 145,80" stroke={ink} strokeWidth="4" fill="none" strokeLinecap="round" strokeLinejoin="round"/>
        <path d="M55,120 Q90,150 145,120" stroke={cream} strokeWidth="6" fill="none" strokeLinecap="round"/>
        <circle cx="75" cy="105" r="4" fill={ink}/>
        <circle cx="125" cy="105" r="4" fill={ink}/>
      </g>
    ),
  };
  return (
    <svg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg" style={{ width: '100%', height: '100%', display: 'block' }}>
      {paths[shape]}
    </svg>
  );
}

// ------- Squiggle dividers -------
function Squiggle({ color, style }) {
  const c = color || PALETTE.terracota;
  const s = style || {};
  return (
    <svg viewBox="0 0 400 24" preserveAspectRatio="none" style={{ width: '100%', height: 24, display: 'block', ...s }}>
      <path d="M0,12 Q25,0 50,12 T100,12 T150,12 T200,12 T250,12 T300,12 T350,12 T400,12" stroke={c} strokeWidth="4" fill="none" strokeLinecap="round"/>
    </svg>
  );
}

// ------- Confete -------
function Confetti({ trigger }) {
  const [pieces, setPieces] = React.useState([]);
  React.useEffect(() => {
    if (!trigger) return;
    const colors = [PALETTE.terracota, PALETTE.mostarda, PALETTE.verde, PALETTE.rosa, PALETTE.azul, PALETTE.lilas];
    const newPieces = Array.from({ length: 80 }, function(_, i) {
      return {
        id: trigger + '-' + i,
        x: 50 + (Math.random() - 0.5) * 30,
        angle: Math.random() * Math.PI * 2,
        velocity: 200 + Math.random() * 400,
        rotation: Math.random() * 720 - 360,
        color: colors[Math.floor(Math.random() * colors.length)],
        shape: ['rect', 'circle', 'tri'][Math.floor(Math.random() * 3)],
        size: 6 + Math.random() * 10,
        delay: Math.random() * 200,
      };
    });
    setPieces(newPieces);
    const t = setTimeout(function() { setPieces([]); }, 2400);
    return function() { clearTimeout(t); };
  }, [trigger]);

  if (!pieces.length) return null;
  return (
    <div style={{ position: 'fixed', inset: 0, pointerEvents: 'none', zIndex: 9999, overflow: 'hidden' }}>
      {pieces.map(function(p) {
        const dx = Math.cos(p.angle) * p.velocity;
        const dy = Math.sin(p.angle) * p.velocity - 300;
        return (
          <div key={p.id} style={{
            position: 'absolute',
            left: p.x + 'vw',
            top: '60vh',
            width: p.size,
            height: p.size,
            backgroundColor: p.shape !== 'tri' ? p.color : 'transparent',
            borderRadius: p.shape === 'circle' ? '50%' : '2px',
            animation: 'confetti-fall 2200ms ' + p.delay + 'ms cubic-bezier(.2,.6,.4,1) forwards',
            '--dx': dx + 'px',
            '--dy': dy + 'px',
            '--rot': p.rotation + 'deg',
            ...(p.shape === 'tri' ? {
              width: 0, height: 0,
              borderLeft: (p.size/2) + 'px solid transparent',
              borderRight: (p.size/2) + 'px solid transparent',
              borderBottom: p.size + 'px solid ' + p.color,
              backgroundColor: 'transparent',
            } : {}),
          }}/>
        );
      })}
    </div>
  );
}

// ------- Header / Nav -------
function Header() {
  return (
    <header className="header">
      <a href="/" className="logo">
        <svg viewBox="0 0 60 60" width="44" height="44">
          <circle cx="30" cy="30" r="26" fill={PALETTE.terracota}/>
          <text x="30" y="40" textAnchor="middle" fontSize="28" fontWeight="800" fill={PALETTE.cream} fontFamily="Bricolage Grotesque, sans-serif">C</text>
          <circle cx="48" cy="14" r="6" fill={PALETTE.mostarda}/>
        </svg>
        <span>Profcoruja</span>
      </a>
      <nav className="nav">
        <a href="/#sobre">Sobre</a>
        <a href="/#galeria">Atividades</a>
        <a href="/#contato">Contato</a>
        <a href="/#galeria" className="nav-cta">Ver atividades →</a>
      </nav>
    </header>
  );
}

// ------- Hero -------
function Hero() {
  return (
    <section className="hero" id="topo">
      <div className="hero-bg-shapes" aria-hidden="true">
        <svg className="shape shape-1" viewBox="0 0 200 200"><path d="M40,20 Q120,0 160,60 Q200,140 130,180 Q40,200 20,120 Q10,40 40,20 Z" fill={PALETTE.mostarda}/></svg>
        <svg className="shape shape-2" viewBox="0 0 200 200"><path d="M50,30 Q140,10 170,80 Q190,160 110,180 Q30,190 20,110 Q15,50 50,30 Z" fill={PALETTE.rosa}/></svg>
        <svg className="shape shape-3" viewBox="0 0 200 200"><circle cx="100" cy="100" r="80" fill={PALETTE.verde}/></svg>
        <svg className="shape shape-4" viewBox="0 0 200 200"><path d="M30,100 Q20,30 100,20 Q180,30 180,100 Q190,180 100,180 Q20,180 30,100 Z" fill={PALETTE.azul}/></svg>
      </div>

      <div className="hero-inner">
        <div className="hero-text">
          <span className="kicker">
            <span className="kicker-dot"></span>
            Recursos para educação infantil · feitos em sala de aula
          </span>
          <h1 className="hero-title">
            Atividades que <em>realmente</em> funcionam com crianças de <span className="hero-underline">3 a 6 anos</span>.
          </h1>
          <p className="hero-sub">
            Oi, sou a Carla. Há 14 anos eu testo, ajusto e levo para a roda essas atividades. Agora elas estão aqui, prontinhas para você imprimir e usar amanhã de manhã.
          </p>
          <div className="hero-actions">
            <a href="#galeria" className="btn btn-primary">Ver atividades</a>
            <a href="#sobre" className="btn btn-ghost">Conhecer a Carla</a>
          </div>
          <div className="hero-stats">
            <div><strong>32 mil</strong><span>downloads</span></div>
            <div className="divider"></div>
            <div><strong>14 anos</strong><span>em sala</span></div>
          </div>
        </div>

        <div className="hero-illust">
          <svg viewBox="0 0 400 460" className="hero-svg">
            {/* fundo blob */}
            <path d="M60,80 Q40,20 140,30 Q280,15 340,90 Q390,200 320,330 Q220,440 130,400 Q30,360 40,250 Q35,150 60,80 Z" fill={PALETTE.terracota}/>
            {/* livro grande */}
            <g transform="translate(70, 200) rotate(-8)">
              <rect x="0" y="0" width="170" height="130" rx="6" fill={PALETTE.cream}/>
              <rect x="0" y="0" width="85" height="130" rx="6" fill={PALETTE.creamDeep}/>
              <line x1="85" y1="0" x2="85" y2="130" stroke={PALETTE.ink} strokeWidth="2"/>
              <line x1="15" y1="30" x2="70" y2="30" stroke={PALETTE.ink} strokeWidth="3" strokeLinecap="round"/>
              <line x1="15" y1="50" x2="65" y2="50" stroke={PALETTE.ink} strokeWidth="3" strokeLinecap="round"/>
              <line x1="15" y1="70" x2="68" y2="70" stroke={PALETTE.ink} strokeWidth="3" strokeLinecap="round"/>
              <text x="125" y="75" textAnchor="middle" fontSize="48" fontWeight="800" fill={PALETTE.terracota} fontFamily="Bricolage Grotesque">A</text>
            </g>
            {/* sol/flor */}
            <g transform="translate(290, 90)">
              <circle cx="0" cy="0" r="38" fill={PALETTE.mostarda}/>
              {Array.from({length:8}).map(function(_,i){
                const a = (i/8)*Math.PI*2;
                return <ellipse key={i} cx={Math.cos(a)*55} cy={Math.sin(a)*55} rx="14" ry="6" transform={'rotate(' + (a*180/Math.PI) + ' ' + (Math.cos(a)*55) + ' ' + (Math.sin(a)*55) + ')'} fill={PALETTE.mostarda}/>;
              })}
              <circle cx="-10" cy="-5" r="3" fill={PALETTE.ink}/>
              <circle cx="10" cy="-5" r="3" fill={PALETTE.ink}/>
              <path d="M-8,8 Q0,15 8,8" stroke={PALETTE.ink} strokeWidth="2.5" fill="none" strokeLinecap="round"/>
            </g>
            {/* lapis */}
            <g transform="translate(250, 270) rotate(25)">
              <rect x="0" y="0" width="120" height="22" fill={PALETTE.verde}/>
              <polygon points="120,0 145,11 120,22" fill={PALETTE.cream}/>
              <polygon points="135,4 145,11 135,18" fill={PALETTE.ink}/>
              <rect x="-15" y="0" width="15" height="22" fill={PALETTE.rosa}/>
              <rect x="-22" y="0" width="7" height="22" fill={PALETTE.azul}/>
            </g>
            {/* estrela */}
            <g transform="translate(110, 110)">
              <path d="M0,-20 L6,-6 L20,-6 L9,3 L13,18 L0,9 L-13,18 L-9,3 L-20,-6 L-6,-6 Z" fill={PALETTE.cream}/>
            </g>
            {/* nuvem rabisco */}
            <path d="M280,380 Q310,360 340,380 Q360,400 330,410 Q300,420 280,400 Z" fill={PALETTE.cream}/>
          </svg>
        </div>
      </div>

      <Squiggle color={PALETTE.terracota} style={{ marginTop: 40 }}/>
    </section>
  );
}

// ------- Sobre -------
function Sobre() {
  return (
    <section className="sobre" id="sobre">
      <div className="sobre-photo">
        <div className="photo-frame">
          <div className="photo-placeholder">
            <img src="/assets/img/carla.jpg" alt="Carla Silva, professora de Educação Infantil" loading="lazy"/>
          </div>
          <div className="photo-tape photo-tape-tl"></div>
          <div className="photo-tape photo-tape-br"></div>
        </div>
        <svg className="sobre-deco" viewBox="0 0 100 100">
          <path d="M50,10 Q60,40 90,50 Q60,60 50,90 Q40,60 10,50 Q40,40 50,10 Z" fill={PALETTE.mostarda}/>
        </svg>
      </div>

      <div className="sobre-text">
        <span className="kicker"><span className="kicker-dot" style={{background: PALETTE.verde}}></span>Quem sou eu</span>
        <h2>Carla Silva — pedagoga, contadora de histórias e <em>cultivadora de cantinhos.</em></h2>
        <p>Comecei na Educação Infantil em 2012, depois de uma temporada inesperada como bibliotecária de escola. Foi lá, lendo para grupos de cinco anos sentados no tapete, que descobri o que queria fazer.</p>
        <p>Dou aula no <strong>Maternal e Pré II</strong>, mas as atividades aqui foram pensadas para você adaptar — para a sua turma, o seu espaço e o seu repertório.</p>
        <ul className="credos">
          <li><span style={{background: PALETTE.terracota}}></span>Brincar é coisa séria — toda atividade aqui passou pela prova do tapete</li>
          <li><span style={{background: PALETTE.verde}}></span>Material de baixo custo: o que tem na sala já basta</li>
          <li><span style={{background: PALETTE.azul}}></span>Inclusão e adaptação fazem parte do plano, não são apêndice</li>
        </ul>
      </div>
    </section>
  );
}

// ------- Card preview (carrossel automático: desenho -> páginas -> desenho) -------
function CardPreview(props) {
  const images = props.images || [];
  const offset = Number(props.offset) || 0;
  // active = -1 -> mostra apenas o desenho do card; 0..N-1 -> mostra essa imagem de preview
  const [active, setActive] = React.useState(-1);
  const [failed, setFailed] = React.useState({});

  React.useEffect(function() {
    if (images.length === 0) return;
    const reduce =
      typeof window !== 'undefined' &&
      window.matchMedia &&
      window.matchMedia('(prefers-reduced-motion: reduce)').matches;
    if (reduce) return;

    const stagger = (offset % 5) * 500;
    let intervalId = null;
    const startId = setTimeout(function() {
      setActive(0);
      intervalId = setInterval(function() {
        setActive(function(i) {
          const next = i + 1;
          return next > images.length - 1 ? -1 : next;
        });
      }, 2400);
    }, 1200 + stagger);

    return function() {
      clearTimeout(startId);
      if (intervalId !== null) clearInterval(intervalId);
    };
  }, [images.length, offset]);

  if (!images.length) return null;
  const showing = active >= 0;

  return (
    <div className={'card-preview' + (showing ? ' is-showing' : '')} aria-hidden="true">
      {images.map(function(src, i) {
        if (failed[i]) return null;
        return (
          <img
            key={src}
            src={src}
            alt=""
            loading="lazy"
            decoding="async"
            className={'card-preview-img' + (i === active ? ' is-active' : '')}
            style={{ '--idx': i }}
            onError={function() { setFailed(function(s) { return Object.assign({}, s, { [i]: true }); }); }}
          />
        );
      })}
    </div>
  );
}

// ------- Galeria -------
function Galeria() {
  const [products, setProducts] = React.useState(null); // null = loading
  const [error, setError] = React.useState(null);
  const [filterType, setFilterType] = React.useState('todos');
  const [filterAge, setFilterAge] = React.useState('todas');
  const [downloadingId, setDownloadingId] = React.useState(null);

  React.useEffect(function() {
    apiGet('/products?limit=50')
      .then(function(data) {
        setProducts(data.items);
      })
      .catch(function(err) {
        setError(err.message || 'Erro ao carregar atividades');
      });
  }, []);

  async function handleFreeDownload(product) {
    setDownloadingId(product.id);
    try {
      const res = await fetch(API + '/products/' + product.slug + '/file?v=' + (product.id || ''));
      if (!res.ok) {
        alert('Não foi possível baixar agora. Tente novamente em instantes.');
        return;
      }
      const blob = await res.blob();
      const ext = (res.headers.get('content-type') || '').indexOf('zip') !== -1 ? '.zip' : '.pdf';
      const url = URL.createObjectURL(blob);
      const a = document.createElement('a');
      a.href = url;
      a.download = product.slug + ext;
      document.body.appendChild(a);
      a.click();
      setTimeout(function() { URL.revokeObjectURL(url); a.remove(); }, 1000);
    } catch (e) {
      alert('Não foi possível baixar agora. Tente novamente em instantes.');
    } finally {
      setDownloadingId(null);
    }
  }

  const filtered = (products || []).filter(function(p) {
    if (filterType !== 'todos' && p.type !== filterType) return false;
    if (filterAge !== 'todas') {
      const ageRange = p.ageRange || '';
      const parts = ageRange.split('-').map(Number);
      const min = parts[0];
      const max = parts[1] !== undefined ? parts[1] : parts[0];
      const fparts = filterAge.split('-').map(Number);
      const fmin = fparts[0];
      const fmax = fparts[1] !== undefined ? fparts[1] : fparts[0];
      if (max < fmin || min > fmax) return false;
    }
    return true;
  });

  return (
    <section className="galeria" id="galeria">
      <div className="gal-header">
        <span className="kicker"><span className="kicker-dot" style={{background: PALETTE.rosa}}></span>Biblioteca de atividades</span>
        <h2>Pegue, imprima, leve para a roda.</h2>
        <p className="gal-sub">PDFs com plano de aula incluído. Escolha a atividade e finalize a compra com segurança.</p>
      </div>

      <div className="filters">
        <div className="filter-group">
          <span className="filter-label">Tipo</span>
          <div className="chips">
            {['todos', 'projeto', 'producao-textual', 'matematica', 'alfabetizacao', 'contacao', 'sensorial'].map(function(t) {
              return (
                <button key={t} className={'chip ' + (filterType === t ? 'active' : '')} onClick={function() { setFilterType(t); }}>
                  {t === 'todos' ? 'Todas' : TYPE_LABELS[t]}
                </button>
              );
            })}
          </div>
        </div>
        <div className="filter-group">
          <span className="filter-label">Idade</span>
          <div className="chips">
            {[
              ['todas', 'Todas idades'],
              ['2-3', '2 a 3'],
              ['3-4', '3 a 4'],
              ['4-5', '4 a 5'],
              ['5-6', '5 a 6'],
              ['8-10', '8 a 10'],
            ].map(function(item) {
              const v = item[0];
              const label = item[1];
              return (
                <button key={v} className={'chip ' + (filterAge === v ? 'active' : '')} onClick={function() { setFilterAge(v); }}>
                  {label}
                </button>
              );
            })}
          </div>
        </div>
      </div>

      {products === null && !error && (
        <div className="gal-loading" aria-live="polite">
          <div className="cards">
            {[1, 2, 3, 4, 5, 6].map(function(i) {
              return (
                <div key={i} className="card card-skeleton">
                  <div className="skeleton skeleton-card-illust"></div>
                  <div className="card-body">
                    <div className="skeleton skeleton-text" style={{width: '60%'}}></div>
                    <div className="skeleton skeleton-title" style={{marginBottom: 8}}></div>
                    <div className="skeleton skeleton-text" style={{width: '80%'}}></div>
                    <div className="skeleton skeleton-text" style={{width: '50%', marginTop: 8}}></div>
                  </div>
                </div>
              );
            })}
          </div>
        </div>
      )}

      {error && (
        <div className="gal-error" role="alert">
          <p>Não conseguimos carregar as atividades. Tente recarregar a página.</p>
          <button className="btn btn-primary" style={{marginTop: 16}} onClick={function() { window.location.reload(); }}>Recarregar</button>
        </div>
      )}

      {products !== null && !error && (
        <>
          <div className="gal-meta">
            <span>{filtered.length} atividade{filtered.length !== 1 ? 's' : ''}</span>
            {(filterType !== 'todos' || filterAge !== 'todas') && (
              <button className="reset" onClick={function() { setFilterType('todos'); setFilterAge('todas'); }}>Limpar filtros</button>
            )}
          </div>

          <div className="cards">
            {filtered.map(function(product, idx) {
              const blobColor = product.colorToken || 'terracota';
              const blobShape = product.shapeToken || 'blob1';
              const accentColor = PALETTE[blobColor] || PALETTE.terracota;
              const isDownloading = downloadingId === product.id;
              const previews = product.previewImageUrls || [];
              return (
                <article
                  key={product.id}
                  className="card"
                  style={{ '--accent': accentColor }}
                >
                  <div className="card-illust">
                    <Blob shape={blobShape} color={blobColor}/>
                    <CardPreview images={previews} offset={idx}/>
                  </div>
                  <div className="card-body">
                    <div className="card-tags">
                      {product.type && <span className="tag">{TYPE_LABELS[product.type] || product.type}</span>}
                      {product.ageRange && <span className="tag tag-age">{product.ageRange} anos</span>}
                    </div>
                    <h3>{product.title}</h3>
                    <div className="card-meta">
                      {product.pages && <span>📄 {product.pages} páginas</span>}
                      {product.downloadCount !== undefined && (
                        <span>↓ {Number(product.downloadCount).toLocaleString('pt-BR')}</span>
                      )}
                    </div>
                    {product.isFree ? (
                      <button
                        className={'btn-download free' + (isDownloading ? ' downloading' : '')}
                        onClick={function() { if (!isDownloading) handleFreeDownload(product); }}
                        disabled={isDownloading}
                        aria-label={'Baixar grátis: ' + product.title}
                      >
                        {isDownloading ? 'Baixando...' : 'Baixar grátis'}
                      </button>
                    ) : (
                      <button
                        className="btn-download paid"
                        onClick={function() { window.location.href = '/checkout.html?slug=' + product.slug; }}
                        aria-label={'Comprar ' + product.title + ' por ' + formatBRL(product.priceCents)}
                      >
                        Comprar {formatBRL(product.priceCents)}
                      </button>
                    )}
                  </div>
                </article>
              );
            })}
            {filtered.length === 0 && products.length > 0 && (
              <div className="empty">
                <p className="empty-emoji" aria-hidden="true">📚✨</p>
                <h3 className="empty-title">Ainda estou digitalizando esse cantinho!</h3>
                <p>Tenho um montão de atividades guardadas que ainda não consegui digitalizar todas. Logo, logo essa categoria vai estar pronta e prontinha pra você baixar e usar em sala de aula. 💛</p>
                <button className="reset" onClick={function() { setFilterType('todos'); setFilterAge('todas'); }}>Ver as atividades disponíveis</button>
              </div>
            )}
            {products.length === 0 && (
              <div className="empty">
                <p>Sem atividades no momento.</p>
              </div>
            )}
          </div>
        </>
      )}
    </section>
  );
}

// ------- Contato -------
function Contato() {
  const [form, setForm] = React.useState({ nome: '', email: '', escola: '', mensagem: '' });
  const [sent, setSent] = React.useState(false);
  const [sending, setSending] = React.useState(false);
  const [error, setError] = React.useState('');

  const submit = async function(e) {
    e.preventDefault();
    if (sending || sent) return;
    if (!form.nome || !form.email || !form.mensagem) return;
    setError('');
    setSending(true);
    try {
      await apiPost('/leads', {
        name: form.nome.trim(),
        email: form.email.trim(),
        school: form.escola.trim() || undefined,
        message: form.mensagem.trim(),
      });
      setSent(true);
      setForm({ nome: '', email: '', escola: '', mensagem: '' });
      setTimeout(function() { setSent(false); }, 4000);
    } catch (err) {
      const msg = err && err.status === 429
        ? 'Você enviou muitas mensagens em pouco tempo. Tenta de novo daqui a pouco.'
        : (err && err.message) || 'Não consegui enviar agora. Tenta de novo em alguns instantes.';
      setError(msg);
    } finally {
      setSending(false);
    }
  };

  return (
    <section className="contato" id="contato">
      <div className="contato-inner">
        <div className="contato-text">
          <span className="kicker"><span className="kicker-dot" style={{background: PALETTE.mostarda}}></span>Falar com a Carla</span>
          <h2>Tem uma <em>dúvida</em>, uma <em>sugestão</em>, ou quer um material novo?</h2>
          <p>Eu leio tudo. Respondo em até três dias úteis (a não ser que esteja na semana de festa junina, aí me dá uma semana).</p>
          <ul className="contato-list">
            <li><strong>Instagram</strong><span>@profcoruja.com.br</span></li>
            <li><strong>Onde estou</strong><span>Torres, Rio Grande do Sul</span></li>
          </ul>
        </div>

        <form className="contato-form" onSubmit={submit}>
          <div className="form-row">
            <label>
              <span>Seu nome</span>
              <input type="text" value={form.nome} onChange={function(e) { setForm(Object.assign({}, form, {nome: e.target.value})); }} placeholder="Como posso te chamar?" required/>
            </label>
            <label>
              <span>E-mail</span>
              <input type="email" value={form.email} onChange={function(e) { setForm(Object.assign({}, form, {email: e.target.value})); }} placeholder="seu@email.com" required/>
            </label>
          </div>
          <label>
            <span>Escola ou rede (opcional)</span>
            <input type="text" value={form.escola} onChange={function(e) { setForm(Object.assign({}, form, {escola: e.target.value})); }} placeholder="Onde você dá aula?"/>
          </label>
          <label>
            <span>Mensagem</span>
            <textarea rows="5" value={form.mensagem} onChange={function(e) { setForm(Object.assign({}, form, {mensagem: e.target.value})); }} placeholder="Conta pra mim..." required/>
          </label>
          <button type="submit" className={'btn btn-primary' + (sent ? ' sent' : '')} disabled={sent || sending}>
            {sent ? '✓ Mensagem recebida — obrigada!' : (sending ? 'Enviando...' : 'Enviar mensagem')}
          </button>
          {error ? <p className="contato-error" role="alert">{error}</p> : null}
        </form>
      </div>
    </section>
  );
}

// ------- Footer -------
function Footer() {
  return (
    <footer className="footer">
      <Squiggle color={PALETTE.mostarda}/>
      <div className="footer-inner">
        <div>
          <div className="logo logo-foot">
            <svg viewBox="0 0 60 60" width="40" height="40">
              <circle cx="30" cy="30" r="26" fill={PALETTE.mostarda}/>
              <text x="30" y="40" textAnchor="middle" fontSize="28" fontWeight="800" fill={PALETTE.cream} fontFamily="Bricolage Grotesque, sans-serif">C</text>
            </svg>
            <span>Profcoruja</span>
          </div>
          <p>Recursos para a Educação Infantil.</p>
        </div>
        <div className="footer-links">
          <h4>Site</h4>
          <a href="/#sobre">Sobre</a>
          <a href="/#galeria">Atividades</a>
          <a href="/#contato">Contato</a>
        </div>
        <div className="footer-links">
          <h4>Categorias</h4>
          <a href="/#galeria">Alfabetização</a>
          <a href="/#galeria">Contação</a>
          <a href="/#galeria">Sensorial</a>
        </div>
        <div className="footer-links">
          <h4>Licença</h4>
          <p style={{fontSize: 13, lineHeight: 1.5, margin: 0, color: PALETTE.inkSoft}}>Materiais sob CC BY-NC. Use em sala à vontade, só não venda, combinado?</p>
        </div>
      </div>
      <div className="footer-bottom">
        <span>© 2026 Carla Silva</span>
        <span>Feito com amor entre uma roda e outra</span>
      </div>
    </footer>
  );
}

// ------- App (catálogo) -------
function App() {
  return (
    <div className="app">
      <Header/>
      <Hero/>
      <Sobre/>
      <Galeria/>
      <Contato/>
      <Footer/>
    </div>
  );
}

// ------- CheckoutPage -------
function CheckoutPage() {
  const slug = getQueryParam('slug');

  const [produto, setProduto] = React.useState(null);
  const [loadState, setLoadState] = React.useState('loading'); // loading | ok | error | notfound
  const [retryCount, setRetryCount] = React.useState(0);

  const [nome, setNome] = React.useState('');
  const [email, setEmail] = React.useState('');
  const [telefone, setTelefone] = React.useState('');

  const [erros, setErros] = React.useState({});
  const [apiError, setApiError] = React.useState('');
  const [submitting, setSubmitting] = React.useState(false);

  React.useEffect(function() {
    if (!slug) {
      setLoadState('notfound');
      return;
    }
    setLoadState('loading');
    apiGet('/products/' + slug)
      .then(function(data) {
        if (!data || data.isActive === false) {
          setLoadState('notfound');
        } else {
          setProduto(data);
          setLoadState('ok');
        }
      })
      .catch(function(err) {
        if (err && err.status === 404) {
          setLoadState('notfound');
        } else {
          setLoadState('error');
        }
      });
  }, [slug, retryCount]);

  function validarForm() {
    const novosErros = {};
    if (!nome || nome.trim().length < 2 || nome.trim().length > 120) {
      novosErros.nome = 'Nome deve ter entre 2 e 120 caracteres.';
    }
    const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    if (!email || !emailRegex.test(email)) {
      novosErros.email = 'Informe um e-mail válido.';
    }
    const phoneNorm = normalizePhoneE164(telefone);
    if (!phoneNorm) {
      novosErros.telefone = 'Informe um telefone brasileiro válido, ex: (11) 99999-9999.';
    }
    return novosErros;
  }

  function handlePhoneChange(e) {
    setTelefone(formatPhoneBR(e.target.value));
  }

  async function handleSubmit(e) {
    e.preventDefault();
    setApiError('');
    const novosErros = validarForm();
    if (Object.keys(novosErros).length > 0) {
      setErros(novosErros);
      return;
    }
    setErros({});
    setSubmitting(true);
    try {
      const data = await apiPost('/checkout', {
        items: [{ productId: produto.id, quantity: 1 }],
        customer: {
          email: email.trim(),
          name: nome.trim(),
          phone: normalizePhoneE164(telefone),
        },
        paymentMethods: ['card'],
      });
      localStorage.setItem('lastOrderEmail', email.trim());
      window.location.href = data.checkoutUrl;
    } catch (err) {
      setSubmitting(false);
      if (err && (err.status === 503 || err.code === 'PAYMENT_PROVIDER_UNAVAILABLE')) {
        setApiError('Pagamentos em manutenção, tente em instantes.');
      } else if (err && (err.status === 400 || err.status === 422)) {
        setApiError(err.message || 'Dados inválidos. Verifique o formulário.');
      } else {
        setApiError('Algo deu errado, tente novamente.');
      }
    }
  }

  const formValido = nome.trim().length >= 2 && /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email) && normalizePhoneE164(telefone) !== null;

  if (!slug) {
    return (
      <div className="app">
        <Header/>
        <div className="page-center">
          <div className="page-center-inner">
            <h2>Atividade não encontrada</h2>
            <p>O link que você acessou não corresponde a nenhuma atividade.</p>
            <a href="/" className="btn btn-primary" style={{marginTop: 24, display: 'inline-flex'}}>Ir ao catálogo</a>
          </div>
        </div>
        <Footer/>
      </div>
    );
  }

  if (loadState === 'loading') {
    return (
      <div className="app">
        <Header/>
        <div className="checkout-page">
          <div className="checkout-preview">
            <div className="skeleton skeleton-blob"></div>
            <div className="skeleton skeleton-title"></div>
            <div className="skeleton skeleton-text"></div>
            <div className="skeleton skeleton-price"></div>
          </div>
          <div className="checkout-form-col">
            <div className="skeleton skeleton-title"></div>
            <div className="skeleton skeleton-text"></div>
            <div className="skeleton skeleton-text"></div>
            <div className="skeleton skeleton-text"></div>
          </div>
        </div>
        <Footer/>
      </div>
    );
  }

  if (loadState === 'notfound') {
    return (
      <div className="app">
        <Header/>
        <div className="page-center">
          <div className="page-center-inner">
            <h2>Atividade não encontrada</h2>
            <p>Esta atividade pode não estar mais disponível.</p>
            <a href="/" className="btn btn-primary" style={{marginTop: 24, display: 'inline-flex'}}>Ir ao catálogo</a>
          </div>
        </div>
        <Footer/>
      </div>
    );
  }

  if (loadState === 'error') {
    return (
      <div className="app">
        <Header/>
        <div className="page-center">
          <div className="page-center-inner">
            <h2>Ops, algo deu errado</h2>
            <p>Não conseguimos carregar a atividade. Verifique sua conexão e tente novamente.</p>
            <button
              className="btn btn-primary"
              style={{marginTop: 24}}
              onClick={function() { setRetryCount(function(c) { return c + 1; }); }}
            >
              Tentar de novo
            </button>
          </div>
        </div>
        <Footer/>
      </div>
    );
  }

  // loadState === 'ok'
  const blobShape = (produto && produto.shapeToken) || 'blob1';
  const blobColor = (produto && produto.colorToken) || 'terracota';
  const accentColor = PALETTE[blobColor] || PALETTE.terracota;

  return (
    <div className="app">
      <Header/>
      <div className="checkout-page">

        {/* Coluna esquerda — preview */}
        <div className="checkout-preview">
          <div className="checkout-blob" style={{background: accentColor}}>
            <Blob shape={blobShape} color={blobColor}/>
          </div>
          <div className="checkout-preview-body">
            <div className="card-tags" style={{marginBottom: 12}}>
              {produto.type && <span className="tag">{TYPE_LABELS[produto.type] || produto.type}</span>}
              {produto.ageRange && <span className="tag tag-age">{produto.ageRange} anos</span>}
            </div>
            <h1 className="checkout-title">{produto.title}</h1>
            {produto.shortDescription && (
              <p className="checkout-desc">{produto.shortDescription}</p>
            )}
            <div className="checkout-metrics">
              {produto.pages && <span>📄 {produto.pages} páginas</span>}
              {produto.downloadCount !== undefined && (
                <span>↓ {Number(produto.downloadCount).toLocaleString('pt-BR')} downloads</span>
              )}
            </div>
            <div className="checkout-price">{formatBRL(produto.priceCents)}</div>
            <p className="checkout-copy">
              Você receberá o PDF diretamente no seu e-mail após a confirmação do pagamento.
            </p>
          </div>
        </div>

        {/* Coluna direita — formulário */}
        <div className="checkout-form-col">
          <a href="/" className="checkout-back">← Voltar ao catálogo</a>

          <h2 className="checkout-form-title">Finalizar compra</h2>

          {apiError && (
            <div className="checkout-api-error" role="alert">{apiError}</div>
          )}

          <form onSubmit={handleSubmit} noValidate>
            <div className="checkout-field">
              <label htmlFor="co-nome">Nome completo</label>
              <input
                id="co-nome"
                type="text"
                value={nome}
                onChange={function(e) { setNome(e.target.value); }}
                placeholder="Seu nome"
                required
                className={erros.nome ? 'input-error' : ''}
                aria-describedby={erros.nome ? 'err-nome' : undefined}
              />
              {erros.nome && <span className="field-error" id="err-nome" role="alert">{erros.nome}</span>}
            </div>

            <div className="checkout-field">
              <label htmlFor="co-email">E-mail</label>
              <input
                id="co-email"
                type="email"
                value={email}
                onChange={function(e) { setEmail(e.target.value); }}
                placeholder="seu@email.com"
                required
                className={erros.email ? 'input-error' : ''}
                aria-describedby={erros.email ? 'err-email' : undefined}
              />
              {erros.email && <span className="field-error" id="err-email" role="alert">{erros.email}</span>}
            </div>

            <div className="checkout-field">
              <label htmlFor="co-tel">Telefone</label>
              <input
                id="co-tel"
                type="tel"
                value={telefone}
                onChange={handlePhoneChange}
                placeholder="(11) 99999-9999"
                required
                className={erros.telefone ? 'input-error' : ''}
                aria-describedby={erros.telefone ? 'err-tel' : undefined}
              />
              {erros.telefone && <span className="field-error" id="err-tel" role="alert">{erros.telefone}</span>}
            </div>

            <div className="checkout-summary">
              <div className="checkout-summary-row">
                <span>1× {produto.title}</span>
                <span>{formatBRL(produto.priceCents)}</span>
              </div>
              <div className="checkout-summary-row checkout-summary-total">
                <span>Total</span>
                <span>{formatBRL(produto.priceCents)}</span>
              </div>
            </div>

            <p className="checkout-stripe-info">
              Pagamento via Stripe (cartão). Após confirmação, os links chegam no seu e-mail.
            </p>

            <button
              type="submit"
              className="btn btn-pay"
              disabled={submitting}
            >
              {submitting ? 'Processando...' : 'Pagar com Stripe'}
            </button>
          </form>
        </div>

      </div>
      <Footer/>
    </div>
  );
}

// ------- ThanksItemsList — lista de itens com download por pedido -------
function ThanksItemsList({ items, orderNumber, email }) {
  const [downloadingIds, setDownloadingIds] = React.useState({});

  async function handleDownload(item) {
    const productId = item.productId;
    if (!productId) {
      alert('Não foi possível identificar o produto para download.');
      return;
    }
    setDownloadingIds(function(prev) { return Object.assign({}, prev, { [productId]: true }); });
    try {
      await downloadOrderFile(orderNumber, email, productId, item.title || productId);
    } finally {
      setDownloadingIds(function(prev) {
        const next = Object.assign({}, prev);
        delete next[productId];
        return next;
      });
    }
  }

  return (
    <div className="thanks-items">
      {items.map(function(item, idx) {
        const productId = item.productId;
        const isDownloading = !!downloadingIds[productId];
        return (
          <div key={idx} className="thanks-item-card">
            <div className="thanks-item-title">{item.title}</div>
            <button
              className={'btn btn-primary thanks-download-btn' + (isDownloading ? ' downloading' : '')}
              onClick={function() { if (!isDownloading) handleDownload(item); }}
              disabled={isDownloading}
              aria-label={'Baixar PDF: ' + (item.title || '')}
            >
              {isDownloading ? 'Baixando...' : 'Baixar PDF'}
            </button>
          </div>
        );
      })}
    </div>
  );
}

// ------- ThanksPage -------
async function downloadOrderFile(orderNumber, email, productId, productTitle) {
  const res = await fetch(API + '/orders/' + orderNumber + '/file/' + productId, {
    headers: { 'X-Order-Email': email },
  });
  if (!res.ok) {
    const err = await res.json().catch(function() { return {}; });
    alert((err && err.error && err.error.message) || 'Não foi possível baixar agora.');
    return;
  }
  const blob = await res.blob();
  const ext = (res.headers.get('content-type') || '').indexOf('zip') !== -1 ? '.zip' : '.pdf';
  const url = URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url;
  a.download = slugify(productTitle) + ext;
  document.body.appendChild(a);
  a.click();
  setTimeout(function() { URL.revokeObjectURL(url); a.remove(); }, 1000);
}

function ThanksPage() {
  const orderNumber = getQueryParam('order');
  const storedEmail = localStorage.getItem('lastOrderEmail');

  const [emailInput, setEmailInput] = React.useState(storedEmail || '');
  const [emailConfirmado, setEmailConfirmado] = React.useState(!!storedEmail);
  const [pedido, setPedido] = React.useState(null);
  const [loadState, setLoadState] = React.useState(storedEmail ? 'loading' : 'need-email');
  const [emailError, setEmailError] = React.useState('');

  function carregarPedido(email) {
    setLoadState('loading');
    apiGet('/orders/' + orderNumber, { 'X-Order-Email': email })
      .then(function(data) {
        setPedido(data);
        setLoadState('ok');
      })
      .catch(function(err) {
        if (err && err.status === 404) {
          setLoadState('notfound');
        } else {
          setLoadState('error');
        }
      });
  }

  React.useEffect(function() {
    if (!orderNumber) {
      setLoadState('no-order');
      return;
    }
    if (storedEmail) {
      carregarPedido(storedEmail);
    }
  }, []);

  // Polling para PIX
  React.useEffect(function() {
    if (!pedido || pedido.status !== 'PENDING_PAYMENT') return;
    const email = storedEmail || emailInput;
    const interval = setInterval(function() {
      apiGet('/orders/' + orderNumber, { 'X-Order-Email': email })
        .then(function(data) {
          setPedido(data);
          if (data.status !== 'PENDING_PAYMENT') {
            clearInterval(interval);
          }
        })
        .catch(function() {});
    }, 5000);
    return function() { clearInterval(interval); };
  }, [pedido && pedido.status]);

  function handleEmailSubmit(e) {
    e.preventDefault();
    const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    if (!emailRegex.test(emailInput)) {
      setEmailError('Informe um e-mail válido.');
      return;
    }
    setEmailError('');
    setEmailConfirmado(true);
    carregarPedido(emailInput);
  }

  const statusConfig = {
    PAID: { label: 'Pago', className: 'status-paid' },
    PENDING_PAYMENT: { label: 'Aguardando pagamento', className: 'status-pending' },
    EXPIRED: { label: 'Expirado', className: 'status-failed' },
    FAILED: { label: 'Falhou', className: 'status-failed' },
    CANCELED: { label: 'Cancelado', className: 'status-failed' },
  };

  if (!orderNumber) {
    return (
      <div className="app">
        <Header/>
        <div className="thanks-page">
          <h1>Pedido não encontrado</h1>
          <p>O link que você acessou não contém um número de pedido.</p>
          <a href="/" className="btn btn-primary" style={{marginTop: 24, display: 'inline-flex'}}>Ir ao catálogo</a>
        </div>
        <Footer/>
      </div>
    );
  }

  if (loadState === 'need-email') {
    return (
      <div className="app">
        <Header/>
        <div className="thanks-page">
          <h1 className="thanks-heading">Confirme seu e-mail</h1>
          <p>Para ver os detalhes do pedido <strong>{orderNumber}</strong>, confirme o e-mail usado na compra.</p>
          <form onSubmit={handleEmailSubmit} style={{marginTop: 32}}>
            <div className="checkout-field">
              <label htmlFor="thanks-email">Seu e-mail</label>
              <input
                id="thanks-email"
                type="email"
                value={emailInput}
                onChange={function(e) { setEmailInput(e.target.value); }}
                placeholder="seu@email.com"
                required
                className={emailError ? 'input-error' : ''}
              />
              {emailError && <span className="field-error" role="alert">{emailError}</span>}
            </div>
            <button type="submit" className="btn btn-primary" style={{marginTop: 16}}>Ver pedido</button>
          </form>
        </div>
        <Footer/>
      </div>
    );
  }

  if (loadState === 'loading') {
    return (
      <div className="app">
        <Header/>
        <div className="thanks-page">
          <div className="skeleton skeleton-title" style={{margin: '0 auto 16px'}}></div>
          <div className="skeleton skeleton-text" style={{margin: '0 auto 12px'}}></div>
          <div className="skeleton skeleton-text" style={{margin: '0 auto'}}></div>
        </div>
        <Footer/>
      </div>
    );
  }

  if (loadState === 'notfound' || loadState === 'no-order') {
    return (
      <div className="app">
        <Header/>
        <div className="thanks-page">
          <h1>Pedido não encontrado</h1>
          <p>Verifique se o e-mail informado é o mesmo usado na compra.</p>
          <a href="/" className="btn btn-primary" style={{marginTop: 24, display: 'inline-flex'}}>Ir ao catálogo</a>
        </div>
        <Footer/>
      </div>
    );
  }

  if (loadState === 'error') {
    return (
      <div className="app">
        <Header/>
        <div className="thanks-page">
          <h1>Ops, algo deu errado</h1>
          <p>Não conseguimos carregar seu pedido. Tente novamente em instantes.</p>
          <button
            className="btn btn-primary"
            style={{marginTop: 24}}
            onClick={function() { carregarPedido(emailInput || storedEmail); }}
          >
            Tentar de novo
          </button>
        </div>
        <Footer/>
      </div>
    );
  }

  const statusInfo = statusConfig[pedido.status] || { label: pedido.status, className: 'status-pending' };
  const isTerminal = ['EXPIRED', 'FAILED', 'CANCELED'].includes(pedido.status);

  return (
    <div className="app">
      <Header/>
      <div className="thanks-page">
        <h1 className="thanks-heading">Obrigado pela compra!</h1>
        <p className="thanks-sub">Você receberá os links por e-mail. Aqui também:</p>

        <div className="thanks-order-number">
          Pedido <strong>{pedido.orderNumber}</strong>
        </div>

        <div className={'thanks-status ' + statusInfo.className}>
          {statusInfo.label}
        </div>

        {pedido.status === 'PENDING_PAYMENT' && (
          <p className="thanks-pending-info">
            Aguardando confirmação do pagamento... Esta página atualiza automaticamente a cada 5 segundos.
          </p>
        )}

        {isTerminal && (
          <div style={{marginTop: 24}}>
            <p>Esta compra não foi finalizada.</p>
            <a href="/" className="btn btn-primary" style={{marginTop: 16, display: 'inline-flex'}}>Ir ao catálogo</a>
          </div>
        )}

        {pedido.status === 'PAID' && pedido.items && pedido.items.length > 0 && (
          <ThanksItemsList items={pedido.items} orderNumber={pedido.orderNumber} email={storedEmail || emailInput} />
        )}
      </div>
      <Footer/>
    </div>
  );
}

// ------- CancelPage -------
function CancelPage() {
  const orderNumber = getQueryParam('order');

  return (
    <div className="app">
      <Header/>
      <div className="cancel-page">
        <div className="cancel-icon" aria-hidden="true">
          <svg viewBox="0 0 80 80" width="80" height="80">
            <circle cx="40" cy="40" r="36" fill={PALETTE.creamDeep} stroke={PALETTE.ink} strokeWidth="3"/>
            <path d="M25,25 L55,55 M55,25 L25,55" stroke={PALETTE.terracota} strokeWidth="5" strokeLinecap="round"/>
          </svg>
        </div>
        <h1 className="cancel-heading">Pagamento não concluído</h1>
        <p className="cancel-text">
          Você cancelou o pagamento ou ele falhou. Sem problemas — pode tentar de novo quando quiser.
        </p>
        {orderNumber && (
          <p className="cancel-order-info">
            Pedido: <strong>{orderNumber}</strong>
          </p>
        )}
        <div className="cancel-actions">
          <a href="/" className="btn btn-primary">Voltar ao catálogo</a>
        </div>
      </div>
      <Footer/>
    </div>
  );
}

window.App = App;
window.CheckoutPage = CheckoutPage;
window.ThanksPage = ThanksPage;
window.CancelPage = CancelPage;
