// App root: ties everything together. Manages pedidos drafts, favorites, modals, tweaks.

const { useState: useStateA, useEffect: useEffectA, useMemo: useMemoA, useCallback: useCallbackA } = React;

const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "layout": "editorial",
  "showPrice": true,
  "theme": "earthy"
}/*EDITMODE-END*/;

function App() {
  const [products] = useStateA(window.CATALOG);
  const [q, setQ] = useStateA('');
  const [filters, setFilters] = useStateA({
    categoria: new Set(),
    cor: new Set(),
    acabamento: new Set(),
    tamanho: new Set(),
    ambiente: new Set(),
    faixa: new Set(),
    favOnly: false,
  });
  const [openProduct, setOpenProduct] = useStateA(null); // product object being configured
  const [editingPedido, setEditingPedido] = useStateA(null); // pedido id being edited
  const [pedidos, setPedidos] = useStateA(() => {
    try {
      const raw = localStorage.getItem('six.pedidos');
      return raw ? JSON.parse(raw).map(p => ({...p, product: window.CATALOG.find(c => c.id === p.productId)})).filter(p => p.product) : [];
    } catch { return []; }
  });
  const [favorites, setFavorites] = useStateA(() => {
    try {
      const raw = localStorage.getItem('six.favorites');
      return new Set(raw ? JSON.parse(raw) : []);
    } catch { return new Set(); }
  });
  const [savedClient, setSavedClient] = useStateA(() => {
    try {
      const raw = localStorage.getItem('six.client');
      return raw ? JSON.parse(raw) : null;
    } catch { return null; }
  });
  const [drawerOpen, setDrawerOpen] = useStateA(false);
  const [checkoutFor, setCheckoutFor] = useStateA(null); // [pedidos] when checkout modal is open
  const [sentToast, setSentToast] = useStateA(null);
  const [shareOpen, setShareOpen] = useStateA(false);

  const [tweaks, setTweak] = window.useTweaks(TWEAK_DEFAULTS);
  const showPrice = tweaks.showPrice;
  const layout = tweaks.layout;
  const theme = tweaks.theme;

  // Persist
  useEffectA(() => {
    const serializable = pedidos.map(p => ({ id: p.id, productId: p.product.id, config: p.config }));
    localStorage.setItem('six.pedidos', JSON.stringify(serializable));
  }, [pedidos]);
  useEffectA(() => {
    localStorage.setItem('six.favorites', JSON.stringify([...favorites]));
  }, [favorites]);
  useEffectA(() => {
    document.documentElement.dataset.theme = theme;
  }, [theme]);

  // Defaults reused across new pedidos: last CEP, last m2
  const savedDefaults = useMemoA(() => {
    const last = pedidos[pedidos.length - 1];
    return {
      cep: last ? last.config.cep : (savedClient?.cep || ''),
      m2: '',
    };
  }, [pedidos, savedClient]);

  const toggleFav = (id) => {
    setFavorites(s => {
      const n = new Set(s);
      n.has(id) ? n.delete(id) : n.add(id);
      return n;
    });
  };

  const addDraft = ({ product, config }) => {
    if (editingPedido) {
      setPedidos(ps => ps.map(p => p.id === editingPedido.id ? { ...p, config } : p));
      setEditingPedido(null);
    } else {
      setPedidos(ps => [...ps, { id: crypto.randomUUID(), product, config }]);
    }
    setOpenProduct(null);
    setDrawerOpen(true);
  };

  const removeDraft = (id) => setPedidos(ps => ps.filter(p => p.id !== id));

  const editDraft = (ped) => {
    setEditingPedido(ped);
    setDrawerOpen(false);
    setOpenProduct(ped.product);
  };

  const startSend = (target) => {
    setDrawerOpen(false);
    if (target === 'all') {
      setCheckoutFor([...pedidos]);
    } else {
      setCheckoutFor([target]);
    }
  };

  const finalizeSend = (client) => {
    setSavedClient(client);
    try { localStorage.setItem('six.client', JSON.stringify(client)); } catch {}

    const pedidosToSend = checkoutFor;
    pedidosToSend.forEach((ped, i) => {
      // Stagger opens so popup blocker doesn't reject all
      setTimeout(() => {
        window.sendToWhatsApp(ped, i+1, client, pedidosToSend.length);
      }, i * 350);
    });
    setCheckoutFor(null);
    setSentToast({
      count: pedidosToSend.length,
      pedidos: pedidosToSend,
    });
    // Optimistically clear sent items after a short window? Keep them — user might want to re-send.
  };

  return (
    <div className={"app app--theme-" + theme + " app--layout-" + layout}>
      <Header
        pedidos={pedidos}
        favorites={favorites}
        onOpenDrawer={() => setDrawerOpen(true)}
        onOpenFavorites={() => setFilters(f => ({...f, favOnly: !f.favOnly}))}
        q={q}
        setQ={setQ}
        onOpenShare={() => setShareOpen(true)}
      />
      {openProduct ? (
        <ProductPage
          product={openProduct}
          savedDefaults={editingPedido ? {
            cep: editingPedido.config.cep,
            m2: editingPedido.config.m2,
          } : savedDefaults}
          onClose={() => { setOpenProduct(null); setEditingPedido(null); }}
          onAddDraft={addDraft}
        />
      ) : (
        <>
          <Hero/>
          <Catalog
            q={q}
            setQ={setQ}
            filters={filters}
            setFilters={setFilters}
            products={products}
            onOpenProduct={setOpenProduct}
            favorites={favorites}
            onToggleFav={toggleFav}
            layout={layout}
            showPrice={showPrice}
          />
        </>
      )}
      <Footer/>

      <PedidosDrawer
        open={drawerOpen}
        onClose={() => setDrawerOpen(false)}
        pedidos={pedidos}
        onEdit={editDraft}
        onDelete={removeDraft}
        onSend={startSend}
        savedClient={savedClient}
      />

      {checkoutFor && (
        <CheckoutModal
          pedidos={checkoutFor}
          savedClient={savedClient}
          onClose={() => setCheckoutFor(null)}
          onSubmit={finalizeSend}
        />
      )}

      {sentToast && (
        <SentToast
          info={sentToast}
          onClose={() => setSentToast(null)}
        />
      )}

      {shareOpen && (
        <ShareModal
          favorites={favorites}
          pedidos={pedidos}
          products={products}
          onClose={() => setShareOpen(false)}
        />
      )}

      {/* Floating quick-actions */}
      <FloatingBar
        pedidos={pedidos}
        onOpenDrawer={() => setDrawerOpen(true)}
      />

      {/* Tweaks */}
      <window.TweaksPanel title="Tweaks">
        <window.TweakSection label="Layout do catálogo">
          <window.TweakRadio
            label="Densidade do grid"
            options={[
              {value:'editorial', label:'Editorial'},
              {value:'dense', label:'Denso'},
            ]}
            value={layout}
            onChange={v => setTweak('layout', v)}
          />
        </window.TweakSection>
        <window.TweakSection label="Preço">
          <window.TweakToggle
            label="Mostrar faixa de preço (R$ · R$$ · R$$$)"
            value={showPrice}
            onChange={v => setTweak('showPrice', v)}
          />
        </window.TweakSection>
        <window.TweakSection label="Tema visual">
          <window.TweakRadio
            label="Paleta"
            options={[
              {value:'earthy', label:'Earthy'},
              {value:'dark', label:'Dark'},
            ]}
            value={theme}
            onChange={v => setTweak('theme', v)}
          />
        </window.TweakSection>
      </window.TweaksPanel>
    </div>
  );
}

// — Footer —
const Footer = () => (
  <footer className="site-foot">
    <div className="site-foot__inner">
      <div className="site-foot__brand">
        <div className="site-foot__mark">SIX</div>
        <div className="site-foot__line">REVESTIMENTOS DE ALTO PADRÃO</div>
        <p className="site-foot__addr">{window.SIX.endereco}</p>
        <p className="site-foot__addr">CNPJ {window.SIX.cnpj}</p>
      </div>
      <div className="site-foot__col">
        <div className="site-foot__h">Atendimento</div>
        <a href={`https://wa.me/${window.SIX.whatsapp}`} target="_blank" rel="noopener noreferrer">WhatsApp {window.SIX.whatsappFmt}</a>
        <a href="mailto:contato@sixmateriais.com.br">contato@sixmateriais.com.br</a>
        <span>Seg–Sex · 9h às 18h</span>
      </div>
      <div className="site-foot__col">
        <div className="site-foot__h">Profissionais</div>
        <span>Programa SIX PRO para arquitetos</span>
        <span>Amostras físicas grátis (8m²+)</span>
        <span>Entrega em todo o Rio Grande do Sul</span>
      </div>
      <div className="site-foot__col">
        <div className="site-foot__h">Garantias</div>
        <span>Site com certificado SSL</span>
        <span>Produtos oficiais de fábrica</span>
        <span>Pagamento direto com vendedor</span>
      </div>
    </div>
    <div className="site-foot__copy">© 2026 Six Materiais · catálogo digital v1</div>
  </footer>
);

// — Floating bar at bottom (mobile-style cart shortcut) —
const FloatingBar = ({ pedidos, onOpenDrawer }) => {
  if (pedidos.length === 0) return null;
  return (
    <div className="floatbar">
      <button className="floatbar__btn" onClick={onOpenDrawer}>
        <span className="floatbar__count">{pedidos.length}</span>
        <span className="floatbar__txt">
          {pedidos.length === 1 ? '1 orçamento pronto' : `${pedidos.length} orçamentos prontos`} para enviar
        </span>
        <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><path d="M5 12h14M13 6l6 6-6 6"/></svg>
      </button>
    </div>
  );
};

// — Sent confirmation toast —
const SentToast = ({ info, onClose }) => {
  React.useEffect(() => {
    const id = setTimeout(onClose, 9000);
    return () => clearTimeout(id);
  }, [onClose]);
  return (
    <div className="toast" role="status">
      <div className="toast__icon">
        <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><path d="M20 6L9 17l-5-5"/></svg>
      </div>
      <div>
        <div className="toast__t">
          {info.count === 1 ? '1 orçamento enviado ao WhatsApp da Six' : `${info.count} abas do WhatsApp abertas`}
        </div>
        <div className="toast__s">
          {info.count > 1 ? 'Clique em "Enviar" em cada conversa.' : 'Confirme e envie a mensagem na conversa.'} Vamos responder em horário comercial.
        </div>
      </div>
      <button className="toast__x" onClick={onClose} aria-label="Fechar">×</button>
    </div>
  );
};

// — Share modal —
const ShareModal = ({ favorites, pedidos, products, onClose }) => {
  const favProducts = products.filter(p => favorites.has(p.id));
  // Build a shareable text + fake link
  const items = favProducts.length > 0 ? favProducts.map(p => p.nome) : pedidos.map(p => p.product.nome);
  const text = items.length > 0
    ? `Olha essa seleção de revestimentos da Six:\n\n${items.map((n,i) => `${i+1}. ${n}`).join('\n')}\n\nCatálogo: https://sixmateriais.com.br`
    : 'Confira o catálogo Six Revestimentos em https://sixmateriais.com.br';
  const link = `https://sixmateriais.com.br/lista?ids=${[...favorites, ...pedidos.map(p=>p.product.id)].slice(0,12).join(',')}`;

  const [copied, setCopied] = React.useState(false);
  const copy = (t) => {
    navigator.clipboard.writeText(t).then(()=>{
      setCopied(true);
      setTimeout(() => setCopied(false), 2000);
    });
  };
  return (
    <div className="modal-scrim" onClick={onClose}>
      <div className="modal modal--share" onClick={e=>e.stopPropagation()}>
        <button className="modal__close" onClick={onClose} aria-label="Fechar">×</button>
        <div className="ck__eyebrow">COMPARTILHAR</div>
        <h2 className="ck__title">Sua lista, em um link.</h2>
        <p className="ck__sub">
          Envie sua seleção para o cliente, o arquiteto ou a equipe da obra. {items.length === 0 ? 'Adicione favoritos ou orçamentos primeiro.' : `${items.length} item${items.length > 1 ? 'ns' : ''} na lista.`}
        </p>

        <div className="share-box">
          <label>Link da lista</label>
          <div className="share-row">
            <input className="inp" readOnly value={link}/>
            <button className="btn btn--ghost" onClick={()=>copy(link)}>{copied ? 'Copiado!' : 'Copiar'}</button>
          </div>
        </div>

        <div className="share-box">
          <label>Texto pronto</label>
          <textarea className="inp inp--ta" rows={6} readOnly value={text}/>
          <div style={{display:'flex', gap:8, marginTop:8, flexWrap:'wrap'}}>
            <button className="btn btn--ghost" onClick={()=>copy(text)}>{copied ? 'Copiado!' : 'Copiar texto'}</button>
            <a className="btn btn--wa" href={`https://wa.me/?text=${encodeURIComponent(text)}`} target="_blank" rel="noopener noreferrer">Enviar pelo WhatsApp</a>
          </div>
        </div>

        <div className="share-box">
          <label>PDF do orçamento</label>
          <p style={{margin:'4px 0 8px', color:'var(--ink-3)', fontSize:13}}>Gere um PDF com a lista completa (em produção, integraremos com geração server-side).</p>
          <button className="btn btn--ghost" onClick={() => window.print()}>
            <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.6"><path d="M6 9V2h12v7M6 18H4a2 2 0 01-2-2v-5a2 2 0 012-2h16a2 2 0 012 2v5a2 2 0 01-2 2h-2M6 14h12v8H6z"/></svg>
            Baixar PDF da lista (imprimir)
          </button>
        </div>
      </div>
    </div>
  );
};

// Mount
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App/>);
