/* global React, Icon, Button, Badge, Card, brl,
          PageHead, Toolbar, FooterPager, KpiMini,
          FormShell, FormSection, FieldLabel,
          FText, FNum, FDate, FSelect, FCombo, FTextarea, FSwitch,
          PRODUTOS */

const { useState: usePedState } = React;

// ============================================================
// SEED DATA — vazio; dados reais vêm do Supabase
// ============================================================
const PEDIDOS_SEED = [];

// ── Hook: carrega nomes reais de clientes / salões / distribuidores do Supabase ──
function useClientesOpts() {
  const [opts, setOpts] = React.useState([]);
  const load = React.useCallback(() => {
    if (!window.tmSupabase) return;
    Promise.all([
      window.tmSupabase.from('clientes').select('nome').order('nome'),
      window.tmSupabase.from('saloes').select('nome').order('nome'),
      window.tmSupabase.from('distribuidores').select('nome').order('nome'),
    ]).then(results => {
      const names = results
        .flatMap(({ data }) => (data || []).map(r => r.nome))
        .filter(Boolean)
        .sort((a, b) => a.localeCompare(b, 'pt-BR'));
      setOpts([...new Set(names)]);
    }).catch(() => {});
  }, []);
  React.useEffect(() => { load(); }, [load]);
  return { opts, reload: load };
}

// Vendedores — lidos da listagem viva do CRM (window.TM_VENDEDORES); sem nomes fictícios
function getVendedoresOptions() {
  const live = (typeof window !== "undefined" && window.TM_VENDEDORES) || null;
  return (live && live.length) ? live.map(v => v.nome) : [];
}
const LOJAS          = ["Matriz · SP","Filial · RJ","Filial · BH","E-commerce","Marketplace"];
const UNIDADES       = ["Cosméticos B2B","Cosméticos B2C","Profissional Salão","Linha Barbearia","Marca Própria"];
const LISTAS_PRECO   = ["Distribuidor Ouro","Distribuidor Prata","Salão Premium","Salão Padrão","Cliente Final","Promocional · Maio"];
const CONDICOES      = ["À vista","30 dias","30/60","30/60/90","Boleto 30/45/60","Boleto à vista","PIX à vista","PIX","Cartão 2×","Cartão 3×","Cartão 6×"];
const CATEGORIAS_FIN = ["Vendas B2B","Vendas B2C","Marketplace","Bonificação","Amostras","Cancelado","Sem categoria"];
const FRETES_CONTA   = [
  { value: "0", label: "0 - Contratação do Frete por conta do Remetente (CIF)" },
  { value: "1", label: "1 - Contratação do Frete por conta do Destinatário (FOB)" },
  { value: "2", label: "2 - Contratação por terceiros" },
  { value: "3", label: "3 - Transporte próprio por conta do remetente" },
  { value: "4", label: "4 - Transporte próprio por conta do destinatário" },
  { value: "9", label: "9 - Sem ocorrência de transporte" },
];

// ============================================================
// Geração automática de número de pedido
// ============================================================
function gerarNumPedido() {
  const d   = new Date();
  const yy  = String(d.getFullYear()).slice(2);
  const mm  = String(d.getMonth() + 1).padStart(2, "0");
  const dd  = String(d.getDate()).padStart(2, "0");
  const rnd = String(Math.floor(Math.random() * 900) + 100);
  return `PV-${yy}${mm}${dd}-${rnd}`;
}

// ============================================================
// SearchableSelect — dropdown com filtro por digitação
// ============================================================
function SearchableSelect({ label: labelText, hint, value, onChange, options, placeholder, required, onCreateNew }) {
  const { useState: useSSt, useEffect: useSSe, useRef: useSSr } = React;
  const [q, setQ]         = useSSt(value || "");
  const [open, setOpen]   = useSSt(false);
  const ref               = useSSr(null);

  useSSe(() => { setQ(value || ""); }, [value]);

  useSSe(() => {
    if (!open) return;
    const h = (e) => { if (ref.current && !ref.current.contains(e.target)) setOpen(false); };
    document.addEventListener("mousedown", h);
    return () => document.removeEventListener("mousedown", h);
  }, [open]);

  const filtered = (options || [])
    .filter(opt => (opt || "").toLowerCase().includes((q || "").toLowerCase()))
    .slice(0, 9);

  const pick = (opt) => { setQ(opt); onChange(opt); setOpen(false); };
  const showCreate = onCreateNew && q.length > 1 && filtered.length === 0;

  return (
    <div className="field" style={{ position: "relative" }} ref={ref}>
      <FieldLabel label={labelText} hint={hint} required={required} />
      <div style={{ position: "relative" }}>
        <input
          className="input"
          value={q}
          onChange={(e) => { setQ(e.target.value); onChange(e.target.value); setOpen(true); }}
          onFocus={() => { if ((options || []).length > 0 || onCreateNew) setOpen(true); }}
          placeholder={placeholder || "Digite para buscar…"}
        />
        {q && (
          <span
            onMouseDown={(e) => { e.preventDefault(); pick(""); }}
            style={{ position: "absolute", right: 10, top: "50%", transform: "translateY(-50%)",
                     cursor: "pointer", color: "var(--tm-fg-3)", fontSize: 16, lineHeight: 1, userSelect: "none" }}
          >×</span>
        )}
      </div>
      {open && q.length > 0 && (filtered.length > 0 || showCreate) && (
        <div style={{
          position: "absolute", top: "100%", left: 0, right: 0, zIndex: 300,
          background: "var(--tm-bg-2)", border: "1px solid var(--tm-line-1)",
          borderRadius: 8, boxShadow: "0 8px 24px rgba(0,0,0,0.3)",
          maxHeight: 240, overflowY: "auto", marginTop: 3,
        }}>
          {filtered.map((opt, i) => (
            <div key={i} onMouseDown={() => pick(opt)} style={{
              padding: "9px 14px", cursor: "pointer", fontSize: 13,
              color: opt === value ? "var(--tm-brand-champagne)" : "var(--tm-fg-1)",
              background: opt === value ? "rgba(201,163,107,0.08)" : "transparent",
              borderBottom: "1px solid var(--tm-line-1)",
            }}>
              {opt}
            </div>
          ))}
          {showCreate && (
            <div onMouseDown={() => { setOpen(false); onCreateNew(q); }} style={{
              padding: "10px 14px", cursor: "pointer", fontSize: 13,
              color: "var(--tm-brand-champagne)", display: "flex", alignItems: "center", gap: 8,
              background: "rgba(201,163,107,0.06)",
            }}>
              <Icon name="user-plus" size={14} /> Cadastrar "{q}"
            </div>
          )}
        </div>
      )}
    </div>
  );
}

// ============================================================
// ProdSearchInput — campo de busca de produto inline (tabela de itens)
// ============================================================
function ProdSearchInput({ value, onSelect, todos, placeholder }) {
  const { useState: usePSt, useEffect: usePSe, useRef: usePSr } = React;
  const [q, setQ]       = usePSt(value || "");
  const [open, setOpen] = usePSt(false);
  const ref             = usePSr(null);

  usePSe(() => { setQ(value || ""); }, [value]);

  usePSe(() => {
    if (!open) return;
    const h = (e) => { if (ref.current && !ref.current.contains(e.target)) setOpen(false); };
    document.addEventListener("mousedown", h);
    return () => document.removeEventListener("mousedown", h);
  }, [open]);

  const matches = q.trim().length >= 1
    ? (todos || []).filter(p => {
        const sq = q.toLowerCase();
        return (p.name||"").toLowerCase().includes(sq)
            || (p.sku ||"").toLowerCase().includes(sq)
            || (p.ean ||"").toLowerCase().includes(sq);
      }).slice(0, 8)
    : [];

  return (
    <div style={{ position: "relative", flex: 1, minWidth: 0 }} ref={ref}>
      <input
        className="input"
        placeholder={placeholder || "Pesquise por SKU, nome ou EAN…"}
        value={q}
        onChange={(e) => { setQ(e.target.value); setOpen(true); }}
        onFocus={() => { if (q.trim().length >= 1) setOpen(true); }}
      />
      {open && matches.length > 0 && (
        <div style={{
          position: "absolute", top: "calc(100% + 2px)", left: 0,
          minWidth: 380, zIndex: 300,
          background: "var(--tm-bg-2)", border: "1px solid var(--tm-line-1)",
          borderRadius: 8, boxShadow: "0 10px 28px rgba(0,0,0,0.35)",
          maxHeight: 300, overflowY: "auto",
        }}>
          {matches.map((prod, i) => (
            <div key={prod.sku || i} onMouseDown={() => { onSelect(prod); setQ(prod.name); setOpen(false); }} style={{
              padding: "9px 12px", cursor: "pointer",
              display: "flex", alignItems: "center", gap: 10,
              borderBottom: i < matches.length - 1 ? "1px solid var(--tm-line-1)" : "none",
            }}>
              <span style={{
                fontSize: 11, color: "var(--tm-brand-champagne)",
                background: "rgba(201,163,107,0.12)",
                padding: "2px 7px", borderRadius: 4, flexShrink: 0,
                fontFamily: "monospace", letterSpacing: "0.02em",
              }}>{prod.sku}</span>
              <span style={{ fontSize: 13, flex: 1, minWidth: 0, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}>
                {prod.name}
              </span>
              {prod.linha && (
                <span style={{ fontSize: 11, color: "var(--tm-fg-3)", flexShrink: 0 }}>{prod.linha}</span>
              )}
              {prod.temVariacoes ? (
                <span style={{ fontSize: 10.5, color: "var(--tm-brand-champagne)", flexShrink: 0,
                  background: "rgba(201,163,107,0.14)", padding: "2px 7px", borderRadius: 4 }}>
                  escolher variação
                </span>
              ) : prod.venda > 0 && (
                <span style={{ fontSize: 12, color: "var(--tm-fg-2)", fontVariantNumeric: "tabular-nums", flexShrink: 0 }}>
                  R$ {brl(prod.venda)}
                </span>
              )}
            </div>
          ))}
        </div>
      )}
    </div>
  );
}

// ============================================================
// PedidoForm — página completa de criação/edição
// ============================================================
function PedidoForm({ state, set, onCancel, onSave, onDelete, onPreview }) {
  const p = state.draft;
  const isNew = state.mode === "new";
  const VENDEDORES    = getVendedoresOptions();
  const { opts: CLIENTES_OPTS, reload: reloadClientes } = useClientesOpts();

  // ── Quick-register client modal ────────────────────────────
  const [quickClient, setQuickClient] = usePedState(null); // null or { nome, tipo }
  const [quickSaving, setQuickSaving] = usePedState(false);

  const openQuickClient = (nome) => {
    setQuickClient({
      nome: nome || '',
      tipo: 'cliente', // 'cliente' | 'salao' | 'distribuidor'
      tipoPessoa: 'PF',
      cnpj: '', cpf: '',
      celular: '', email: '',
      cidade: '', uf: '',
      ie: '',
    });
  };

  const saveQuickClient = async () => {
    if (!quickClient?.nome?.trim()) { alert('Nome é obrigatório.'); return; }
    if (!window.tmSupabase) return;
    setQuickSaving(true);
    const tableMap = { cliente: 'clientes', salao: 'saloes', distribuidor: 'distribuidores' };
    const table = tableMap[quickClient.tipo] || 'clientes';
    const isPJ = quickClient.tipoPessoa === 'PJ';
    const payload = {
      nome: quickClient.nome.trim(),
      tipo_pessoa: quickClient.tipoPessoa,
      ...(isPJ ? { cnpj: quickClient.cnpj || null } : { cpf: quickClient.cpf || null }),
      celular: quickClient.celular || null,
      email: quickClient.email || null,
      geral_cidade: quickClient.cidade || null,
      geral_uf: quickClient.uf || null,
      inscricao_estadual: quickClient.ie || null,
      situacao: 'Ativo',
      tipos_contato: quickClient.tipo === 'salao' ? ['Cliente','Salão'] : quickClient.tipo === 'distribuidor' ? ['Distribuidor'] : ['Cliente'],
    };
    if (quickClient.tipo === 'salao') payload.tipo_salao = 'Cabelo';
    const { error } = await window.tmSupabase.from(table).insert(payload);
    setQuickSaving(false);
    if (error) { alert('Erro ao cadastrar: ' + error.message); return; }
    set('cli', quickClient.nome.trim());
    reloadClientes();
    setQuickClient(null);
  };

  // ── Produtos e tabelas de preço carregados do Supabase ──────
  const todosProds   = useProdutosList([]);
  const todasTabelas = useTabelasPrecoList([]);

  // ── Variações de produto (Fase 2) ───────────────────────────
  const [variacoesPedido, setVariacoesPedido] = usePedState([]);
  const [varPicker, setVarPicker]             = usePedState(null);
  React.useEffect(() => {
    if (window.tmDb) window.tmDb.loadVariacoes().then(setVariacoesPedido);
  }, []);
  const variacoesDoProduto = (produtoId) => variacoesPedido.filter(v => v.produtoId === produtoId);

  const listasOpts   = todasTabelas.rows.length > 0
    ? todasTabelas.rows.filter(t => t.status === "Ativa").map(t => t.nome)
    : LISTAS_PRECO;

  // ── Resolve preço a partir da tabela selecionada ────────────
  const getPrecoFromTabela = (prod, tabelaNome) => {
    if (!prod) return 0;
    const tabela = todasTabelas.rows.find(r => r.nome === tabelaNome);
    const tipo   = (tabela && tabela.tipo) || "Cliente Final";
    let preco    = prod.venda || 0;
    if (tipo === "Distribuidor")  preco = prod.precoDiv   || prod.venda || 0;
    if (tipo === "Salão")         preco = prod.precoSalao || prod.venda || 0;
    if (tipo === "Promocional")   preco = prod.precoPromo || prod.venda || 0;
    if (tipo === "Personalizada" && tabela) {
      const pct = parseFloat(String(tabela.desconto || "0").replace("%","")) || 0;
      preco = (prod.venda || 0) * (1 - pct / 100);
    }
    return Math.round(preco * 100) / 100;
  };

  // ── Preenche a linha a partir de uma variação ───────────────
  const fillLineFromVariacao = (idx, prodPai, v) => {
    const preco = getPrecoFromTabela(v, p.listaPreco);
    const next  = items.map((it, i) => i === idx ? {
      ...it,
      produtoId:  prodPai ? prodPai.id : (v.produtoId || it.produtoId),
      variacaoId: v.id,
      sku:        v.sku || "",
      desc:       `${prodPai ? prodPai.name : "Produto"} · ${v.nome || ""}`.trim(),
      un:         (prodPai && prodPai.unidade) || it.un || "UN",
      precoLista: preco || it.precoLista,
    } : it);
    set("items", next);
  };

  // ── Auto-fill linha do pedido quando SKU é digitado ─────────
  const fillItemFromSku = (idx, sku) => {
    // SKU de uma variação? — preenche direto com a variação
    const vari = sku ? variacoesPedido.find(v => (v.sku || "") === sku) : null;
    if (vari) {
      const prodPai = todosProds.rows.find(r => r.id === vari.produtoId);
      fillLineFromVariacao(idx, prodPai, vari);
      return;
    }
    const prod = todosProds.rows.find(r => (r.sku || "") === sku);
    // Produto-vitrine: não preenche pelo SKU do pai — usar a busca p/ escolher variação
    if (prod && prod.temVariacoes) { setItem(idx, "sku", sku); return; }
    const preco = prod ? getPrecoFromTabela(prod, p.listaPreco) : 0;
    const next  = items.map((it, i) => i === idx ? {
      ...it, sku, variacaoId: null,
      produtoId:  prod ? prod.id             : it.produtoId,
      desc:       prod ? prod.name           : it.desc,
      un:         prod ? (prod.unidade||"UN"): it.un,
      precoLista: preco || it.precoLista,
    } : it);
    set("items", next);
  };

  // ── Auto-fill a partir de um objeto produto (ProdSearchInput) ─
  const fillItemWithProd = (idx, prod) => {
    // Produto com variações → abre o seletor de variação
    if (prod.temVariacoes) { setVarPicker({ itemIdx: idx, produto: prod }); return; }
    const preco = getPrecoFromTabela(prod, p.listaPreco);
    const next  = items.map((it, i) => i === idx ? {
      ...it,
      produtoId:  prod.id         || null,
      variacaoId: null,
      sku:        prod.sku        || "",
      desc:       prod.name       || "",
      un:         prod.unidade    || "UN",
      precoLista: preco           || it.precoLista,
    } : it);
    set("items", next);
  };

  // ── Atualiza preços de todos os itens quando tabela muda ────
  const refreshAllPrices = () => {
    const next = items.map(it => {
      const prod = todosProds.rows.find(r => r.sku === it.sku);
      if (!prod) return it;
      return { ...it, precoLista: getPrecoFromTabela(prod, p.listaPreco) };
    });
    set("items", next);
  };

  // Items helpers ------------------------------------------------
  const items = p.items || [{ sku: "", desc: "", un: "UN", qty: "", precoLista: "", descPct: 0 }];
  const setItem = (idx, key, value) => {
    const next = items.map((it, i) => i === idx ? { ...it, [key]: value } : it);
    set("items", next);
  };
  const addItem    = () => set("items", [...items, { sku: "", desc: "", un: "UN", qty: "", precoLista: "", descPct: 0 }]);
  const removeItem = (idx) => set("items", items.filter((_, i) => i !== idx));

  // Sub-tab state (Itens / Comissões)
  const [tab, setTab] = usePedState("itens");

  // Computed totals ---------------------------------------------
  const numItens   = items.filter(i => i.sku || i.desc).length;
  const somaQtd    = items.reduce((s, i) => s + (Number(i.qty) || 0), 0);
  const subtotal   = items.reduce((s, i) => s + (Number(i.qty) || 0) * (Number(i.precoLista) || 0), 0);
  const descLinha  = items.reduce((s, i) => s + (Number(i.qty) || 0) * (Number(i.precoLista) || 0) * ((Number(i.descPct) || 0) / 100), 0);
  const descExtra  = Number(p.descontoExtra) || 0;
  const outras     = Number(p.outrasDespesas) || 0;
  const frete      = Number(p.transp && p.transp.valor) || 0;
  const impostos   = (subtotal - descLinha - descExtra) * 0.18;
  const totalVenda = subtotal - descLinha - descExtra + outras + frete;
  const custoTotal = subtotal * 0.42; // simulated COGS for display

  // Peso bruto calculado a partir dos itens (produto.pesoBruto está em gramas → ÷1000 = kg)
  const pesoBrutoCalc = Math.round(
    items.reduce((tot, it) => {
      const prod = todosProds.rows.find(r => r.sku === it.sku);
      const g    = prod ? (Number(prod.pesoBruto) || 0) : 0;
      return tot + (Number(it.qty) || 0) * (g / 1000);
    }, 0) * 100
  ) / 100;
  const pesoBrutoManual = !!(p.transp && p.transp.pesoBrutoManual);

  // Transportador setter
  const setTransp = (key, value) => set("transp", { ...(p.transp || {}), [key]: value });

  // Parcelas — usamos p.parcelas (editável) quando existe, senão calculamos
  const parcelasComp = parseParcelas(p.condPag, totalVenda, p.dataVenda);
  const parcelas = p.parcelas || parcelasComp;
  const setParcelaField = (i, key, val) => {
    const base = p.parcelas || parcelasComp;
    set("parcelas", base.map((par, idx) => idx === i ? { ...par, [key]: val } : par));
  };
  const removerParcela = (i) => {
    const base = p.parcelas || parcelasComp;
    const novo = base.filter((_, idx) => idx !== i);
    set("parcelas", novo.length ? novo : undefined);
  };

  return (
    <div className="canvas">
      {varPicker && (
        <div onClick={() => setVarPicker(null)}
          style={{ position: "fixed", inset: 0, zIndex: 340, background: "rgba(0,0,0,0.65)",
            display: "flex", alignItems: "center", justifyContent: "center" }}>
          <div onClick={(e) => e.stopPropagation()}
            style={{ background: "var(--tm-bg-1)", borderRadius: 14, width: 520, maxHeight: "80vh",
              border: "1px solid var(--tm-line-1)", boxShadow: "0 24px 64px rgba(0,0,0,0.5)",
              display: "flex", flexDirection: "column" }}>
            <div style={{ padding: "16px 20px", borderBottom: "1px solid var(--tm-line-1)",
              display: "flex", alignItems: "flex-start", justifyContent: "space-between" }}>
              <div>
                <div style={{ fontFamily: "var(--tm-font-display)", fontSize: 17 }}>Escolher variação</div>
                <div className="muted" style={{ fontSize: 12.5, marginTop: 2 }}>{varPicker.produto.name}</div>
              </div>
              <button className="icon-btn" onClick={() => setVarPicker(null)}><Icon name="x" size={16} /></button>
            </div>
            <div style={{ padding: "6px 12px 10px", overflow: "auto" }}>
              {variacoesDoProduto(varPicker.produto.id).length === 0 ? (
                <div style={{ padding: "28px 0", textAlign: "center", color: "var(--tm-fg-3)", fontSize: 13 }}>
                  Este produto ainda não tem variações cadastradas.
                </div>
              ) : variacoesDoProduto(varPicker.produto.id).map((v, vi) => (
                <div key={v.id || vi}
                  onClick={() => { fillLineFromVariacao(varPicker.itemIdx, varPicker.produto, v); setVarPicker(null); }}
                  style={{ display: "flex", alignItems: "center", gap: 10, padding: "10px",
                    borderRadius: 8, cursor: "pointer", borderBottom: "1px solid var(--tm-line-0)" }}
                  onMouseEnter={(e) => e.currentTarget.style.background = "var(--tm-bg-2)"}
                  onMouseLeave={(e) => e.currentTarget.style.background = "transparent"}>
                  <div style={{ flex: 1, minWidth: 0 }}>
                    <div style={{ fontSize: 13, fontWeight: 500 }}>{v.nome || `Variação ${vi + 1}`}</div>
                    <div className="muted" style={{ fontSize: 11 }}>
                      {[v.tipo, v.sku].filter(Boolean).join(" · ") || "sem SKU"}
                    </div>
                  </div>
                  <span className="muted" style={{ fontSize: 12 }}>{Number(v.est) || 0} un</span>
                  <span style={{ fontSize: 13, fontWeight: 600, color: "var(--tm-brand-champagne)", fontVariantNumeric: "tabular-nums" }}>
                    R$ {brl(getPrecoFromTabela(v, p.listaPreco))}
                  </span>
                </div>
              ))}
            </div>
          </div>
        </div>
      )}
      <FormShell
        breadcrumb="Pedidos de venda"
        eyebrow={isNew ? `Pedido de venda — Novo` : `Pedido de venda — ${p.num}`}
        title={p.cli || ""}
        meta={isNew ? "" : `<b>${p.status}</b> · criado em <b>${p.data}</b>`}
        isNew={isNew}
        onCancel={onCancel}
        onSave={onSave}
        onDelete={onDelete}
        extraActions={onPreview ? (
          <Button variant="ghost" icon="printer" size="sm" onClick={onPreview}>Pré-visualizar</Button>
        ) : null}
      >
        {/* ---------- Dados do cliente ---------- */}
        <FormSection title="Dados do cliente">
          <div className="field-grid-4">
            <SearchableSelect label="Cliente" required hint="Empresa ou pessoa para quem a venda é emitida" value={p.cli || ""} onChange={(v) => set("cli", v)} options={CLIENTES_OPTS} placeholder="Digite o nome do cliente…" onCreateNew={openQuickClient} />
            <SearchableSelect label="Vendedor" hint="Cadastre vendedores em Configurações › Equipe" value={p.vendedor || ""} onChange={(v) => set("vendedor", v)} options={VENDEDORES} placeholder="Digite o nome do vendedor…" />
            <FSelect label="Loja"          hint="Filial emissora da nota"     value={p.loja || "Matriz · SP"} onChange={(v) => set("loja", v)} options={LOJAS} />
            <FSelect label="Unidade de negócio" value={p.unidade} onChange={(v) => set("unidade", v)} options={UNIDADES} />
          </div>
          <div className="field-grid-4">
            <FSelect label="Lista de preço" hint="Define preços padrão e descontos" value={p.listaPreco} onChange={(v) => set("listaPreco", v)} options={listasOpts} />
          </div>
        </FormSection>

        {/* ---------- Itens / Comissões ---------- */}
        <FormSection title={null}>
          <div className="section-tabs">
            <span className={`stab ${tab === "itens" ? "active" : ""}`} onClick={() => setTab("itens")}>Itens do pedido de venda</span>
            <span className={`stab ${tab === "comissoes" ? "active" : ""}`} onClick={() => setTab("comissoes")}>Comissões</span>
          </div>

          {tab === "itens" ? (
            <>
              <div className="pedido-items-head">
                <div></div>
                <div className="h">Descrição <span className="info-dot" title="Busca por código, descrição ou GTIN">i</span></div>
                <div className="h">Código</div>
                <div className="h">Un</div>
                <div className="h right">Quantidade</div>
                <div className="h right">Preço lista</div>
                <div className="h right">Desc (%)</div>
                <div className="h right">Preço un</div>
                <div className="h right">Preço total</div>
                <div></div>
              </div>
              {items.map((it, i) => {
                if (!it) return null; // guarda contra itens nulos/undefined
                const precoUn = (Number(it.precoLista) || 0) * (1 - (Number(it.descPct) || 0) / 100);
                const total   = precoUn * (Number(it.qty) || 0);
                return (
                  <div key={i} className="pedido-items-row">
                    <div className="num-bubble">{i + 1}</div>
                    <ProdSearchInput
                      value={it.desc || ""}
                      todos={todosProds.rows}
                      onSelect={(prod) => fillItemWithProd(i, prod)}
                      placeholder="Pesquise por SKU, nome ou EAN…"
                    />
                    <input className="input" placeholder="SKU"
                           value={it.sku || ""}
                           onChange={(e) => fillItemFromSku(i, e.target.value)} />
                    <input className="input" value={it.un || "UN"} onChange={(e) => setItem(i, "un", e.target.value)} />
                    <input className="input num right" type="number" value={it.qty ?? ""}
                           onChange={(e) => setItem(i, "qty", e.target.value)} />
                    <input className="input num right" type="number" value={it.precoLista ?? ""}
                           onChange={(e) => setItem(i, "precoLista", e.target.value)} />
                    <input className="input num right" type="number" value={it.descPct ?? 0}
                           onChange={(e) => setItem(i, "descPct", e.target.value)} />
                    <div className="readonly">{precoUn ? `R$ ${brl(precoUn)}` : ""}</div>
                    <div className="readonly" style={{ color: "var(--tm-brand-champagne)", fontWeight: 600 }}>{total ? `R$ ${brl(total)}` : ""}</div>
                    <button className="icon-btn" title="Remover item" onClick={() => removeItem(i)}><Icon name="trash-2" size={14} /></button>
                  </div>
                );
              })}
              {items.length === 0 && <div className="pedido-items-empty">Nenhum item ainda. Clique em "Adicionar outro item" para começar.</div>}
              <div className="add-item-link" style={{ display: "flex", alignItems: "center", justifyContent: "space-between", flexWrap: "wrap", gap: 8 }}>
                <button onClick={addItem}><Icon name="plus" size={13} /> Adicionar outro item</button>
                {p.listaPreco && items.some(it => it.sku) && (
                  <button
                    onClick={refreshAllPrices}
                    style={{ color: "var(--tm-brand-champagne)", fontSize: 12, fontWeight: 500 }}
                  >
                    <Icon name="refresh-cw" size={12} /> Atualizar preços pela tabela "{p.listaPreco}"
                  </button>
                )}
              </div>
            </>
          ) : (
            <ComissoesTab pedido={p} />
          )}
        </FormSection>

        {/* ---------- Totais ---------- */}
        <FormSection title="Totais" meta="Calculado automaticamente a partir dos itens">
          <div className="totais-grid">
            <ReadOnlyField label="Nº de itens"          value={numItens} />
            <ReadOnlyField label="Soma das quantidades" value={somaQtd} />
            <FNum  label="Desconto" hint="Desconto adicional sobre o subtotal" suffix="R$" value={p.descontoExtra} onChange={(v) => set("descontoExtra", v)} />
            <FNum  label="Prazo de entrega" hint="Em dias úteis" suffix="dias" value={p.prazoEntrega} onChange={(v) => set("prazoEntrega", v)} />
            <FNum  label="Outras despesas" suffix="R$" value={p.outrasDespesas} onChange={(v) => set("outrasDespesas", v)} />
          </div>
          <div className="totais-grid">
            <ReadOnlyField label="Subtotal"      value={brlSafe(subtotal)} />
            <ReadOnlyField label="Custo total"   value={brlSafe(custoTotal)} muted />
            <ReadOnlyField label="Frete"         value={brlSafe(frete)} />
            <ReadOnlyField label="Impostos est." value={brlSafe(impostos)} muted />
            <ReadOnlyField label="Total da venda" value={brlSafe(totalVenda)} highlight />
          </div>
        </FormSection>

        {/* ---------- Movimentação de estoque ---------- */}
        <div style={{
          margin: "0 24px 2px",
          padding: "14px 18px",
          borderRadius: 10,
          background: p.afetaEstoque !== false
            ? "rgba(52,199,89,0.05)"
            : "rgba(245,158,11,0.06)",
          border: `1px solid ${p.afetaEstoque !== false
            ? "rgba(52,199,89,0.2)"
            : "rgba(245,158,11,0.28)"}`,
          display: "flex",
          alignItems: "center",
          justifyContent: "space-between",
          gap: 16,
        }}>
          <div style={{ display: "flex", alignItems: "center", gap: 12 }}>
            <div style={{
              width: 38, height: 38, borderRadius: 9, flexShrink: 0,
              background: p.afetaEstoque !== false
                ? "rgba(52,199,89,0.12)"
                : "rgba(245,158,11,0.12)",
              display: "flex", alignItems: "center", justifyContent: "center",
            }}>
              <Icon
                name={p.afetaEstoque !== false ? "package-minus" : "eye-off"}
                size={17}
                style={{ color: p.afetaEstoque !== false ? "var(--tm-success)" : "#f59e0b" }}
              />
            </div>
            <div>
              <div style={{ fontSize: 13.5, fontWeight: 600, color: "var(--tm-fg-1)" }}>
                {p.afetaEstoque !== false ? "Baixa de estoque ativada" : "Sem baixa de estoque"}
              </div>
              <div style={{ fontSize: 12, color: "var(--tm-fg-3)", marginTop: 2, lineHeight: 1.55 }}>
                {p.afetaEstoque !== false
                  ? "As quantidades dos itens serão deduzidas do estoque ao confirmar o pedido."
                  : "Modo informativo — útil para amostras, bonificações ou pedidos externos. O estoque não é alterado."}
              </div>
            </div>
          </div>
          <FSwitch
            label={p.afetaEstoque !== false ? "Ativo" : "Inativo"}
            value={p.afetaEstoque !== false}
            onChange={(v) => set("afetaEstoque", v)}
          />
        </div>

        {/* ---------- Detalhes da venda ---------- */}
        <FormSection title="Detalhes da venda">
          <div className="field-grid-5">
            <div className="field">
              <FieldLabel label="Número do pedido" hint="Gerado automaticamente" />
              <div style={{ display: "flex", gap: 6 }}>
                <input className="input" style={{ flex: 1, fontFamily: "monospace", letterSpacing: "0.04em" }}
                  value={p.num || ""} onChange={(e) => set("num", e.target.value)} />
                <button className="icon-btn" title="Gerar novo número" onClick={() => set("num", gerarNumPedido())}>
                  <Icon name="refresh-cw" size={13} />
                </button>
              </div>
            </div>
            <FDate label="Data da venda"  hint="Quando o pedido foi feito"   value={p.dataVenda}    onChange={(v) => set("dataVenda", v)} />
            <FDate label="Data saída"     hint="Quando o produto sai do depósito" value={p.dataSaida} onChange={(v) => set("dataSaida", v)} />
            <FDate label="Data prevista"  hint="Previsão de entrega"          value={p.dataPrevista} onChange={(v) => set("dataPrevista", v)} />
            <FText label="Pedido de compra" hint="Referência do cliente"      value={p.pedidoCompra} onChange={(v) => set("pedidoCompra", v)} />
          </div>
        </FormSection>

        {/* ---------- Pagamento ---------- */}
        <FormSection title="Pagamento">
          <div className="field-grid-3" style={{ alignItems: "flex-end" }}>
            <FCombo label="Condição de pagamento" hint="Define quantidade e prazo das parcelas" value={p.condPag} onChange={(v) => set("condPag", v)} options={CONDICOES} placeholder="Ex: 30/60/90 ou Boleto 30 dias…" />
            <div className="field"><FieldLabel label="&nbsp;" /><button className="inline-action" onClick={() => set("parcelas", parseParcelas(p.condPag, totalVenda, p.dataVenda))}>Gerar parcelas</button></div>
            <FSelect label="Categoria" hint="Categoria do plano de contas" value={p.categoria || "Sem categoria"} onChange={(v) => set("categoria", v)} options={CATEGORIAS_FIN} />
          </div>

          {parcelas.length > 0 && (
            <div className="parcelas-table">
              <div className="ph">
                <div>Nº</div><div>Vencimento</div><div className="num right">Valor</div><div>Forma</div><div>Conta</div><div></div>
              </div>
              {parcelas.map((par, i) => (
                <div key={i} className="pr">
                  <div className="num">{i + 1}</div>
                  <input className="input" value={par.venc}
                    onChange={(e) => setParcelaField(i, "venc", e.target.value)} />
                  <input className="input num right" value={brlSafe(par.valor)} readOnly />
                  <select className="input" value={par.forma}
                    onChange={(e) => setParcelaField(i, "forma", e.target.value)}>
                    {["Dinheiro","PIX","Boleto","Cartão","Transferência","Cheque","Crédito loja"].map(f => (
                      <option key={f} value={f}>{f}</option>
                    ))}
                    {!["Dinheiro","PIX","Boleto","Cartão","Transferência","Cheque","Crédito loja"].includes(par.forma) && par.forma && (
                      <option value={par.forma}>{par.forma}</option>
                    )}
                  </select>
                  <input className="input" value={par.conta}
                    onChange={(e) => setParcelaField(i, "conta", e.target.value)} />
                  <button className="icon-btn" title="Remover" onClick={() => removerParcela(i)}>
                    <Icon name="trash-2" size={14} />
                  </button>
                </div>
              ))}
            </div>
          )}
        </FormSection>

        {/* ---------- Transportador ---------- */}
        <FormSection title="Transportador">
          {/* Quem paga o frete — toggle visual */}
          {(() => {
            const conta = (p.transp && p.transp.fretePorConta) || "0";
            const opts = [
              { value: "0", icon: "building-2", label: "Empresa paga",    hint: "CIF — frete incluso no pedido" },
              { value: "1", icon: "user",        label: "Cliente paga",    hint: "FOB — cliente arca com o frete" },
              { value: "9", icon: "package-x",   label: "Sem frete",       hint: "Retirada ou sem envio" },
            ];
            return (
              <div style={{ display: "flex", gap: 8, marginBottom: 18 }}>
                {opts.map(o => {
                  const active = conta === o.value;
                  return (
                    <button key={o.value} onClick={() => {
                      setTransp("fretePorConta", o.value);
                      if (o.value === "9") setTransp("valor", 0);
                    }} style={{
                      flex: 1, display: "flex", flexDirection: "column", alignItems: "center", gap: 5,
                      padding: "10px 8px", borderRadius: 10, cursor: "pointer",
                      border: active ? "1.5px solid var(--tm-brand-champagne)" : "1.5px solid var(--tm-line-2)",
                      background: active ? "rgba(201,163,107,0.08)" : "var(--tm-bg-2)",
                      transition: "all 0.15s",
                    }}>
                      <Icon name={o.icon} size={18} style={{ color: active ? "var(--tm-brand-champagne)" : "var(--tm-fg-3)" }} />
                      <span style={{ fontSize: 12, fontWeight: active ? 600 : 400, color: active ? "var(--tm-fg-1)" : "var(--tm-fg-2)" }}>{o.label}</span>
                      <span style={{ fontSize: 10, color: "var(--tm-fg-4)", textAlign: "center", lineHeight: 1.3 }}>{o.hint}</span>
                    </button>
                  );
                })}
              </div>
            );
          })()}
          <div className="field-grid-5">
            <FText label="Nome da transportadora" value={p.transp && p.transp.nome} onChange={(v) => setTransp("nome", v)} placeholder="Razão social da transportadora" />
            <FNum label="Quantidade" hint="Nº de volumes" value={p.transp && p.transp.qtd} onChange={(v) => setTransp("qtd", v)} />
            <div className="field">
              <FieldLabel label="Peso bruto" hint={pesoBrutoManual ? "Editado manualmente" : "Calculado dos itens"} />
              <div style={{ display: "flex", gap: 6 }}>
                {pesoBrutoManual ? (
                  <input className="input" type="number" style={{ flex: 1, textAlign: "right", fontVariantNumeric: "tabular-nums" }}
                    value={p.transp && p.transp.pesoBruto != null ? p.transp.pesoBruto : ""}
                    onChange={(e) => setTransp("pesoBruto", e.target.value)} />
                ) : (
                  <div className="input" style={{ flex: 1, display: "flex", alignItems: "center", justifyContent: "flex-end", gap: 4,
                    color: pesoBrutoCalc > 0 ? "var(--tm-fg-2)" : "var(--tm-fg-4)", fontVariantNumeric: "tabular-nums" }}>
                    {pesoBrutoCalc > 0 ? pesoBrutoCalc : "0"}
                    <span style={{ fontSize: 11, color: "var(--tm-fg-3)" }}>kg</span>
                  </div>
                )}
                <button className="icon-btn"
                  title={pesoBrutoManual ? "Voltar ao cálculo automático" : "Editar manualmente"}
                  onClick={() => {
                    if (pesoBrutoManual) {
                      set("transp", { ...(p.transp || {}), pesoBrutoManual: false });
                    } else {
                      set("transp", { ...(p.transp || {}), pesoBrutoManual: true, pesoBruto: pesoBrutoCalc });
                    }
                  }}>
                  <Icon name={pesoBrutoManual ? "refresh-cw" : "pencil"} size={13} />
                </button>
              </div>
            </div>
            <FNum label="Frete" suffix="R$" hint="Valor do frete" value={p.transp && p.transp.valor} onChange={(v) => setTransp("valor", v)} />
          </div>
          <div className="field-grid-3">
            <FSelect label="Logística" hint="Integração de envio" value={(p.transp && p.transp.logistica) || ""} onChange={(v) => setTransp("logistica", v)} options={["Selecione a integração","Jadlog · Standard","Total Express · Sedex","Jamef · Standard","Loggi · Express","Correios · PAC","Correios · Sedex","Mercado Envios"]} />
          </div>
          <label className="tm-check">
            <input type="checkbox" checked={!!(p.transp && p.transp.enderecoDiferente)} onChange={(e) => setTransp("enderecoDiferente", e.target.checked)} />
            <span className="box"><Icon name="check" size={12} /></span>
            <span>Endereço de entrega diferente da cobrança</span>
          </label>
          {p.transp && p.transp.enderecoDiferente && (
            <div className="field-grid-4">
              <FText label="CEP entrega"   value={p.transp.entregaCep}    onChange={(v) => setTransp("entregaCep", v)} />
              <FText label="Endereço"      value={p.transp.entregaEnd}    onChange={(v) => setTransp("entregaEnd", v)} />
              <FText label="Cidade · UF"   value={p.transp.entregaCidade} onChange={(v) => setTransp("entregaCidade", v)} />
              <FText label="Recebedor"     value={p.transp.entregaRecebedor} onChange={(v) => setTransp("entregaRecebedor", v)} placeholder="Nome de quem recebe" />
            </div>
          )}
        </FormSection>

        {/* ---------- Dados adicionais ---------- */}
        <FormSection title="Dados adicionais" collapsible defaultOpen>
          <FTextarea label="Observações" rows={4} value={p.obs} onChange={(v) => set("obs", v)} placeholder="Texto que aparece na nota fiscal e/ou para o cliente" />
          <FTextarea label="Observações internas" rows={4} value={p.obsInternas} onChange={(v) => set("obsInternas", v)} placeholder="Apenas para o time interno · não vai na NF-e" />
        </FormSection>
      </FormShell>

      {/* ── Modal: Cadastro rápido de cliente ── */}
      {quickClient && (
        <div style={{ position: 'fixed', inset: 0, zIndex: 9999, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
          <div style={{ position: 'absolute', inset: 0, background: 'rgba(0,0,0,0.6)' }} onClick={() => setQuickClient(null)} />
          <div style={{ position: 'relative', background: 'var(--tm-bg-2)', borderRadius: 14, padding: 28, width: '100%', maxWidth: 520, boxShadow: '0 16px 48px rgba(0,0,0,0.5)', border: '1px solid var(--tm-line-1)' }}>
            <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 20 }}>
              <div>
                <h3 style={{ margin: 0, fontSize: 17, fontWeight: 600 }}>Cadastro rápido</h3>
                <div className="muted" style={{ fontSize: 12, marginTop: 2 }}>Cadastre um novo cliente, salão ou distribuidor</div>
              </div>
              <button onClick={() => setQuickClient(null)} style={{ background: 'none', border: 'none', cursor: 'pointer', color: 'var(--tm-fg-3)', fontSize: 20 }}>×</button>
            </div>

            <div style={{ display: 'flex', gap: 8, marginBottom: 18 }}>
              {[{ k: 'cliente', l: 'Cliente', i: 'user' }, { k: 'salao', l: 'Salão / Barbearia', i: 'scissors' }, { k: 'distribuidor', l: 'Distribuidor', i: 'truck' }].map(t => (
                <button key={t.k} onClick={() => setQuickClient(prev => ({ ...prev, tipo: t.k, tipoPessoa: t.k === 'cliente' ? 'PF' : 'PJ' }))}
                  style={{
                    flex: 1, padding: '8px 10px', borderRadius: 8, border: '1px solid',
                    borderColor: quickClient.tipo === t.k ? 'var(--tm-brand-champagne)' : 'var(--tm-line-1)',
                    background: quickClient.tipo === t.k ? 'rgba(201,163,107,0.12)' : 'transparent',
                    color: quickClient.tipo === t.k ? 'var(--tm-brand-champagne)' : 'var(--tm-fg-2)',
                    cursor: 'pointer', fontSize: 12.5, display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 6,
                  }}>
                  <Icon name={t.i} size={14} /> {t.l}
                </button>
              ))}
            </div>

            <div className="field-grid-2" style={{ gap: 12 }}>
              <FText label="Nome" required value={quickClient.nome} onChange={(v) => setQuickClient(prev => ({ ...prev, nome: v }))} placeholder="Nome completo ou razão social" />
              <FSelect label="Tipo pessoa" value={quickClient.tipoPessoa} onChange={(v) => setQuickClient(prev => ({ ...prev, tipoPessoa: v }))} options={[{ value: 'PF', label: 'Pessoa Física' }, { value: 'PJ', label: 'Pessoa Jurídica' }]} />
            </div>
            <div className="field-grid-2" style={{ gap: 12, marginTop: 12 }}>
              {quickClient.tipoPessoa === 'PJ' ? (
                <FText label="CNPJ" value={quickClient.cnpj} onChange={(v) => setQuickClient(prev => ({ ...prev, cnpj: v }))} placeholder="00.000.000/0000-00" />
              ) : (
                <FText label="CPF" value={quickClient.cpf} onChange={(v) => setQuickClient(prev => ({ ...prev, cpf: v }))} placeholder="000.000.000-00" />
              )}
              <FText label="Inscrição Estadual" value={quickClient.ie} onChange={(v) => setQuickClient(prev => ({ ...prev, ie: v }))} placeholder="Opcional" />
            </div>
            <div className="field-grid-2" style={{ gap: 12, marginTop: 12 }}>
              <FText label="Celular / WhatsApp" value={quickClient.celular} onChange={(v) => setQuickClient(prev => ({ ...prev, celular: v }))} placeholder="(00) 00000-0000" />
              <FText label="E-mail" value={quickClient.email} onChange={(v) => setQuickClient(prev => ({ ...prev, email: v }))} placeholder="email@exemplo.com" />
            </div>
            <div className="field-grid-2" style={{ gap: 12, marginTop: 12 }}>
              <FText label="Cidade" value={quickClient.cidade} onChange={(v) => setQuickClient(prev => ({ ...prev, cidade: v }))} placeholder="São Paulo" />
              <FSelect label="UF" value={quickClient.uf} onChange={(v) => setQuickClient(prev => ({ ...prev, uf: v }))}
                options={['','AC','AL','AM','AP','BA','CE','DF','ES','GO','MA','MG','MS','MT','PA','PB','PE','PI','PR','RJ','RN','RO','RR','RS','SC','SE','SP','TO']} />
            </div>

            <div style={{ display: 'flex', justifyContent: 'flex-end', gap: 10, marginTop: 22, paddingTop: 16, borderTop: '1px solid var(--tm-line-1)' }}>
              <Button variant="ghost" size="sm" onClick={() => setQuickClient(null)}>Cancelar</Button>
              <Button variant="primary" size="sm" icon="check" onClick={saveQuickClient} disabled={quickSaving}>
                {quickSaving ? 'Salvando...' : 'Cadastrar e selecionar'}
              </Button>
            </div>
          </div>
        </div>
      )}
    </div>
  );
}

// Read-only display field used in the Totais bar
function ReadOnlyField({ label, value, muted, highlight }) {
  return (
    <label className="field">
      <FieldLabel label={label} />
      <div className="input" style={{
        display: "flex", alignItems: "center", justifyContent: "flex-end",
        fontVariantNumeric: "tabular-nums",
        color: highlight ? "var(--tm-brand-champagne)" : muted ? "var(--tm-fg-3)" : "var(--tm-fg-1)",
        fontWeight: highlight ? 600 : 400,
      }}>
        {value || "0,00"}
      </div>
    </label>
  );
}

function brlSafe(n) {
  if (!isFinite(n) || n === 0) return "0,00";
  return brl(n);
}

// Simulated comissões tab (display only — placeholder for the second sub-tab)
function ComissoesTab({ pedido }) {
  const VENDEDORES = getVendedoresOptions();
  return (
    <div style={{ display: "flex", flexDirection: "column", gap: 12 }}>
      <div className="field-grid-3">
        <FSelect label="Vendedor" value={pedido.vendedor || ""} onChange={() => {}} options={VENDEDORES} />
        <FText label="% Comissão" value={pedido.comissaoPct ?? "4"} onChange={() => {}} suffix="%" />
        <FText label="Base de cálculo" value={pedido.comissaoBase || "Sobre venda líquida"} onChange={() => {}} />
      </div>
      <div className="pedido-items-empty">
        <div style={{ fontSize: 12.5 }}>O pagamento das comissões é registrado no módulo Financeiro quando o pedido for marcado como <b>Atendido</b>.</div>
      </div>
    </div>
  );
}

// Naive parser of common condições for parcelas display
function parseParcelas(cond, total, dataVenda) {
  if (!cond || !total) return [];
  const formaForCond = (c) => {
    if (/PIX/i.test(c))    return "PIX";
    if (/Cart/i.test(c))   return "Cartão";
    if (/Boleto/i.test(c)) return "Boleto";
    return "Dinheiro";
  };
  const conta = "Conta corrente · Itaú";
  // Match prazos: "30/45/60", "30/60/90", "30 dias", "à vista", "Cartão 3×"
  if (/\u00e0?\s*vista/i.test(cond) || /à vista/i.test(cond)) {
    return [{ venc: dataVenda || "—", valor: total, forma: formaForCond(cond), conta }];
  }
  const m = cond.match(/(\d+)(?:[\/x×](\d+))?(?:[\/x×](\d+))?/i);
  if (!m) return [];
  const dias = [m[1], m[2], m[3]].filter(Boolean).map(Number);
  const isCartao = /cart/i.test(cond);
  const nParc = isCartao ? dias[0] : dias.length;
  const parcArr = [];
  const each = total / nParc;
  for (let i = 0; i < nParc; i++) {
    const offsetDias = isCartao ? (i + 1) * 30 : dias[i];
    parcArr.push({ venc: addDias(dataVenda, offsetDias), valor: each, forma: formaForCond(cond), conta });
  }
  return parcArr;
}
function addDias(dataStr, dias) {
  if (!dataStr) return `+${dias}d`;
  const m = dataStr.match(/^(\d{2})\/(\d{2})\/(\d{4})$/);
  if (!m) return `+${dias}d`;
  const d = new Date(+m[3], +m[2] - 1, +m[1]);
  d.setDate(d.getDate() + dias);
  return `${String(d.getDate()).padStart(2,"0")}/${String(d.getMonth()+1).padStart(2,"0")}/${d.getFullYear()}`;
}

// ============================================================
// Error Boundary — evita tela preta em erros de render
// ============================================================
class PedidoFormBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false, errorMsg: "" };
  }
  static getDerivedStateFromError(error) {
    return { hasError: true, errorMsg: error && error.message ? error.message : String(error) };
  }
  componentDidCatch(error, info) {
    console.error("[PedidoForm] Erro de render:", error, info && info.componentStack);
  }
  render() {
    if (this.state.hasError) {
      return (
        <div className="canvas" style={{ display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "center", minHeight: 420, gap: 18 }}>
          <div style={{ width: 52, height: 52, borderRadius: 14, background: "rgba(239,68,68,0.1)", display: "flex", alignItems: "center", justifyContent: "center" }}>
            <Icon name="alert-triangle" size={24} style={{ color: "var(--tm-danger)" }} />
          </div>
          <div style={{ textAlign: "center", maxWidth: 420 }}>
            <div style={{ fontSize: 17, fontWeight: 600, fontFamily: "var(--tm-font-display)" }}>Erro ao exibir o pedido</div>
            <div className="muted" style={{ fontSize: 13, marginTop: 8, lineHeight: 1.6 }}>
              Ocorreu um erro inesperado. Seu rascunho foi preservado.
            </div>
          </div>
          <div style={{ display: "flex", gap: 10, marginTop: 4 }}>
            <Button variant="primary" icon="refresh-cw" onClick={() => this.setState({ hasError: false })}>Tentar novamente</Button>
            <Button variant="ghost" icon="arrow-left" onClick={this.props.onCancel}>Voltar aos pedidos</Button>
          </div>
        </div>
      );
    }
    return this.props.children;
  }
}

// ============================================================
// Shared list-state hook
// ============================================================
function usePedListState(seed) {
  const [rows, setRows] = usePedState(seed);
  const [edit, setEdit] = usePedState(null);

  const open  = (mode, idx, blank) => setEdit({ mode, idx, draft: { ...(idx != null ? rows[idx] : blank) } });
  const close = () => setEdit(null);
  const save  = () => {
    if (edit.mode === "new") setRows([{ ...edit.draft }, ...rows]);
    else setRows(rows.map((r, i) => i === edit.idx ? edit.draft : r));
    setEdit(null);
  };
  const remove = (idx) => {
    if (!confirm(`Excluir pedido ${rows[idx].num}?`)) return;
    setRows(rows.filter((_, i) => i !== idx));
    if (edit && edit.idx === idx) setEdit(null);
  };
  // Usa forma funcional do setEdit para evitar stale closure
  const set = (k, v) => setEdit(prev => prev
    ? { ...prev, draft: { ...prev.draft, [k]: v } }
    : prev
  );

  return { rows, edit, open, close, save, remove, set };
}

const blankPedido = () => ({
  num: gerarNumPedido(),
  cli: "", canal: "", vendedor: "", loja: "Matriz · SP", unidade: "Cosméticos B2B", listaPreco: "",
  items: [{ sku: "", desc: "", un: "UN", qty: 1, precoLista: 0, descPct: 0 }],
  descontoExtra: 0, prazoEntrega: 5, outrasDespesas: 0,
  dataVenda: hoje(), dataSaida: "", dataPrevista: "", pedidoCompra: "",
  condPag: "PIX à vista", categoria: "Vendas B2B",
  transp: { nome: "", fretePorConta: "0", qtd: 0, pesoBruto: 0, valor: 0, logistica: "", enderecoDiferente: false },
  obs: "", obsInternas: "",
  status: "Em andamento", total: 0, pgto: "", data: hojeHora(),
  afetaEstoque: true,
});
function hoje() {
  const d = new Date();
  return `${String(d.getDate()).padStart(2,"0")}/${String(d.getMonth()+1).padStart(2,"0")}/${d.getFullYear()}`;
}
function hojeHora() {
  const d = new Date();
  return `${hoje()} · ${String(d.getHours()).padStart(2,"0")}:${String(d.getMinutes()).padStart(2,"0")}`;
}

// ============================================================
// LIST view (shared by Abertos / Faturados / Cancelados)
// ============================================================
function PedidosLista({ filter, title, sub, onNav }) {
  const s = usePedidosList(PEDIDOS_SEED);
  const [previewPed, setPreviewPed] = usePedState(null);

  // Contagem de itens por pedido (para a coluna "Itens" da lista)
  const [itensPorPedido, setItensPorPedido] = usePedState({});
  const reloadContagens = () => {
    if (!window.tmSupabase) return;
    window.tmSupabase.from("pedido_itens").select("pedido_id").then(({ data }) => {
      const map = {};
      (data || []).forEach(r => { map[r.pedido_id] = (map[r.pedido_id] || 0) + 1; });
      setItensPorPedido(map);
    });
  };
  React.useEffect(() => { reloadContagens(); }, []);

  // ── 3-dot actions menu ──────────────────────────────────────
  const [menuOpen, setMenuOpen] = usePedState(null); // pedido.id of open menu
  const [menuUp, setMenuUp] = usePedState(false); // true = open upward
  const menuRef = React.useRef(null);
  React.useEffect(() => {
    if (!menuOpen) return;
    const close = (e) => { if (menuRef.current && !menuRef.current.contains(e.target)) setMenuOpen(null); };
    document.addEventListener('mousedown', close);
    return () => document.removeEventListener('mousedown', close);
  }, [menuOpen]);
  // Auto-position: detect if menu overflows viewport and flip upward
  React.useEffect(() => {
    if (!menuOpen || !menuRef.current) return;
    const dropdown = menuRef.current.querySelector('[data-ctx-menu]');
    if (!dropdown) return;
    const rect = dropdown.getBoundingClientRect();
    if (rect.bottom > window.innerHeight - 10) {
      setMenuUp(true);
    } else {
      setMenuUp(false);
    }
  }, [menuOpen]);

  // ── Faturar pedido ──────────────────────────────────────────
  const [faturando, setFaturando] = usePedState(null); // id do pedido sendo faturado

  // ── Filtros e busca da toolbar ──────────────────────────────
  const [searchQ, setSearchQ] = usePedState('');
  const [fStatus, setFStatus] = usePedState('');
  const [fCanal, setFCanal]   = usePedState('');
  const [fPgto, setFPgto]     = usePedState('');
  const [fPeriodo, setFPeriodo] = usePedState('');

  // ── Paginação (must be before any early return to preserve hooks order) ──
  const PER_PAGE = 15;
  const [page, setPage] = usePedState(1);
  React.useEffect(() => { setPage(1); }, [searchQ, fStatus, fCanal, fPgto, fPeriodo]);
  const handleFaturar = async (pedido) => {
    if (!window.tmSupabase || !pedido.id) return;
    if (!confirm(`Faturar pedido #${pedido.num} de ${pedido.cli}?\n\nIsso irá criar as entradas em Contas a Receber.`)) return;
    setFaturando(pedido.id);
    try {
      const { error } = await window.tmSupabase
        .from('pedidos').update({ status: 'Atendido' }).eq('id', pedido.id);
      if (error) throw error;
      // Criar parcelas no contas_receber
      const parcelas = pedido.parcelas || parseParcelas(pedido.condPag, pedido.total, pedido.dataVenda);
      if (parcelas.length > 0) {
        const toIso = (br) => { const m = String(br||'').match(/^(\d{2})\/(\d{2})\/(\d{4})$/); return m ? `${m[3]}-${m[2]}-${m[1]}` : null; };
        const rows = parcelas.map((par, i) => ({
          referencia:      `${pedido.num}/${i + 1}`,
          cliente_nome:    pedido.cli,
          pedido_ref:      pedido.num,
          pedido_id:       pedido.id,
          vencimento:      toIso(par.venc),
          parcela:         i + 1,
          valor:           typeof par.valor === 'number' ? par.valor : parseFloat(par.valor) || 0,
          valor_recebido:  0,
          status:          'Em aberto',
          forma_pagamento: par.forma || 'Dinheiro',
          conta_bancaria:  par.conta || null,
        }));
        const { error: crErr } = await window.tmSupabase.from('contas_receber').insert(rows);
        if (crErr) console.warn('Erro contas_receber:', crErr);
      }
      s.reload();
    } catch(e) {
      alert('Erro ao faturar: ' + (e.message || String(e)));
    } finally {
      setFaturando(null);
    }
  };

  const handleCancelarPedido = async (pedido) => {
    if (!window.tmSupabase || !pedido.id) return;
    if (!confirm(`Cancelar pedido #${pedido.num}?`)) return;
    await window.tmSupabase.from('pedidos').update({ status: 'Cancelado' }).eq('id', pedido.id);
    s.reload();
  };

  // ── Alterar status do pedido ──
  const handleAlterarStatus = async (pedido, novoStatus) => {
    if (!window.tmSupabase || !pedido.id) return;
    if (!confirm(`Alterar pedido #${pedido.num} para "${novoStatus}"?`)) return;
    await window.tmSupabase.from('pedidos').update({ status: novoStatus }).eq('id', pedido.id);
    s.reload();
  };

  // ── Clonar pedido ──
  const handleClonar = async (pedido) => {
    if (!window.tmSupabase || !pedido.id) return;
    const novoNum = gerarNumPedido();
    const clone = {
      numero: novoNum,
      cliente_nome: pedido.cli || pedido.cliente_nome,
      cliente_doc: pedido.cliId || pedido.cliente_doc,
      vendedor: pedido.vendedor,
      canal: pedido.canal,
      tabela_preco: pedido.tabelaPreco || pedido.tabela_preco,
      cond_pagamento: pedido.condPag || pedido.cond_pagamento,
      forma_pagamento: pedido.pgto || pedido.forma_pagamento,
      status: 'Em andamento',
      observacoes: pedido.obs || pedido.observacoes,
      observacoes_internas: pedido.obsInternas || pedido.observacoes_internas,
      transportador: pedido.transp || pedido.transportador || {},
      total: pedido.total,
      data_venda: new Date().toISOString().slice(0, 10),
    };
    const { data: novo, error } = await window.tmSupabase.from('pedidos').insert(clone).select().single();
    if (error) { alert('Erro ao clonar: ' + error.message); return; }
    // Clonar itens
    if (novo) {
      const itens = await window.tmDb.loadPedidoItens(pedido.id);
      if (itens.length > 0) {
        const rows = itens.map(it => ({
          pedido_id: novo.id,
          produto_id: it.produtoId || it.produto_id || null,
          sku: it.sku, descricao: it.desc || it.descricao,
          unidade: it.un || it.unidade || 'UN',
          quantidade: parseFloat(it.qty || it.quantidade) || 0,
          preco_lista: parseFloat(it.precoLista || it.preco_lista) || 0,
          desconto_pct: parseFloat(it.descPct || it.desconto_pct) || 0,
        }));
        await window.tmSupabase.from('pedido_itens').insert(rows);
      }
    }
    alert(`Pedido clonado com sucesso! Novo pedido: #${novoNum}`);
    s.reload();
  };

  // ── Enviar por e-mail ──
  const handleEnviarEmail = async (pedido) => {
    let email = '';
    if (pedido.cli && window.tmSupabase) {
      const [c, sal, d] = await Promise.all([
        window.tmSupabase.from('clientes').select('email').eq('nome', pedido.cli).maybeSingle(),
        window.tmSupabase.from('saloes').select('email').eq('nome', pedido.cli).maybeSingle(),
        window.tmSupabase.from('distribuidores').select('email').eq('nome', pedido.cli).maybeSingle(),
      ]);
      email = c.data?.email || sal.data?.email || d.data?.email || '';
    }
    if (!email) email = prompt('E-mail do destinatário:') || '';
    if (!email) return;
    const subject = encodeURIComponent(`Pedido #${pedido.num} — TopMix Profissional`);
    const body = encodeURIComponent(`Olá ${pedido.cli},\n\nSegue o pedido #${pedido.num} no valor de R$ ${brl(pedido.total)}.\n\nAtenciosamente,\nTopMix Profissional`);
    window.open(`mailto:${email}?subject=${subject}&body=${body}`, '_blank');
  };

  // ── Enviar por WhatsApp ──
  const handleEnviarWhatsApp = async (pedido) => {
    let fone = '';
    if (pedido.cli && window.tmSupabase) {
      const [c, sal, d] = await Promise.all([
        window.tmSupabase.from('clientes').select('whats,celular').eq('nome', pedido.cli).maybeSingle(),
        window.tmSupabase.from('saloes').select('celular,fone').eq('nome', pedido.cli).maybeSingle(),
        window.tmSupabase.from('distribuidores').select('celular,fone').eq('nome', pedido.cli).maybeSingle(),
      ]);
      fone = c.data?.whats || c.data?.celular || sal.data?.celular || sal.data?.fone || d.data?.celular || d.data?.fone || '';
    }
    const num = fone.replace(/\D/g, '');
    const phone = num.startsWith('55') ? num : '55' + num;
    const msg = encodeURIComponent(`Olá ${pedido.cli}! Segue seu pedido #${pedido.num} no valor de R$ ${brl(pedido.total)}. Obrigado pela preferência! — TopMix Profissional`);
    if (num) {
      window.open(`https://wa.me/${phone}?text=${msg}`, '_blank');
    } else {
      const manual = prompt('Número de WhatsApp (com DDD):');
      if (manual) {
        const m = manual.replace(/\D/g, '');
        window.open(`https://wa.me/55${m}?text=${msg}`, '_blank');
      }
    }
  };

  // ── Gerar nota fiscal (navega para NF/emissão) ──
  const handleGerarNF = (pedido) => {
    if (onNav) onNav('nf/emissao');
  };

  // ── Helper: fetch NFe.io IDs for a pedido's NF ──
  const getNfDownloadIds = async (pedido) => {
    if (!pedido.notaFiscalId || !window.tmSupabase) return null;
    const { data: nf } = await window.tmSupabase.from('notas_fiscais')
      .select('nfeio_id, numero, serie, status, empresa_emissora_id').eq('id', pedido.notaFiscalId).single();
    if (!nf || !nf.nfeio_id) return null;
    const { data: emp } = await window.tmSupabase.from('empresas_emissoras')
      .select('nfeio_company_id').eq('id', nf.empresa_emissora_id).single();
    if (!emp?.nfeio_company_id) return null;
    return { companyId: emp.nfeio_company_id, invoiceId: nf.nfeio_id, numero: nf.numero };
  };

  // ── Visualizar DANFE do pedido faturado ──
  const [danfePreviewUrl, setDanfePreviewUrl] = usePedState(null);
  const [danfePreviewLoading, setDanfePreviewLoading] = usePedState(false);
  const [danfePreviewNum, setDanfePreviewNum] = usePedState('');

  const handleVisualizarDanfe = async (pedido) => {
    if (!pedido.notaFiscalId) { alert('Este pedido não tem nota fiscal vinculada.'); return; }
    setDanfePreviewLoading(true);
    setDanfePreviewNum(pedido.num || '');
    try {
      const ids = await getNfDownloadIds(pedido);
      if (!ids) { alert('NF-e sem dados de integração NFe.io para visualização.'); setDanfePreviewLoading(false); setDanfePreviewNum(''); return; }
      if (window.nfeApi && window.nfeApi.previewDanfe) {
        const url = await window.nfeApi.previewDanfe(ids.companyId, ids.invoiceId);
        setDanfePreviewUrl(url);
      }
    } catch (err) {
      alert('Erro ao carregar DANFE: ' + (err.message || err));
      setDanfePreviewNum('');
    } finally {
      setDanfePreviewLoading(false);
    }
  };

  const closeDanfePreview = () => {
    if (danfePreviewUrl) URL.revokeObjectURL(danfePreviewUrl);
    setDanfePreviewUrl(null);
    setDanfePreviewNum('');
  };

  // ── Imprimir DANFE do pedido faturado ──
  const handleImprimirDanfe = async (pedido) => {
    if (!pedido.notaFiscalId) { alert('Este pedido não tem nota fiscal vinculada.'); return; }
    try {
      const ids = await getNfDownloadIds(pedido);
      if (!ids) { alert('NF-e sem dados de integração NFe.io para download.'); return; }
      if (window.nfeApi && window.nfeApi.downloadDanfe) {
        await window.nfeApi.downloadDanfe(ids.companyId, ids.invoiceId, 'danfe-' + (ids.numero || '') + '.pdf', true);
      }
    } catch (err) { alert('Erro ao imprimir DANFE: ' + (err.message || err)); }
  };

  // ── Download DANFE PDF do pedido faturado ──
  const handleDownloadDanfe = async (pedido) => {
    if (!pedido.notaFiscalId) { alert('Este pedido não tem nota fiscal vinculada.'); return; }
    try {
      const ids = await getNfDownloadIds(pedido);
      if (!ids) { alert('NF-e sem dados de integração NFe.io para download.'); return; }
      if (window.nfeApi && window.nfeApi.downloadDanfe) {
        await window.nfeApi.downloadDanfe(ids.companyId, ids.invoiceId, 'danfe-' + (ids.numero || '') + '.pdf', false);
      }
    } catch (err) { alert('Erro ao baixar DANFE: ' + (err.message || err)); }
  };

  // ── Download XML do pedido faturado ──
  const handleDownloadXml = async (pedido) => {
    if (!pedido.notaFiscalId) { alert('Este pedido não tem nota fiscal vinculada.'); return; }
    try {
      const ids = await getNfDownloadIds(pedido);
      if (!ids) { alert('NF-e sem dados de integração NFe.io para download.'); return; }
      if (window.nfeApi && window.nfeApi.downloadXml) {
        await window.nfeApi.downloadXml(ids.companyId, ids.invoiceId, 'nfe-' + (ids.numero || '') + '.xml');
      }
    } catch (err) { alert('Erro ao baixar XML: ' + (err.message || err)); }
  };

  // Carrega os itens do pedido em edição para dentro do rascunho
  React.useEffect(() => {
    const ed = s.edit;
    if (!ed || ed.mode !== "edit" || !ed.draft.id || ed.draft._itensCarregados) return;
    let cancel = false;
    window.tmDb.loadPedidoItens(ed.draft.id).then(its => {
      if (cancel) return;
      s.set({
        items: its.length ? its : [{ sku: "", desc: "", un: "UN", qty: 1, precoLista: 0, descPct: 0 }],
        _itensCarregados: true,
      });
    });
    return () => { cancel = true; };
  // eslint-disable-next-line
  }, [s.edit && s.edit.draft && s.edit.draft.id, s.edit && s.edit.draft && s.edit.draft._itensCarregados]);

  const salvarPedidoLista = async () => {
    const r = await window.tmDb.salvarPedido(s.edit.draft);
    if (r && r.error) { alert("Erro ao salvar o pedido: " + (r.error.message || r.error)); return; }
    await s.reload();
    reloadContagens();
    s.close();
  };

  if (s.edit) {
    return (
      <PedidoFormBoundary onCancel={s.close}>
        <PedidoForm
          state={s.edit}
          set={s.set}
          onCancel={s.close}
          onSave={salvarPedidoLista}
          onDelete={s.edit.mode === "new" ? null : () => s.remove(s.edit.idx)}
          onPreview={() => setPreviewPed(s.edit.draft)}
        />
        {previewPed && <PedidoPreviewModal pedido={previewPed} onClose={() => setPreviewPed(null)} />}
      </PedidoFormBoundary>
    );
  }

  // ── Opções de filtro construídas a partir dos dados reais ──
  const baseRows = filter ? s.rows.filter(p => p.status === filter) : s.rows;

  const statusOpts = [...new Set(s.rows.map(p => p.status).filter(Boolean))].sort();
  const canalOpts  = [...new Set(s.rows.map(p => p.canal).filter(Boolean))].sort();
  const pgtoOpts   = [...new Set(s.rows.map(p => (p.pgto || p.condPag || '')).filter(Boolean))].sort();

  const toolbarFilterOpts = [];
  if (!filter) toolbarFilterOpts.push({ key: 'status', label: 'Todos os status', options: statusOpts });
  toolbarFilterOpts.push({ key: 'canal',   label: 'Canal',               options: canalOpts });
  toolbarFilterOpts.push({ key: 'periodo', label: 'Período',             options: ['Hoje', 'Esta semana', 'Este mês', 'Últimos 3 meses', 'Este ano'] });
  toolbarFilterOpts.push({ key: 'pgto',    label: 'Forma de pagamento',  options: pgtoOpts });

  const toolbarFilterValues = { status: fStatus, canal: fCanal, periodo: fPeriodo, pgto: fPgto };
  const handleToolbarFilter = (key, val) => {
    if (key === 'status')  setFStatus(val);
    if (key === 'canal')   setFCanal(val);
    if (key === 'periodo') setFPeriodo(val);
    if (key === 'pgto')    setFPgto(val);
  };

  let filtered = baseRows;
  if (fStatus)  filtered = filtered.filter(p => p.status === fStatus);
  if (fCanal)   filtered = filtered.filter(p => p.canal === fCanal);
  if (fPgto)    filtered = filtered.filter(p => (p.pgto || p.condPag || '') === fPgto);
  if (fPeriodo) {
    const now = new Date();
    filtered = filtered.filter(p => {
      const m = String(p.dataVenda || p.data || '').match(/(\d{2})\/(\d{2})\/(\d{4})/);
      if (!m) return true;
      const dt = new Date(+m[3], +m[2] - 1, +m[1]);
      if (fPeriodo === 'Hoje')             return dt.toDateString() === now.toDateString();
      if (fPeriodo === 'Esta semana')      { const d = new Date(now); d.setDate(d.getDate() - d.getDay()); d.setHours(0,0,0,0); return dt >= d; }
      if (fPeriodo === 'Este mês')         return dt.getMonth() === now.getMonth() && dt.getFullYear() === now.getFullYear();
      if (fPeriodo === 'Últimos 3 meses')  { const d = new Date(now); d.setMonth(d.getMonth() - 3); return dt >= d; }
      if (fPeriodo === 'Este ano')         return dt.getFullYear() === now.getFullYear();
      return true;
    });
  }
  if (searchQ) {
    const q = searchQ.toLowerCase();
    filtered = filtered.filter(p =>
      String(p.num     || '').toLowerCase().includes(q) ||
      String(p.cli     || '').toLowerCase().includes(q) ||
      String(p.canal   || '').toLowerCase().includes(q) ||
      String(p.pgto    || p.condPag || '').toLowerCase().includes(q) ||
      String(p.status  || '').toLowerCase().includes(q) ||
      String(p.vendedor|| '').toLowerCase().includes(q)
    );
  }

  const indexFor = (row) => s.rows.findIndex(r => r.num === row.num);

  // KPIs computados a partir dos dados reais
  const emAberto   = s.rows.filter(p => p.status === "Em andamento" || p.status === "Verificado");
  const faturados  = s.rows.filter(p => p.status === "Atendido");
  const cancelados = s.rows.filter(p => p.status === "Cancelado");
  const valorAberto = emAberto.reduce((a, p) => a + (Number(p.total) || 0), 0);
  const valorFat    = faturados.reduce((a, p) => a + (Number(p.total) || 0), 0);
  const taxaCancel  = s.rows.length > 0
    ? `${(cancelados.length / s.rows.length * 100).toFixed(1)}%`
    : "—";

  // Mensagem do empty state de acordo com o filtro ativo
  const hasActiveFilter = searchQ || fStatus || fCanal || fPgto || fPeriodo;
  const emptyMsg = hasActiveFilter ? "Nenhum pedido corresponde aos filtros aplicados."
    : filter === "Em andamento" ? "Nenhum pedido em aberto no momento."
    : filter === "Atendido"  ? "Nenhum pedido faturado ainda."
    : filter === "Cancelado" ? "Nenhum pedido cancelado."
    : "Nenhum pedido cadastrado ainda.";

  return (
    <div className="canvas">
      <PageHead title={title} sub={sub}
        right={<><Button variant="secondary" icon="download" size="sm">Exportar</Button>
                  <Button variant="primary" icon="plus" size="sm" onClick={() => s.open("new", null, blankPedido())}>Criar pedido</Button></>}/>

      <div className="grid-4" style={{ marginBottom: 16 }}>
        <KpiMini lbl="Total de pedidos" v={String(s.rows.length)} sub={s.rows.length === 0 ? "Nenhum pedido ainda" : `${s.rows.length} pedido${s.rows.length !== 1 ? 's' : ''} cadastrado${s.rows.length !== 1 ? 's' : ''}`} />
        <KpiMini lbl="Em aberto"  v={String(emAberto.length)}  sub={emAberto.length > 0  ? `R$ ${brl(valorAberto)} a faturar` : "Nenhum em aberto"} />
        <KpiMini lbl="Faturados"  v={String(faturados.length)} sub={faturados.length > 0  ? `R$ ${brl(valorFat)}`              : "Nenhum faturado"} />
        <KpiMini lbl="Cancelados" v={String(cancelados.length)} sub={`taxa: ${taxaCancel}`} />
      </div>

      <Card>
        {s.rows.length === 0 ? (
          <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', padding: '64px 20px', gap: 14, textAlign: 'center' }}>
            <div style={{ width: 52, height: 52, borderRadius: 14, background: 'var(--tm-bg-3)', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
              <Icon name="package" size={24} style={{ color: 'var(--tm-fg-4)' }} />
            </div>
            <div>
              <div style={{ fontSize: 15, fontWeight: 600, color: 'var(--tm-fg-1)' }}>Nenhum pedido encontrado</div>
              <div className="muted" style={{ fontSize: 13, marginTop: 5, lineHeight: 1.6 }}>{emptyMsg}</div>
            </div>
            <Button variant="primary" icon="plus" size="sm" onClick={() => s.open("new", null, blankPedido())}>Criar pedido</Button>
          </div>
        ) : (
          <>
            <Toolbar
              search="Buscar pedido, cliente, NF…"
              filterOpts={toolbarFilterOpts}
              filterValues={toolbarFilterValues}
              onFilter={handleToolbarFilter}
              onSearch={setSearchQ}
            />
            {filtered.length === 0 ? (
              <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', padding: '48px 20px', gap: 10, textAlign: 'center' }}>
                <Icon name="search" size={22} style={{ color: 'var(--tm-fg-4)' }} />
                <div className="muted" style={{ fontSize: 13 }}>{emptyMsg}</div>
              </div>
            ) : (
            <>
            <table className="tbl">
              <thead><tr><th>Nº</th><th>Cliente</th><th>Canal</th><th className="num right">Itens</th><th className="num right">Total</th><th>Pagamento</th><th>Status</th><th>Data da venda</th><th></th></tr></thead>
              <tbody>
                {filtered.slice((page - 1) * PER_PAGE, page * PER_PAGE).map((p, i) => {
                  const realIdx = indexFor(p);
                  return (
                    <tr key={p.num} className="clickable" onClick={() => s.open("edit", realIdx)}>
                      <td><span className="ref-mono gold">#{p.num}</span></td>
                      <td><div style={{ fontWeight: 500 }}>{p.cli}</div></td>
                      <td><span className="muted" style={{ fontSize: 12 }}>{p.canal}</span></td>
                      <td className="num right">{itensPorPedido[p.id] || 0}</td>
                      <td className="num right">R$ {brl(p.total)}</td>
                      <td><span className="ch-chip">{p.pgto}</span></td>
                      <td><Badge tone={p.status === "Atendido" ? "success" : p.status === "Verificado" ? "info" : p.status === "Em andamento" ? "warning" : "danger"}>{p.status}</Badge></td>
                      <td className="muted" style={{ fontSize: 11.5 }}>{p.dataVenda || p.data}</td>
                      <td>
                        <div style={{ position: 'relative' }} onClick={(e) => e.stopPropagation()} ref={menuOpen === p.id ? menuRef : undefined}>
                          <button className="icon-btn" title="Ações"
                            style={{ color: menuOpen === p.id ? 'var(--tm-brand-champagne)' : undefined }}
                            onClick={() => setMenuOpen(menuOpen === p.id ? null : p.id)}>
                            <Icon name="more-vertical" size={16} />
                          </button>
                          {menuOpen === p.id && (
                            <div data-ctx-menu style={{
                              position: 'absolute', right: 0,
                              ...(menuUp ? { bottom: '100%' } : { top: '100%' }),
                              zIndex: 100,
                              background: 'var(--tm-bg-2, #1a1a1a)', border: '1px solid var(--tm-line-1, #333)',
                              borderRadius: 8, boxShadow: '0 8px 32px rgba(0,0,0,0.5)',
                              minWidth: 230, padding: '6px 0', fontSize: 13,
                              maxHeight: '70vh', overflowY: 'auto',
                            }}>
                              {/* ── Nota Fiscal ── */}
                              {p.status === 'Em andamento' && (
                                <button className="ctx-menu-item" onClick={() => { setMenuOpen(null); handleGerarNF(p); }}>
                                  <span className="ctx-icon" style={{ background: '#D9655E' }}>N</span> Gerar nota fiscal
                                </button>
                              )}
                              {p.status === 'Atendido' && !p.notaFiscalId && (
                                <button className="ctx-menu-item" onClick={() => { setMenuOpen(null); handleGerarNF(p); }}>
                                  <span className="ctx-icon" style={{ background: '#D9655E' }}>N</span> Gerar nota fiscal
                                </button>
                              )}
                              {p.status === 'Atendido' && p.notaFiscalId && (
                                <>
                                  <button className="ctx-menu-item" onClick={() => { setMenuOpen(null); handleVisualizarDanfe(p); }}>
                                    <Icon name="eye" size={14} style={{ marginRight: 10, opacity: 0.5 }} /> Visualizar DANFE
                                  </button>
                                  <button className="ctx-menu-item" onClick={() => { setMenuOpen(null); handleImprimirDanfe(p); }}>
                                    <Icon name="printer" size={14} style={{ marginRight: 10, opacity: 0.5 }} /> Imprimir DANFE
                                  </button>
                                  <button className="ctx-menu-item" onClick={() => { setMenuOpen(null); handleDownloadDanfe(p); }}>
                                    <Icon name="download" size={14} style={{ marginRight: 10, opacity: 0.5 }} /> Download DANFE
                                  </button>
                                  <button className="ctx-menu-item" onClick={() => { setMenuOpen(null); handleDownloadXml(p); }}>
                                    <Icon name="file-text" size={14} style={{ marginRight: 10, opacity: 0.5 }} /> Download XML
                                  </button>
                                  <div className="ctx-menu-sep" />
                                </>
                              )}

                              {/* ── Lançamentos ── */}
                              {p.status === 'Em andamento' && (
                                <button className="ctx-menu-item" onClick={() => { setMenuOpen(null); handleFaturar(p); }}>
                                  <span className="ctx-icon" style={{ background: '#5BB17A' }}>C</span> Lançar contas
                                </button>
                              )}

                              {/* ── Duplicar ── */}
                              <button className="ctx-menu-item" onClick={() => { setMenuOpen(null); handleClonar(p); }}>
                                <Icon name="copy" size={14} style={{ marginRight: 10, opacity: 0.5 }} /> Clonar venda
                              </button>

                              <div className="ctx-menu-sep" />

                              {/* ── Impressão ── */}
                              <button className="ctx-menu-item" onClick={() => { setMenuOpen(null); setPreviewPed(p); }}>
                                <Icon name="printer" size={14} style={{ marginRight: 10, opacity: 0.5 }} /> Imprimir
                              </button>
                              <button className="ctx-menu-item" onClick={() => { setMenuOpen(null); setPreviewPed(p); }}>
                                <Icon name="printer" size={14} style={{ marginRight: 10, opacity: 0.5 }} /> Imprimir c/ detalhes
                              </button>
                              <button className="ctx-menu-item" onClick={() => { setMenuOpen(null); setPreviewPed(p); }}>
                                <Icon name="tag" size={14} style={{ marginRight: 10, opacity: 0.5 }} /> Imprimir etiqueta de envio
                              </button>

                              <div className="ctx-menu-sep" />

                              {/* ── Comunicação ── */}
                              <button className="ctx-menu-item" onClick={() => { setMenuOpen(null); handleEnviarEmail(p); }}>
                                <Icon name="send" size={14} style={{ marginRight: 10, opacity: 0.5 }} /> Enviar por e-mail
                              </button>
                              <button className="ctx-menu-item" onClick={() => { setMenuOpen(null); handleEnviarWhatsApp(p); }}>
                                <Icon name="message-circle" size={14} style={{ marginRight: 10, opacity: 0.5 }} /> Enviar por WhatsApp
                              </button>

                              <div className="ctx-menu-sep" />

                              {/* ── Alterar status ── */}
                              {p.status !== 'Atendido' && (
                                <button className="ctx-menu-item" onClick={() => { setMenuOpen(null); handleFaturar(p); }}>
                                  <span className="ctx-status-dot" style={{ background: '#5BB17A' }} /> Atendido
                                </button>
                              )}
                              {p.status !== 'Cancelado' && (
                                <button className="ctx-menu-item" onClick={() => { setMenuOpen(null); handleCancelarPedido(p); }}>
                                  <span className="ctx-status-dot" style={{ background: '#D9655E' }} /> Cancelado
                                </button>
                              )}
                              {p.status !== 'Em andamento' && (
                                <button className="ctx-menu-item" onClick={() => { setMenuOpen(null); handleAlterarStatus(p, 'Em andamento'); }}>
                                  <span className="ctx-status-dot" style={{ background: '#D4A04A' }} /> Em andamento
                                </button>
                              )}

                              <div className="ctx-menu-sep" />

                              {/* ── Editar / Excluir ── */}
                              <button className="ctx-menu-item" onClick={() => { setMenuOpen(null); s.open("edit", realIdx); }}>
                                <Icon name="pencil" size={14} style={{ marginRight: 10, opacity: 0.5 }} /> Editar
                              </button>
                              <button className="ctx-menu-item ctx-danger" onClick={() => { setMenuOpen(null); s.remove(realIdx); }}>
                                <Icon name="trash-2" size={14} style={{ marginRight: 10 }} /> Excluir
                              </button>
                            </div>
                          )}
                        </div>
                      </td>
                    </tr>
                  );
                })}
              </tbody>
            </table>
            <FooterPager total={filtered.length} perPage={PER_PAGE} page={page} onPage={setPage} />
            </>
            )}
          </>
        )}
      </Card>
      {/* DANFE Preview Modal */}
      {danfePreviewNum && (
        <div style={{ position: 'fixed', inset: 0, zIndex: 999, display: 'flex', flexDirection: 'column', alignItems: 'center', background: 'rgba(0,0,0,0.72)' }}
          onClick={(e) => { if (e.target === e.currentTarget) closeDanfePreview(); }}>
          <div style={{
            width: '100%', maxWidth: 900,
            display: 'flex', gap: 10, padding: '12px 20px',
            background: 'var(--tm-bg-1)', borderBottom: '1px solid var(--tm-line-1)',
            alignItems: 'center', flexShrink: 0,
          }}>
            <Icon name="file-text" size={16} style={{ color: 'var(--tm-brand-champagne)' }} />
            <span style={{ flex: 1, fontSize: 13.5, fontWeight: 600, color: 'var(--tm-fg-1)' }}>
              DANFE — Pedido #{danfePreviewNum}
            </span>
            <Button variant="ghost" size="sm" icon="x" onClick={closeDanfePreview}>Fechar</Button>
          </div>
          <div style={{ flex: 1, width: '100%', maxWidth: 900, overflow: 'hidden', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
            {danfePreviewLoading ? (
              <div style={{ color: 'var(--tm-fg-3)', fontSize: 14, display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 12 }}>
                <Icon name="loader" size={28} style={{ animation: 'spin 1s linear infinite' }} />
                <span>Carregando DANFE...</span>
              </div>
            ) : danfePreviewUrl ? (
              <iframe src={danfePreviewUrl} style={{ width: '100%', height: '100%', border: 'none', background: '#fff' }} title="DANFE Preview" />
            ) : (
              <div style={{ color: 'var(--tm-fg-3)', fontSize: 14 }}>Erro ao carregar DANFE</div>
            )}
          </div>
        </div>
      )}
      {previewPed && <PedidoPreviewModal pedido={previewPed} onClose={() => setPreviewPed(null)} />}
    </div>
  );
}

function PedidosAbertos({ onNav })    { return <PedidosLista filter="Em andamento" title="Pedidos em Aberto"   sub="Pedidos aguardando faturamento ou confirmação" onNav={onNav} />; }
function PedidosFaturados({ onNav })  { return <PedidosLista filter="Atendido"     title="Pedidos Faturados"   sub="Pedidos com NF-e emitida"                      onNav={onNav} />; }
function PedidosCancelados({ onNav }) { return <PedidosLista filter="Cancelado"    title="Pedidos Cancelados"  sub="Pedidos cancelados no período"                  onNav={onNav} />; }

// ============================================================
// "Criar pedido" route — opens a blank PedidoForm
// ============================================================
const DRAFT_KEY = "tm_pedido_rascunho";

function CriarPedido({ onNav }) {
  // Verifica se havia rascunho salvo (apenas na inicialização)
  const [rascunhoRecuperado, setRascunhoRecuperado] = usePedState(false);

  const [draft, setDraft] = usePedState(() => {
    // Recupera rascunho salvo automaticamente, se existir
    try {
      const saved = sessionStorage.getItem(DRAFT_KEY);
      if (saved) {
        const parsed = JSON.parse(saved);
        // Valida estrutura básica antes de usar
        if (parsed && typeof parsed === "object" && Array.isArray(parsed.items)) {
          // Marca rascunho como recuperado após a inicialização
          setTimeout(() => setRascunhoRecuperado(true), 0);
          return parsed;
        }
      }
    } catch (e) { /* ignora erro de parse */ }
    return blankPedido();
  });

  // Persiste o rascunho automaticamente a cada mudança
  React.useEffect(() => {
    try { sessionStorage.setItem(DRAFT_KEY, JSON.stringify(draft)); } catch (e) {}
  }, [draft]);

  // Usa forma funcional para evitar stale closure — essencial quando
  // múltiplos campos são atualizados em sequência rápida
  const set = React.useCallback((k, v) => {
    setDraft(prev => ({ ...prev, [k]: v }));
  }, []);

  const handleSave = React.useCallback(async () => {
    const r = await window.tmDb.salvarPedido(draft);
    if (r && r.error) { alert("Erro ao salvar o pedido: " + (r.error.message || r.error)); return; }
    try { sessionStorage.removeItem(DRAFT_KEY); } catch (e) {}
    onNav("pedidos/abertos");
  }, [draft, onNav]);

  const handleCancel = React.useCallback(() => {
    const temConteudo = draft.cli || (draft.items && draft.items.some(it => it.sku || it.desc));
    if (!temConteudo || confirm("Descartar rascunho deste pedido?")) {
      try { sessionStorage.removeItem(DRAFT_KEY); } catch (e) {}
      onNav("pedidos/abertos");
    }
  }, [draft, onNav]);

  const state = { mode: "new", idx: null, draft };
  return (
    <PedidoFormBoundary onCancel={handleCancel}>
      {rascunhoRecuperado && (
        <div style={{
          margin: "0 0 0 0",
          padding: "10px 20px",
          background: "rgba(201,163,107,0.08)",
          borderBottom: "1px solid rgba(201,163,107,0.2)",
          display: "flex", alignItems: "center", justifyContent: "space-between",
          fontSize: 13,
        }}>
          <div style={{ display: "flex", alignItems: "center", gap: 8 }}>
            <Icon name="rotate-ccw" size={14} style={{ color: "var(--tm-brand-champagne)" }} />
            <span style={{ color: "var(--tm-fg-1)" }}>
              <b>Rascunho recuperado</b> — seu pedido anterior foi restaurado automaticamente.
            </span>
          </div>
          <button
            style={{ fontSize: 12, color: "var(--tm-fg-3)", background: "none", border: "none", cursor: "pointer", padding: "2px 6px" }}
            onClick={() => setRascunhoRecuperado(false)}
          >×</button>
        </div>
      )}
      <PedidoForm
        state={state}
        set={set}
        onCancel={handleCancel}
        onSave={handleSave}
      />
    </PedidoFormBoundary>
  );
}

// ============================================================
// PEDIDO PREVIEW / IMPRESSÃO
// ============================================================
const BRAND = "#C9A36B";
const pThS = { padding: "5px 7px", border: "1px solid #ddd", fontWeight: "bold", fontSize: 10.5, background: "#f8f3ea", color: "#5a3e1b", textAlign: "left" };
const pTdS = { padding: "5px 7px", border: "1px solid #ddd", fontSize: 11, verticalAlign: "top" };
const FRETE_LBL = {
  "0": "Contratação do Frete por conta do Emitente (CIF)",
  "1": "Contratação do Frete por conta do Destinatário (FOB)",
  "2": "Contratação do Frete por conta de Terceiros",
  "9": "Sem frete",
};

function PedidoPreviewModal({ pedido, onClose }) {
  const [itens,      setItens]      = usePedState(null);
  const [loading,    setLoading]    = usePedState(true);
  const [cliData,    setCliData]    = usePedState(null);

  React.useEffect(() => {
    // Carrega itens
    const load = async () => {
      const draftItens = pedido.items && pedido.items.filter(it => it && (it.desc || it.sku));
      if (draftItens && draftItens.length > 0) {
        setItens(draftItens);
      } else if (pedido.id) {
        const its = await window.tmDb.loadPedidoItens(pedido.id);
        setItens(its.filter(it => it.desc || it.sku));
      } else {
        setItens([]);
      }
      // Busca dados do cliente por nome nas três tabelas
      if (pedido.cli && window.tmSupabase) {
        const nome = pedido.cli;
        const [c, s, d] = await Promise.all([
          window.tmSupabase.from('clientes').select('nome,cpf,whats,celular,geral_cidade,geral_uf').eq('nome', nome).maybeSingle(),
          window.tmSupabase.from('saloes').select('nome,cnpj,cpf,fone,celular,geral_cidade,geral_uf').eq('nome', nome).maybeSingle(),
          window.tmSupabase.from('distribuidores').select('nome,cnpj,cpf,fone,celular,geral_cidade,geral_uf').eq('nome', nome).maybeSingle(),
        ]);
        setCliData(c.data || s.data || d.data || null);
      }
      setLoading(false);
    };
    load();
  }, []);

  const empresa  = (window.tmEmpresas || [])[0] || {};
  const parcelas = pedido.parcelas || parseParcelas(pedido.condPag, pedido.total, pedido.dataVenda);
  const lista    = itens || [];

  const somaQtd    = lista.reduce((a, it) => a + (parseFloat(it.qty) || 0), 0);
  const totalProd  = lista.reduce((a, it) => {
    const p = parseFloat(it.precoLista) || 0;
    const d = parseFloat(it.descPct)   || 0;
    const q = parseFloat(it.qty)       || 0;
    return a + p * (1 - d / 100) * q;
  }, 0);
  const totalFinal = parseFloat(pedido.total) || totalProd;
  const desconto   = totalProd - totalFinal;

  const fmt = (n) => (parseFloat(n) || 0).toLocaleString("pt-BR", { minimumFractionDigits: 2, maximumFractionDigits: 2 });

  return ReactDOM.createPortal(
    <>
      <style dangerouslySetInnerHTML={{ __html: `
        @media print {
          @page       { size: A4 portrait; margin: 14mm 12mm 12mm 12mm; }
          @page :first { margin: 0; }
          * { -webkit-print-color-adjust: exact !important; print-color-adjust: exact !important; }
          body > *:not(#ped-print-overlay) { display: none !important; }
          #ped-print-overlay {
            position: static !important;
            overflow: visible !important;
            background: white !important;
            display: block !important;
            inset: auto !important;
            padding: 0 !important;
          }
          .ped-no-print { display: none !important; }
          .ped-sheet {
            position: static !important;
            width: 100% !important;
            margin: 0 !important;
            padding: 0 !important;
            box-shadow: none !important;
            min-height: 0 !important;
            max-height: none !important;
            overflow: visible !important;
            background: white !important;
          }
          .ped-sheet-accent {
            height: 5px !important;
            margin: 0 !important;
            width: 100vw !important;
          }
          .ped-sheet-inner {
            padding: 24px 12mm 0 !important;
          }
          html, body {
            background: white !important;
          }
          .ped-section-break { page-break-inside: avoid; }
          table { page-break-inside: auto; }
          tr { page-break-inside: avoid; page-break-after: auto; }
          thead { display: table-header-group; }
        }
      `}} />

      <div id="ped-print-overlay" style={{
        position: "fixed", inset: 0, zIndex: 99990,
        background: "rgba(0,0,0,0.72)",
        display: "flex", flexDirection: "column", alignItems: "center", overflowY: "auto",
      }} onClick={(e) => { if (e.target === e.currentTarget) onClose(); }}>

        {/* Toolbar */}
        <div className="ped-no-print" style={{
          position: "sticky", top: 0, zIndex: 99991,
          width: "100%", maxWidth: 880,
          display: "flex", gap: 10, padding: "12px 20px",
          background: "var(--tm-bg-1)", borderBottom: "1px solid var(--tm-line-1)",
          alignItems: "center",
        }}>
          <Icon name="file-text" size={16} style={{ color: "var(--tm-brand-champagne)" }} />
          <span style={{ flex: 1, fontSize: 13.5, fontWeight: 600, color: "var(--tm-fg-1)" }}>
            Pré-visualização — Pedido #{pedido.num}
          </span>
          <Button variant="primary" icon="printer" size="sm" onClick={() => window.print()}>
            Imprimir / Salvar PDF
          </Button>
          <Button variant="secondary" size="sm" onClick={onClose}>Fechar</Button>
        </div>

        {/* Folha A4 — 794px wide, grows vertically */}
        <div className="ped-sheet" style={{
          width: 794, background: "#fff", margin: "24px auto 48px",
          fontFamily: "'Arial', 'Helvetica Neue', sans-serif",
          fontSize: 11, color: "#111", lineHeight: 1.45,
          boxShadow: "0 6px 40px rgba(0,0,0,0.4)",
        }}>
          <div className="ped-sheet-accent" style={{ height: 5, background: BRAND }} />
          {loading ? (
            <div style={{ textAlign: "center", padding: 80, color: "#666", fontSize: 13 }}>Carregando…</div>
          ) : (<div className="ped-sheet-inner" style={{ padding: "32px 44px 36px" }}>

            {/* ── CABEÇALHO ── */}
            {(() => {
              const endEmp = [empresa.logradouro, empresa.numero, empresa.complemento].filter(Boolean).join(', ');
              const cidEmp = [empresa.bairro, empresa.cidade, empresa.uf].filter(Boolean).join(' · ');
              return (
                <table width="100%" style={{ marginBottom: 24, borderCollapse: "collapse" }}><tbody><tr>
                  <td style={{ width: "38%", verticalAlign: "middle" }}>
                    {empresa.logo_url
                      ? <img src={empresa.logo_url} alt="logo" style={{ maxHeight: 60, maxWidth: 160, objectFit: "contain" }} />
                      : <div style={{ fontSize: 17, fontWeight: "bold", color: "#222", letterSpacing: "0.02em" }}>
                          {empresa.nome_fantasia || empresa.razao_social || "TopMix Profissional"}
                        </div>}
                  </td>
                  <td style={{ textAlign: "right", fontSize: 10, color: "#444", verticalAlign: "top", lineHeight: 1.7 }}>
                    {(empresa.nome_fantasia || empresa.razao_social) && (
                      <div style={{ fontWeight: "bold", fontSize: 11 }}>{empresa.nome_fantasia || empresa.razao_social}</div>
                    )}
                    {empresa.razao_social && empresa.nome_fantasia && (
                      <div>{empresa.razao_social}</div>
                    )}
                    {empresa.cnpj     && <div>CNPJ: {empresa.cnpj}</div>}
                    {empresa.telefone && <div>Tel: {empresa.telefone}</div>}
                    {endEmp           && <div>{endEmp}</div>}
                    {cidEmp           && <div>{cidEmp}{empresa.cep ? ` · CEP ${empresa.cep}` : ""}</div>}
                  </td>
                </tr></tbody></table>
              );
            })()}

            {/* ── TÍTULO ── */}
            <div style={{ textAlign: "center", fontSize: 15, fontWeight: "bold", margin: "4px 0 20px", borderBottom: `3px solid ${BRAND}`, paddingBottom: 10, color: "#1a1a1a" }}>
              Pedido de Venda&nbsp;&nbsp;<span style={{ color: BRAND }}>{pedido.num}</span>
            </div>

            {/* ── CLIENTE + INFO ── */}
            <table width="100%" style={{ borderCollapse: "collapse", marginBottom: 20 }}><tbody><tr valign="top">
              <td style={{ width: "54%", padding: "10px 12px", border: "1px solid #ccc" }}>
                <div style={{ fontSize: 9, fontWeight: "bold", color: "#666", textTransform: "uppercase", letterSpacing: "0.06em", marginBottom: 5 }}>Cliente</div>
                <div style={{ fontWeight: "bold", fontSize: 12.5, marginBottom: 4 }}>{pedido.cli || "—"}</div>
                {(() => {
                  const doc  = cliData?.cnpj || cliData?.cpf || pedido.cliId;
                  const tel  = cliData?.fone || cliData?.celular || cliData?.whats;
                  const cid  = [cliData?.geral_cidade, cliData?.geral_uf].filter(Boolean).join(' · ');
                  return (
                    <div style={{ fontSize: 10.5, color: "#444", lineHeight: 1.7 }}>
                      {doc && <div>CPF/CNPJ: {doc}</div>}
                      {tel && <div>Tel: {tel}</div>}
                      {cid && <div>{cid}</div>}
                      {pedido.canal    && <div style={{ marginTop: 2 }}>Canal: {pedido.canal}</div>}
                      {pedido.vendedor && <div>Vendedor: {pedido.vendedor}</div>}
                    </div>
                  );
                })()}
              </td>
              <td style={{ width: "46%" }}>
                <table width="100%" style={{ borderCollapse: "collapse" }}><tbody>
                  {[
                    ["Número do pedido", pedido.num],
                    ["Data",             pedido.dataVenda   || "—"],
                    ["Data prevista",    pedido.dataPrevista || "—"],
                    pedido.pedidoCompra ? ["Ped. de compra", pedido.pedidoCompra] : null,
                  ].filter(Boolean).map(([lbl, val]) => (
                    <tr key={lbl}>
                      <td style={{ padding: "5px 8px", border: "1px solid #ccc", fontWeight: "bold", fontSize: 10, background: "#f7f7f7", width: "48%" }}>{lbl}</td>
                      <td style={{ padding: "5px 8px", border: "1px solid #ccc", fontSize: 11 }}>{val}</td>
                    </tr>
                  ))}
                </tbody></table>
              </td>
            </tr></tbody></table>

            {/* ── ITENS ── */}
            <div style={{ fontWeight: "bold", fontSize: 10.5, marginBottom: 5, borderLeft: `3px solid ${BRAND}`, paddingLeft: 7, color: "#2a1a00" }}>Itens do pedido de venda</div>
            <table width="100%" style={{ borderCollapse: "collapse", marginBottom: 20 }}>
              <thead>
                <tr>
                  <th style={pThS}>Descrição do produto/serviço</th>
                  <th style={{ ...pThS, width: 65 }}>Código</th>
                  <th style={{ ...pThS, width: 32, textAlign: "center" }}>Un.</th>
                  <th style={{ ...pThS, width: 48, textAlign: "right" }}>Qtd.</th>
                  <th style={{ ...pThS, width: 72, textAlign: "right" }}>Valor unit.</th>
                  <th style={{ ...pThS, width: 78, textAlign: "right" }}>Valor total</th>
                </tr>
              </thead>
              <tbody>
                {lista.map((it, i) => {
                  const p  = parseFloat(it.precoLista) || 0;
                  const d  = parseFloat(it.descPct)   || 0;
                  const q  = parseFloat(it.qty)       || 0;
                  const pu = p * (1 - d / 100);
                  return (
                    <tr key={i} style={{ background: i % 2 === 0 ? "#fff" : "#fafafa" }}>
                      <td style={pTdS}>{it.desc || "—"}</td>
                      <td style={{ ...pTdS, color: "#666", fontSize: 10 }}>{it.sku || ""}</td>
                      <td style={{ ...pTdS, textAlign: "center" }}>{it.un || "UN"}</td>
                      <td style={{ ...pTdS, textAlign: "right", fontVariantNumeric: "tabular-nums" }}>{q.toLocaleString("pt-BR")}</td>
                      <td style={{ ...pTdS, textAlign: "right", fontVariantNumeric: "tabular-nums" }}>{fmt(pu)}</td>
                      <td style={{ ...pTdS, textAlign: "right", fontVariantNumeric: "tabular-nums" }}>{fmt(pu * q)}</td>
                    </tr>
                  );
                })}
                {/* Resumo totais */}
                {[
                  ["N° de itens",      lista.length.toLocaleString("pt-BR"), false],
                  ["Soma das Qtdes",   somaQtd.toLocaleString("pt-BR"),      false],
                  ["Total de produtos",fmt(totalProd),                        false],
                  desconto > 0.005 ? ["Desconto", fmt(desconto), false] : null,
                  ["Total do pedido",  fmt(totalFinal),                       true],
                ].filter(Boolean).map(([lbl, val, bold], i) => (
                  <tr key={lbl}>
                    <td colSpan={4} style={{ borderTop: i === 0 ? `2px solid ${BRAND}` : "none", background: bold ? "#fdf8f0" : "transparent" }} />
                    <td style={{ padding: "4px 7px", textAlign: "right", fontWeight: bold ? "bold" : 600, fontSize: bold ? 11.5 : 10, borderTop: i === 0 ? `2px solid ${BRAND}` : "none", borderRight: "1px solid #ddd", color: bold ? "#7A4F1A" : "#444", background: bold ? "#fdf3e3" : "transparent" }}>{lbl}</td>
                    <td style={{ padding: "4px 7px", textAlign: "right", fontVariantNumeric: "tabular-nums", fontWeight: bold ? "bold" : "normal", fontSize: bold ? 12.5 : 10.5, borderTop: i === 0 ? `2px solid ${BRAND}` : "none", border: "1px solid #ddd", color: bold ? "#7A4F1A" : "#333", background: bold ? "#fdf3e3" : "transparent" }}>{val}</td>
                  </tr>
                ))}
              </tbody>
            </table>

            {/* ── PARCELAS ── */}
            {parcelas.length > 0 && <div className="ped-section-break">
              <div style={{ fontWeight: "bold", fontSize: 10.5, marginBottom: 5, borderLeft: `3px solid ${BRAND}`, paddingLeft: 7, color: "#2a1a00" }}>Parcelas</div>
              <table width="100%" style={{ borderCollapse: "collapse", marginBottom: 20 }}>
                <thead>
                  <tr>
                    <th style={{ ...pThS, width: 70 }}>Parcela</th>
                    <th style={pThS}>Data vencimento</th>
                    <th style={pThS}>Forma de pagamento</th>
                    <th style={{ ...pThS, textAlign: "right", width: 90 }}>Valor</th>
                    <th style={pThS}>Observação</th>
                  </tr>
                </thead>
                <tbody>
                  {parcelas.map((par, i) => {
                    const v = typeof par.valor === "number" ? par.valor : parseFloat(par.valor) || 0;
                    return (
                      <tr key={i} style={{ background: i % 2 === 0 ? "#fff" : "#fafafa" }}>
                        <td style={pTdS}>{i + 1}ª</td>
                        <td style={pTdS}>{par.venc || "—"}</td>
                        <td style={pTdS}>{par.forma || pedido.condPag || "—"}</td>
                        <td style={{ ...pTdS, textAlign: "right", fontVariantNumeric: "tabular-nums" }}>{fmt(v)}</td>
                        <td style={pTdS}>{par.obs || ""}</td>
                      </tr>
                    );
                  })}
                </tbody>
              </table>
            </div>}

            {/* ── TRANSPORTADOR ── */}
            {pedido.transp && (pedido.transp.nome || pedido.transp.fretePorConta) && <div className="ped-section-break">
              <div style={{ fontWeight: "bold", fontSize: 10.5, marginBottom: 5, borderLeft: `3px solid ${BRAND}`, paddingLeft: 7, color: "#2a1a00" }}>Transportador</div>
              <table width="100%" style={{ borderCollapse: "collapse", marginBottom: 20 }}>
                <tbody>
                  {pedido.transp.nome && <tr>
                    <td style={{ ...pTdS, fontWeight: "bold", width: "28%", background: "#f7f7f7", border: "1px solid #ccc" }}>Nome</td>
                    <td style={{ ...pTdS, border: "1px solid #ccc" }}>{pedido.transp.nome}</td>
                  </tr>}
                  <tr>
                    <td style={{ ...pTdS, fontWeight: "bold", background: "#f7f7f7", border: "1px solid #ccc" }}>Modalidade de frete</td>
                    <td style={{ ...pTdS, border: "1px solid #ccc" }}>{FRETE_LBL[pedido.transp.fretePorConta] || "Sem frete"}</td>
                  </tr>
                </tbody>
              </table>
            </div>}

            {/* ── OBSERVAÇÕES ── */}
            <div className="ped-section-break">
              <div style={{ fontWeight: "bold", fontSize: 10.5, marginBottom: 5, borderLeft: `3px solid ${BRAND}`, paddingLeft: 7, color: "#2a1a00" }}>Observações</div>
              <div style={{ border: "1px solid #ddd", padding: "8px 10px", minHeight: 48, fontSize: 11, whiteSpace: "pre-wrap", marginBottom: 32 }}>
                {pedido.obs || ""}
              </div>
            </div>

          </div>)}
        </div>
      </div>
    </>,
    document.body
  );
}

// Backward-compat export for legacy refs
const PEDIDOS = PEDIDOS_SEED;

Object.assign(window, { PedidosAbertos, PedidosFaturados, PedidosCancelados, CriarPedido, PedidoForm, PEDIDOS });
