/* ===========================================================
   PIPOQUE — Painel administrativo
   =========================================================== */
const { useState, useEffect, useRef } = React;

/* ---------- Login ---------- */
function AdminLogin() {
  const { login, navigate } = useApp();
  const toast = useToast();
  const [u, setU] = useState('');
  const [p, setP] = useState('');
  const [show, setShow] = useState(false);
  const [err, setErr] = useState(false);
  const [busy, setBusy] = useState(false);
  const submit = async (e) => {
    e.preventDefault();
    if (busy) return;
    setBusy(true);
    const ok = await login(u.trim(), p);
    setBusy(false);
    if (ok) { toast('Bem-vindo de volta! 🍿'); }
    else { setErr(true); toast('Usuário ou senha incorretos'); setTimeout(() => setErr(false), 500); }
  };
  return (
    <div className="login-wrap" style={{ background: 'var(--hero-bg)', color: 'var(--hero-ink)' }}>
      <div className="confetti hero-confetti" />
      <form className={'card login-card' + (err ? ' shake' : '')} onSubmit={submit} style={{ background: 'var(--surface)', color: 'var(--ink)' }}>
        <div className="center" style={{ marginBottom: 18 }}>
          <Logo size={76} />
          <div className="wordmark" style={{ fontSize: 30, marginTop: 6 }}>Pipoque<span style={{ color: 'var(--p2)' }}>.</span></div>
          <div className="muted" style={{ fontFamily: 'Fredoka', fontWeight: 600, marginTop: 2 }}>Painel administrativo</div>
        </div>
        <div className="field"><label>Usuário</label>
          <input className="input" value={u} onChange={(e) => setU(e.target.value)} placeholder="admin" autoFocus /></div>
        <div className="field"><label>Senha</label>
          <div style={{ position: 'relative' }}>
            <input className="input" type={show ? 'text' : 'password'} value={p} onChange={(e) => setP(e.target.value)} placeholder="••••••••" style={{ paddingRight: 44 }} />
            <button type="button" className="iconbtn" onClick={() => setShow(!show)} style={{ position: 'absolute', right: 4, top: 4, width: 38, height: 38, border: 'none', background: 'transparent', color: 'var(--ink-soft)' }}>{show ? <Icon.eyeoff /> : <Icon.eye />}</button>
          </div>
        </div>
        <button className="btn btn-primary btn-lg btn-block" type="submit" style={{ marginTop: 6 }} disabled={busy}>{busy ? 'Entrando…' : 'Entrar'}</button>
        <p className="muted center" style={{ fontSize: 12.5, marginTop: 14 }}>Acesso inicial · <strong>admin</strong><strong></strong> · troque a senha no painel.</p>
        <p className="center" style={{ marginTop: 8 }}><span className="link-accent" style={{ fontSize: 13 }} onClick={() => navigate('#/')}>← Voltar à loja</span></p>
      </form>
    </div>
  );
}

/* ---------- Shell ---------- */
function AdminShell() {
  const { logout, navigate, session, orders } = useApp();
  const [tab, setTab] = useState('produtos');
  const novos = orders.filter((o) => o.status === 'novo').length;
  const nav = [
    { id: 'produtos', label: 'Produtos', icon: Icon.box },
    { id: 'novo', label: 'Cadastrar', icon: Icon.plus },
    { id: 'pedidos', label: 'Pedidos', icon: Icon.receipt, badge: novos },
    { id: 'config', label: 'Configurações', icon: Icon.gear },
    { id: 'usuarios', label: 'Usuários', icon: Icon.users },
  ];
  return (
    <div className="admin-bg">
      <div className="admin-shell">
        <aside className="admin-side">
          <div className="side-brand brand-lockup" style={{ cursor: 'pointer', padding: '4px 8px 18px' }} onClick={() => navigate('#/')}>
            <Logo size={38} /><span className="wordmark" style={{ fontSize: 24 }}>Pipoque</span>
          </div>
          {nav.map((n) => (
            <a key={n.id} className={'admin-nav-item' + (tab === n.id ? ' active' : '')} onClick={() => setTab(n.id)}>
              <n.icon /><span className="lbl">{n.label}</span>
              {n.badge > 0 && <span className="pill b-pink" style={{ marginLeft: 'auto', padding: '2px 9px', fontSize: 11 }}>{n.badge}</span>}
            </a>
          ))}
          <div className="side-foot" style={{ marginTop: 'auto', paddingTop: 14 }}>
            <div className="muted" style={{ fontSize: 12.5, padding: '0 8px 10px', color: 'color-mix(in srgb, var(--bg) 60%, transparent)' }}>Logado como <strong>{session.name}</strong></div>
            <a className="admin-nav-item" onClick={() => { logout(); navigate('#/'); }}><Icon.logout /><span className="lbl">Sair</span></a>
          </div>
        </aside>
        <main className="admin-main">
          {tab === 'produtos' && <AdminProducts goNew={() => setTab('novo')} />}
          {tab === 'novo' && <AdminProductForm onDone={() => setTab('produtos')} />}
          {tab === 'pedidos' && <AdminOrders />}
          {tab === 'config' && <AdminSettings />}
          {tab === 'usuarios' && <AdminUsers />}
        </main>
      </div>
    </div>
  );
}

/* ---------- Tela 1: lista de produtos com seleções rápidas ---------- */
function AdminProducts({ goNew }) {
  const { products, updateProduct, removeProduct, orders } = useApp();
  const toast = useToast();
  const [filter, setFilter] = useState('todos');
  const [editing, setEditing] = useState(null);

  const list = products.filter((p) => filter === 'todos' || p.category === filter);
  const catName = (id) => (CATEGORIES.find((c) => c.id === id) || {}).name || id;

  const visCount = products.filter((p) => p.visible).length;
  const featCount = products.filter((p) => p.featured).length;

  return (
    <div>
      <div className="admin-head">
        <div><h1>Produtos</h1><p>Ative, esconda ou destaque com um toque. {products.length} produtos cadastrados.</p></div>
        <button className="btn btn-primary" onClick={goNew}><Icon.plus width="18" height="18" /> Novo produto</button>
      </div>

      <div className="stat-grid">
        <div className="card stat"><div className="n">{products.length}</div><div className="l">Produtos</div></div>
        <div className="card stat"><div className="n">{visCount}</div><div className="l">Visíveis na loja</div></div>
        <div className="card stat"><div className="n">{featCount}</div><div className="l">Em destaque</div></div>
        <div className="card stat"><div className="n">{orders.length}</div><div className="l">Pedidos recebidos</div></div>
      </div>

      <div className="cat-bar" style={{ marginBottom: 14 }}>
        <button className={'cat-chip' + (filter === 'todos' ? ' active' : '')} onClick={() => setFilter('todos')}>Todos</button>
        {CATEGORIES.map((c) => <button key={c.id} className={'cat-chip' + (filter === c.id ? ' active' : '')} onClick={() => setFilter(c.id)}><span className="em">{c.em}</span>{c.name}</button>)}
      </div>

      <div className="adm-thead">
        <span></span><span>Produto</span><span>Preço</span><span className="center">Visível</span><span className="center">Destaque</span><span></span><span></span>
      </div>
      <div className="adm-table">
        {list.map((p) => (
          <div className="adm-prow" key={p.id}>
            <div className="pthumb"><ProductVisual glyph={p.glyph} color={p.color} image={p.image} showMascot={false} /></div>
            <div className="pinfo"><div className="adm-pname">{p.name}</div><div className="adm-pcat">{catName(p.category)}</div></div>
            <div className="pprice-cell price" style={{ fontSize: 16 }}>{money(p.price)}</div>
            <div className="ptoggles" style={{ display: 'contents' }}>
              <div className="center mini-toggle">
                <label className="switch"><input type="checkbox" checked={p.visible} onChange={() => updateProduct(p.id, { visible: !p.visible })} /><span className="track" /></label>
              </div>
              <div className="center mini-toggle">
                <label className="switch"><input type="checkbox" checked={p.featured} onChange={() => updateProduct(p.id, { featured: !p.featured })} /><span className="track" /></label>
              </div>
            </div>
            <div className="pactions center"><button className="iconbtn" style={{ width: 38, height: 38 }} onClick={() => setEditing(p)} aria-label="Editar"><Icon.edit /></button></div>
            <div className="center"><button className="iconbtn" style={{ width: 38, height: 38, color: 'var(--p1)' }} onClick={() => { if (confirm('Excluir ' + p.name + '?')) { removeProduct(p.id); toast('Produto excluído'); } }} aria-label="Excluir"><Icon.trash /></button></div>
          </div>
        ))}
      </div>

      {editing && <ProductEditModal product={editing} onClose={() => setEditing(null)} />}
    </div>
  );
}

/* ---------- Modal de edição rápida (reusa form) ---------- */
function ProductEditModal({ product, onClose }) {
  return (
    <div className="modal-wrap">
      <div className="modal-bg" onClick={onClose} />
      <div className="modal" style={{ width: 'min(620px,100%)' }}>
        <div className="modal-head"><h3 style={{ fontSize: 21 }}>Editar produto</h3><button className="iconbtn" onClick={onClose}><Icon.close /></button></div>
        <div className="modal-body"><AdminProductForm editProduct={product} embedded onDone={onClose} /></div>
      </div>
    </div>
  );
}

/* ---------- Tela 2: cadastro detalhado de produto ---------- */
function AdminProductForm({ editProduct, onDone, embedded }) {
  const { addProduct, updateProduct } = useApp();
  const toast = useToast();
  const blank = { name: '', category: 'doces', price: '', desc: '', glyph: '🍿', color: 'p1', badge: '', visible: true, featured: false, image: '' };
  const [f, setF] = useState(() => editProduct ? { ...editProduct, price: String(editProduct.price) } : blank);
  const [imgData, setImgData] = useState(''); // foto nova (dataURL) ainda não salva
  const imgRef = useRef(null);
  const set = (k, v) => setF((s) => ({ ...s, [k]: v }));

  // redimensiona a foto no próprio navegador antes de enviar (mantém o arquivo leve)
  const onPickImage = (e) => {
    const file = e.target.files[0];
    e.target.value = '';
    if (!file) return;
    if (!/^image\//.test(file.type)) { toast('Selecione um arquivo de imagem 📷'); return; }
    const reader = new FileReader();
    reader.onload = () => {
      const img = new Image();
      img.onload = () => {
        const MAX = 720; // largura máx.; a proporção 16/11 do card recorta via object-fit
        let w = img.width, h = img.height;
        if (w > MAX) { h = Math.round(h * MAX / w); w = MAX; }
        const canvas = document.createElement('canvas');
        canvas.width = w; canvas.height = h;
        canvas.getContext('2d').drawImage(img, 0, 0, w, h);
        setImgData(canvas.toDataURL('image/jpeg', 0.82));
      };
      img.onerror = () => toast('Não consegui ler essa imagem 😕');
      img.src = reader.result;
    };
    reader.readAsDataURL(file);
  };
  const removePhoto = () => { setImgData(''); set('image', ''); };

  const save = async () => {
    if (!f.name.trim()) { toast('Dê um nome ao produto'); return; }
    const price = parseFloat(String(f.price).replace(',', '.')) || 0;
    const data = { ...f, price, name: f.name.trim(), desc: f.desc.trim() };
    if (imgData) data.imageData = imgData; // foto nova: o servidor grava em disco e guarda o caminho
    const ok = editProduct ? await updateProduct(editProduct.id, data) : await addProduct(data);
    if (!ok) return;
    setImgData('');
    toast(editProduct ? 'Produto atualizado! ✅' : 'Produto cadastrado! 🍿');
    onDone && onDone();
  };

  const photoPreview = imgData || f.image;

  return (
    <div>
      {!embedded && (
        <div className="admin-head"><div><h1>{editProduct ? 'Editar produto' : 'Cadastrar produto'}</h1><p>Preencha os detalhes. A prévia atualiza em tempo real.</p></div></div>
      )}
      <div style={{ display: 'grid', gridTemplateColumns: embedded ? '1fr' : '1.3fr .9fr', gap: 22, alignItems: 'start' }}>
        <div className={embedded ? '' : 'card'} style={embedded ? {} : { padding: 24 }}>
          <div className="field"><label>Nome do produto</label><input className="input" value={f.name} onChange={(e) => set('name', e.target.value)} placeholder="Ex: Creme de Ninho" /></div>
          <div className="field-row">
            <div className="field"><label>Categoria</label>
              <select className="select" value={f.category} onChange={(e) => set('category', e.target.value)}>
                {CATEGORIES.map((c) => <option key={c.id} value={c.id}>{c.name}</option>)}
              </select></div>
            <div className="field"><label>Preço (R$)</label><input className="input" value={f.price} onChange={(e) => set('price', e.target.value)} placeholder="18,00" inputMode="decimal" /></div>
          </div>
          <div className="field"><label>Descrição</label><textarea className="textarea" value={f.desc} onChange={(e) => set('desc', e.target.value)} placeholder="Conte o que torna esse sabor especial..." /></div>

          <div className="field"><label>Foto do produto <span className="hint">(opcional — substitui o ícone no cardápio)</span></label>
            <input ref={imgRef} type="file" accept="image/*" onChange={onPickImage} style={{ display: 'none' }} />
            {photoPreview ? (
              <div className="upload has" onClick={() => imgRef.current.click()} style={{ cursor: 'pointer' }}>
                <img src={photoPreview} className="upload-prev" alt="Foto do produto" />
                <div className="row" style={{ justifyContent: 'center', gap: 16, marginTop: 10 }}>
                  <span className="row" style={{ gap: 6, color: 'var(--p3)', fontFamily: 'Fredoka', fontWeight: 600, fontSize: 14 }}><Icon.check width="16" height="16" /> Foto pronta · trocar</span>
                  <span className="link-accent" style={{ fontSize: 13 }} onClick={(e) => { e.stopPropagation(); removePhoto(); }}>remover</span>
                </div>
              </div>
            ) : (
              <div className="upload" onClick={() => imgRef.current.click()} style={{ cursor: 'pointer' }}>
                <div style={{ color: 'var(--ink-soft)' }}>
                  <Icon.upload />
                  <div style={{ fontFamily: 'Fredoka', fontWeight: 600, marginTop: 8, color: 'var(--ink)' }}>Toque para enviar uma foto</div>
                  <div style={{ fontSize: 12.5, marginTop: 2 }}>JPG, PNG ou WebP · redimensionada automaticamente</div>
                </div>
              </div>
            )}
          </div>

          <div className="field"><label>Selo <span className="hint">(opcional)</span></label>
            <div className="row wrap" style={{ gap: 7 }}>
              {['', 'Novo', 'Top', 'Mais pedido', 'Premium', 'Com brinde'].map((b) => (
                <button key={b || 'none'} className={'cat-chip' + (f.badge === b ? ' active' : '')} onClick={() => set('badge', b)} style={{ padding: '8px 14px' }}>{b || 'Sem selo'}</button>
              ))}
            </div>
          </div>

          <div className="field"><label>Ícone <span className="hint">(usado quando não há foto)</span></label>
            <div className="glyph-pick">
              {GLYPHS.map((g, i) => <button key={i} className={f.glyph === g ? 'sel' : ''} onClick={() => set('glyph', g)}>{g}</button>)}
            </div>
          </div>
          <div className="field"><label>Cor de fundo <span className="hint">(usada quando não há foto)</span></label>
            <div className="color-pick">
              {FLAVOR_COLORS.map((c) => <button key={c} className={f.color === c ? 'sel' : ''} style={{ background: `var(--${c})` }} onClick={() => set('color', c)} />)}
            </div>
          </div>

          <div className="row" style={{ gap: 24, marginTop: 8 }}>
            <label className="checkline"><span className="switch"><input type="checkbox" checked={f.visible} onChange={(e) => set('visible', e.target.checked)} /><span className="track" /></span> Visível na loja</label>
            <label className="checkline"><span className="switch"><input type="checkbox" checked={f.featured} onChange={(e) => set('featured', e.target.checked)} /><span className="track" /></span> Destaque na home</label>
          </div>

          <div className="row" style={{ gap: 10, marginTop: 22 }}>
            <button className="btn btn-primary btn-lg" onClick={save}>{editProduct ? 'Salvar alterações' : 'Cadastrar produto'}</button>
            {onDone && <button className="btn btn-ghost" onClick={onDone}>Cancelar</button>}
          </div>
        </div>

        {/* prévia */}
        <div style={{ position: embedded ? 'static' : 'sticky', top: 86 }}>
          <div className="card-label" style={{ marginBottom: 10, display: embedded ? 'none' : 'block' }}>Prévia na loja</div>
          <article className="card prod-card" style={{ maxWidth: 250, margin: embedded ? '14px auto 0' : 0 }}>
            <div className="prod-media"><ProductVisual glyph={f.glyph} color={f.color} image={photoPreview} />
              <div className="badge-row">{f.badge && <span className="pill b-pink">{f.badge}</span>}</div>
            </div>
            <div className="prod-body">
              <div className="prod-name">{f.name || 'Nome do produto'}</div>
              <div className="prod-desc">{f.desc || 'Descrição aparecerá aqui.'}</div>
              <div className="prod-foot"><div className="price">{money(parseFloat(String(f.price).replace(',', '.')) || 0)}</div><span className="add-btn"><Icon.plus width="22" height="22" /></span></div>
            </div>
          </article>
        </div>
      </div>
    </div>
  );
}

/* ---------- Tela 3: configurações ---------- */
function AdminSettings() {
  const { settings, updateSettings, uploadImage } = useApp();
  const toast = useToast();
  const [s, setS] = useState(() => ({ ...settings, schedule: getSchedule(settings), builder: getBuilder(settings) }));
  const set = (k, v) => setS((o) => ({ ...o, [k]: v }));
  const save = async () => { const ok = await updateSettings(s); if (ok) toast('Configurações salvas! ✅'); };

  const setDay = (id, patch) => setS((o) => ({ ...o, schedule: (o.schedule || []).map((d) => d.id === id ? { ...d, ...patch } : d) }));

  /* montador (tamanhos / cremes / coberturas) */
  const nid = (p) => p + Date.now().toString(36) + Math.random().toString(36).slice(2, 5);
  const setBItem = (key, id, patch) => setS((o) => ({ ...o, builder: { ...o.builder, [key]: o.builder[key].map((x) => x.id === id ? { ...x, ...patch } : x) } }));
  const addBItem = (key, item) => setS((o) => ({ ...o, builder: { ...o.builder, [key]: [...o.builder[key], item] } }));
  const removeBItem = (key, id) => setS((o) => ({ ...o, builder: { ...o.builder, [key]: o.builder[key].filter((x) => x.id !== id) } }));

  /* foto do ícone de tamanho: redimensiona no navegador, sobe e guarda o caminho */
  const sizePhotoRef = useRef(null);
  const pendingSizeId = useRef(null);
  const pickSizePhoto = (id) => { pendingSizeId.current = id; sizePhotoRef.current && sizePhotoRef.current.click(); };
  const onSizePhoto = (e) => {
    const file = e.target.files[0];
    e.target.value = '';
    if (!file) return;
    if (!/^image\//.test(file.type)) { toast('Selecione uma imagem 📷'); return; }
    const reader = new FileReader();
    reader.onload = () => {
      const img = new Image();
      img.onload = async () => {
        const MAX = 240; // ícone pequeno
        const scale = Math.min(1, MAX / Math.max(img.width, img.height));
        const w = Math.round(img.width * scale), h = Math.round(img.height * scale);
        const canvas = document.createElement('canvas');
        canvas.width = w; canvas.height = h;
        canvas.getContext('2d').drawImage(img, 0, 0, w, h);
        const url = await uploadImage(canvas.toDataURL('image/png'));
        if (url) setBItem('sizes', pendingSizeId.current, { image: url });
      };
      img.onerror = () => toast('Não consegui ler essa imagem 😕');
      img.src = reader.result;
    };
    reader.readAsDataURL(file);
  };

  const setZone = (id, k, v) => set('zones', s.zones.map((z) => z.id === id ? { ...z, [k]: v } : z));
  const addZone = () => set('zones', [...s.zones, { id: 'z' + Date.now(), name: 'Novo bairro', fee: 8 }]);
  const removeZone = (id) => set('zones', s.zones.filter((z) => z.id !== id));

  return (
    <div>
      <div className="admin-head"><div><h1>Configurações</h1><p>Dados do negócio, redes sociais, Pix e regras de entrega.</p></div>
        <button className="btn btn-primary" onClick={save}>Salvar tudo</button>
      </div>

      <div className="card panel">
        <div className="panel-title">Negócio</div>
        <div className="panel-sub">Aparece no rodapé e nos pedidos.</div>
        <div className="field"><label>Nome do negócio</label><input className="input" value={s.businessName} onChange={(e) => set('businessName', e.target.value)} /></div>
        <div className="field"><label>Frase / tagline</label><input className="input" value={s.tagline} onChange={(e) => set('tagline', e.target.value)} /></div>
        <div className="field"><label>Endereço</label><input className="input" value={s.address} onChange={(e) => set('address', e.target.value)} /></div>
      </div>

      <div className="card panel">
        <div className="panel-title">Horário de funcionamento</div>
        <div className="panel-sub">Defina abertura e fechamento por dia e em quais dias há entrega (delivery).</div>
        <div className="sched-list">
          {(s.schedule || []).map((d) => (
            <div className={'sched-row' + (d.open ? '' : ' closed')} key={d.id}>
              <span className="sched-day">{d.name}</span>
              <label className="checkline"><span className="switch"><input type="checkbox" checked={d.open} onChange={(e) => setDay(d.id, { open: e.target.checked })} /><span className="track" /></span> {d.open ? 'Aberto' : 'Fechado'}</label>
              {d.open ? (
                <span className="row" style={{ gap: 8, alignItems: 'center' }}>
                  <input type="time" className="input sched-time" value={d.from} onChange={(e) => setDay(d.id, { from: e.target.value })} />
                  <span className="muted">→</span>
                  <input type="time" className="input sched-time" value={d.to} onChange={(e) => setDay(d.id, { to: e.target.value })} />
                </span>
              ) : <span className="muted" style={{ fontSize: 13.5 }}>Loja fechada neste dia</span>}
              <label className="checkline" title="Há entrega neste dia?"><span className="switch"><input type="checkbox" checked={!!d.delivery} disabled={!d.open} onChange={(e) => setDay(d.id, { delivery: e.target.checked })} /><span className="track" /></span> 🛵 Delivery</label>
            </div>
          ))}
        </div>
      </div>

      <div className="card panel">
        <div className="panel-title">Contato & redes sociais</div>
        <div className="panel-sub">Links genéricos de teste — edite com os reais aqui.</div>
        <div className="field"><label><span className="row" style={{ gap: 6, display: 'inline-flex' }}><Icon.whatsapp width="16" height="16" /> WhatsApp <span className="hint">(com DDI+DDD, ex: 5511999990000)</span></span></label><input className="input" value={s.whatsapp} onChange={(e) => set('whatsapp', onlyDigits(e.target.value))} /></div>
        <div className="field-row">
          <div className="field"><label><span className="row" style={{ gap: 6, display: 'inline-flex' }}><Icon.instagram width="16" height="16" /> Instagram</span></label><input className="input" value={s.instagram} onChange={(e) => set('instagram', e.target.value.replace('@', ''))} placeholder="usuario" /></div>
          <div className="field"><label><span className="row" style={{ gap: 6, display: 'inline-flex' }}><Icon.tiktok width="16" height="16" /> TikTok</span></label><input className="input" value={s.tiktok} onChange={(e) => set('tiktok', e.target.value.replace('@', ''))} placeholder="usuario" /></div>
        </div>
      </div>

      <div className="card panel">
        <div className="panel-title">Pagamento Pix</div>
        <div className="panel-sub">Chave exibida ao cliente no checkout.</div>
        <div className="field-row">
          <div className="field"><label>Chave Pix</label><input className="input" value={s.pixKey} onChange={(e) => set('pixKey', e.target.value)} /></div>
          <div className="field"><label>Nome do favorecido</label><input className="input" value={s.pixName} onChange={(e) => set('pixName', e.target.value)} /></div>
        </div>
      </div>

      <div className="card panel">
        <div className="panel-title">Entrega</div>
        <div className="panel-sub">Defina formas de recebimento, pedido mínimo e taxa por bairro.</div>
        <div className="row wrap" style={{ gap: 24, marginBottom: 16 }}>
          <label className="checkline"><span className="switch"><input type="checkbox" checked={s.deliveryEnabled} onChange={(e) => set('deliveryEnabled', e.target.checked)} /><span className="track" /></span> Aceitar entrega</label>
          <label className="checkline"><span className="switch"><input type="checkbox" checked={s.pickupEnabled} onChange={(e) => set('pickupEnabled', e.target.checked)} /><span className="track" /></span> Aceitar retirada</label>
          <div className="field" style={{ margin: 0 }}><label>Pedido mínimo (R$)</label><input className="input" style={{ width: 120 }} value={s.minOrder} onChange={(e) => set('minOrder', parseFloat(e.target.value) || 0)} inputMode="decimal" /></div>
        </div>
        <div className="field"><label>Endereço de retirada</label><input className="input" value={s.pickupAddress} onChange={(e) => set('pickupAddress', e.target.value)} /></div>
        <label>Bairros e taxas</label>
        <div style={{ marginTop: 10 }}>
          {s.zones.map((z) => (
            <div className="zone-row" key={z.id}>
              <input className="input" value={z.name} onChange={(e) => setZone(z.id, 'name', e.target.value)} placeholder="Bairro" />
              <input className="input" value={z.fee} onChange={(e) => setZone(z.id, 'fee', parseFloat(e.target.value) || 0)} placeholder="Taxa" inputMode="decimal" />
              <button className="iconbtn" style={{ width: 44, height: 44, color: 'var(--p1)' }} onClick={() => removeZone(z.id)}><Icon.trash /></button>
            </div>
          ))}
          <button className="btn btn-ghost btn-sm" onClick={addZone} style={{ marginTop: 6 }}><Icon.plus width="16" height="16" /> Adicionar bairro</button>
        </div>
      </div>

      <div className="card panel">
        <div className="panel-title">Montador — "Monte a sua"</div>
        <div className="panel-sub">Configure os tamanhos, cremes e coberturas (nome e valor) do montador.</div>

        <label>Tamanhos <span className="hint">(ícone emoji/foto · nome · medida · preço · máx. de cremes)</span></label>
        <input ref={sizePhotoRef} type="file" accept="image/*" onChange={onSizePhoto} style={{ display: 'none' }} />
        <div style={{ marginTop: 8, marginBottom: 16 }}>
          {(s.builder.sizes || []).map((it) => (
            <div className="build-row" key={it.id}>
              <div className="build-icon">
                {it.image ? (
                  <div className="build-thumb">
                    <img src={it.image} alt="" />
                    <button type="button" className="build-thumb-x" title="Remover foto" onClick={() => setBItem('sizes', it.id, { image: '' })}>×</button>
                  </div>
                ) : (
                  <input className="input" style={{ width: 52, textAlign: 'center', padding: '9px 6px' }} value={it.em || ''} onChange={(e) => setBItem('sizes', it.id, { em: e.target.value })} placeholder="🍿" />
                )}
                <button type="button" className="iconbtn build-photo-btn" title="Enviar foto" onClick={() => pickSizePhoto(it.id)}><Icon.upload width="16" height="16" /></button>
              </div>
              <input className="input" style={{ flex: 1, minWidth: 110 }} value={it.name} onChange={(e) => setBItem('sizes', it.id, { name: e.target.value })} placeholder="Nome (ex: Médio)" />
              <input className="input" style={{ width: 110 }} value={it.desc || ''} onChange={(e) => setBItem('sizes', it.id, { desc: e.target.value })} placeholder="Ex: 400ml" />
              <input className="input" style={{ width: 96 }} value={it.price} onChange={(e) => setBItem('sizes', it.id, { price: parseFloat(e.target.value) || 0 })} placeholder="Preço" inputMode="decimal" />
              <input className="input" style={{ width: 116 }} value={it.maxCremes || 2} onChange={(e) => setBItem('sizes', it.id, { maxCremes: Math.max(1, parseInt(e.target.value) || 1) })} placeholder="Máx. cremes" inputMode="numeric" title="Máximo de cremes deste tamanho" />
              <button className="iconbtn" style={{ width: 44, height: 44, color: 'var(--p1)' }} onClick={() => removeBItem('sizes', it.id)}><Icon.trash /></button>
            </div>
          ))}
          <button className="btn btn-ghost btn-sm" onClick={() => addBItem('sizes', { id: nid('s'), name: 'Novo tamanho', desc: '', price: 0, em: '🍿' })} style={{ marginTop: 6 }}><Icon.plus width="16" height="16" /> Adicionar tamanho</button>
        </div>

        <label>Cremes</label>
        <div style={{ marginTop: 8, marginBottom: 16 }}>
          {(s.builder.cremes || []).map((it) => (
            <div className="zone-row" key={it.id}>
              <input className="input" value={it.name} onChange={(e) => setBItem('cremes', it.id, { name: e.target.value })} placeholder="Nome do creme" />
              <input className="input" value={it.price} onChange={(e) => setBItem('cremes', it.id, { price: parseFloat(e.target.value) || 0 })} placeholder="Preço" inputMode="decimal" />
              <button className="iconbtn" style={{ width: 44, height: 44, color: 'var(--p1)' }} onClick={() => removeBItem('cremes', it.id)}><Icon.trash /></button>
            </div>
          ))}
          <button className="btn btn-ghost btn-sm" onClick={() => addBItem('cremes', { id: nid('c'), name: 'Novo creme', price: 0 })} style={{ marginTop: 6 }}><Icon.plus width="16" height="16" /> Adicionar creme</button>
        </div>

        <label>Coberturas</label>
        <div style={{ marginTop: 8 }}>
          {(s.builder.toppings || []).map((it) => (
            <div className="zone-row" key={it.id}>
              <input className="input" value={it.name} onChange={(e) => setBItem('toppings', it.id, { name: e.target.value })} placeholder="Nome da cobertura" />
              <input className="input" value={it.price} onChange={(e) => setBItem('toppings', it.id, { price: parseFloat(e.target.value) || 0 })} placeholder="Preço" inputMode="decimal" />
              <button className="iconbtn" style={{ width: 44, height: 44, color: 'var(--p1)' }} onClick={() => removeBItem('toppings', it.id)}><Icon.trash /></button>
            </div>
          ))}
          <button className="btn btn-ghost btn-sm" onClick={() => addBItem('toppings', { id: nid('t'), name: 'Nova cobertura', price: 0 })} style={{ marginTop: 6 }}><Icon.plus width="16" height="16" /> Adicionar cobertura</button>
        </div>
      </div>

      <div className="row" style={{ marginTop: 20 }}><button className="btn btn-primary btn-lg" onClick={save}>Salvar todas as configurações</button></div>
    </div>
  );
}

/* ---------- Usuários (trocar senha + cadastrar) ---------- */
function AdminUsers() {
  const { users, session, addUser, removeUser, changePassword } = useApp();
  const toast = useToast();
  const [nu, setNu] = useState({ name: '', username: '', password: '' });
  const [pw, setPw] = useState({ cur: '', next: '', conf: '' });

  const createUser = async () => {
    if (!nu.username.trim() || !nu.password.trim()) { toast('Preencha usuário e senha'); return; }
    if (users.some((u) => u.username === nu.username.trim())) { toast('Esse usuário já existe'); return; }
    const ok = await addUser({ name: nu.name.trim() || nu.username.trim(), username: nu.username.trim(), password: nu.password });
    if (ok) { toast('Usuário criado! 👤'); setNu({ name: '', username: '', password: '' }); }
  };

  const changePw = async () => {
    if (pw.next.length < 4) { toast('Nova senha muito curta'); return; }
    if (pw.next !== pw.conf) { toast('Confirmação não confere'); return; }
    const ok = await changePassword(pw.cur, pw.next);
    if (ok) { toast('Senha alterada! 🔒'); setPw({ cur: '', next: '', conf: '' }); }
  };

  return (
    <div>
      <div className="admin-head"><div><h1>Usuários</h1><p>Gerencie acessos ao painel, troque sua senha e cadastre novos administradores.</p></div></div>

      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit,minmax(300px,1fr))', gap: 18, alignItems: 'start' }}>
        <div className="card panel">
          <div className="panel-title">Trocar minha senha</div>
          <div className="panel-sub">Conectado como <strong>{session.username}</strong>.</div>
          <div className="field"><label>Senha atual</label><input className="input" type="password" value={pw.cur} onChange={(e) => setPw({ ...pw, cur: e.target.value })} /></div>
          <div className="field"><label>Nova senha</label><input className="input" type="password" value={pw.next} onChange={(e) => setPw({ ...pw, next: e.target.value })} /></div>
          <div className="field"><label>Confirmar nova senha</label><input className="input" type="password" value={pw.conf} onChange={(e) => setPw({ ...pw, conf: e.target.value })} /></div>
          <button className="btn btn-primary" onClick={changePw}>Alterar senha</button>
        </div>

        <div className="card panel">
          <div className="panel-title">Cadastrar novo usuário</div>
          <div className="panel-sub">Novos administradores com acesso total ao painel.</div>
          <div className="field"><label>Nome</label><input className="input" value={nu.name} onChange={(e) => setNu({ ...nu, name: e.target.value })} placeholder="Maria" /></div>
          <div className="field"><label>Usuário (login)</label><input className="input" value={nu.username} onChange={(e) => setNu({ ...nu, username: e.target.value.replace(/\s/g, '') })} placeholder="maria" /></div>
          <div className="field"><label>Senha</label><input className="input" type="password" value={nu.password} onChange={(e) => setNu({ ...nu, password: e.target.value })} /></div>
          <button className="btn btn-primary" onClick={createUser}><Icon.plus width="18" height="18" /> Criar usuário</button>
        </div>
      </div>

      <div className="card panel" style={{ marginTop: 18 }}>
        <div className="panel-title">Usuários cadastrados ({users.length})</div>
        <div style={{ marginTop: 12 }}>
          {users.map((u) => (
            <div className="spread" key={u.id} style={{ padding: '12px 0', borderBottom: '1px dashed var(--line)' }}>
              <div className="row" style={{ gap: 12 }}>
                <div style={{ width: 42, height: 42, borderRadius: '50%', background: 'var(--p4)', color: 'var(--on-p4)', display: 'grid', placeItems: 'center', fontFamily: 'Fredoka', fontWeight: 700, fontSize: 18 }}>{(u.name || u.username)[0].toUpperCase()}</div>
                <div><div style={{ fontFamily: 'Fredoka', fontWeight: 700 }}>{u.name} {u.id === session.id && <span className="pill b-cyan" style={{ fontSize: 11, padding: '2px 8px', marginLeft: 4 }}>você</span>}</div><div className="muted" style={{ fontSize: 13 }}>@{u.username}</div></div>
              </div>
              {u.id !== session.id && users.length > 1 && (
                <button className="iconbtn" style={{ width: 40, height: 40, color: 'var(--p1)' }} onClick={() => { if (confirm('Remover ' + u.username + '?')) { removeUser(u.id); toast('Usuário removido'); } }}><Icon.trash /></button>
              )}
            </div>
          ))}
        </div>
      </div>
    </div>
  );
}

/* ---------- Pedidos ---------- */
function AdminOrders() {
  const { orders, updateOrder } = useApp();
  const statuses = [
    { id: 'novo', label: 'Novo', cls: 'st-novo' },
    { id: 'preparo', label: 'Em preparação', cls: 'st-preparo' },
    { id: 'entregue', label: 'Entregue', cls: 'st-entregue' },
    { id: 'cancelado', label: 'Cancelado', cls: 'st-cancelado' },
  ];
  const payInfo = {
    approved: { label: 'Pago ✓', cls: 'pay-approved' },
    pending: { label: 'Aguardando Pix', cls: 'pay-pending' },
    expired: { label: 'Pix expirado', cls: 'pay-off' },
    cancelled: { label: 'Pgto cancelado', cls: 'pay-off' },
    rejected: { label: 'Pgto recusado', cls: 'pay-off' },
  };
  const fmt = (iso) => { const d = new Date(iso); return d.toLocaleDateString('pt-BR') + ' · ' + d.toLocaleTimeString('pt-BR', { hour: '2-digit', minute: '2-digit' }); };

  return (
    <div>
      <div className="admin-head"><div><h1>Pedidos</h1><p>Pedidos recebidos pela loja. Pagamento via Pix (Mercado Pago) — prepare quando estiver <strong>Pago</strong>.</p></div></div>
      {orders.length === 0 ? (
        <div className="card" style={{ padding: 50, textAlign: 'center' }}><Pipo size={80} /><p style={{ fontFamily: 'Fredoka', fontWeight: 600, marginTop: 12, color: 'var(--ink-soft)' }}>Nenhum pedido ainda. Eles aparecem aqui assim que um cliente finaliza a compra.</p></div>
      ) : (
        [...orders].reverse().map((o) => {
          const st = statuses.find((s) => s.id === o.status) || statuses[0];
          return (
            <div className="card order-card" key={o.id} style={o.status === 'cancelado' ? { opacity: 0.62 } : undefined}>
              <div className="spread wrap" style={{ gap: 10 }}>
                <div className="row" style={{ gap: 12 }}>
                  <div style={{ fontFamily: 'Fredoka', fontWeight: 700, fontSize: 17 }}>#{o.code}</div>
                  <select
                    className={'order-status order-status-select ' + st.cls}
                    value={o.status}
                    onChange={(e) => updateOrder(o.id, { status: e.target.value })}
                    title="Alterar status do pedido"
                  >
                    {statuses.map((s) => <option key={s.id} value={s.id}>{s.label}</option>)}
                  </select>
                  {o.paymentStatus && payInfo[o.paymentStatus] && <span className={'pay-badge ' + payInfo[o.paymentStatus].cls}>{payInfo[o.paymentStatus].label}</span>}
                </div>
                <div className="muted" style={{ fontSize: 13 }}>{fmt(o.createdAt)}</div>
              </div>
              <div className="spread wrap" style={{ marginTop: 10, gap: 14, alignItems: 'flex-start' }}>
                <div style={{ flex: 1, minWidth: 200 }}>
                  <div style={{ fontFamily: 'Fredoka', fontWeight: 700, fontSize: 15 }}>{o.name} · {o.phone}</div>
                  <div className="muted" style={{ fontSize: 13.5, marginTop: 2 }}>
                    {o.mode === 'delivery' ? `🛵 ${o.address}, ${o.number}${o.complement ? ' - ' + o.complement : ''} · ${o.zoneName}` : '🏪 Retirada no balcão'}
                  </div>
                  <div style={{ fontSize: 13.5, marginTop: 8 }}>
                    {o.items.map((it) => <div key={it.lineId}>{it.qty}x {it.name}{it.optsText ? ' — ' + it.optsText : ''}</div>)}
                  </div>
                  {o.notes && <div className="muted" style={{ fontSize: 13, marginTop: 6, fontStyle: 'italic' }}>Obs: {o.notes}</div>}
                </div>
                <div className="center">
                  <div className="price" style={{ fontSize: 20 }}>{money(o.total)}</div>
                  <div className="muted" style={{ fontSize: 12 }}>Pix · Mercado Pago</div>
                </div>
              </div>
            </div>
          );
        })
      )}
    </div>
  );
}

Object.assign(window, { AdminLogin, AdminShell, AdminProducts, AdminProductForm, AdminSettings, AdminUsers, AdminOrders });
