// data.jsx — Catálogo, estado global, formatadores

const BRL = (n) =>
  'R$ ' + Number(n).toFixed(2).replace('.', ',').replace(/\B(?=(\d{3})+(?!\d))/g, '.');

const installments = (price, n = 6) => {
  const p = price / n;
  return `${n}x de ${BRL(p)} sem juros`;
};

// ─── Produtos ────────────────────────────────────────────────────
const PRODUCTS = [
  {
    id: 'alb-cartao',
    name: 'Álbum Copa do Mundo 2026 — Capa Cartão',
    short: 'Álbum Capa Cartão',
    type: 'Álbum',
    price: 19.9,
    oldPrice: 24.9,
    badge: 'mais-vendido',
    stock: 312,
    rating: 4.9,
    reviews: 1284,
    palette: ['#0d4a30', '#e8b86a', '#f7f3ea'],
    icon: 'album',
    description:
      'O álbum oficial da Coleção Copa do Mundo 2026 em capa cartão. 80 páginas para abrigar 670 figurinhas, com seções por seleção, estádios sede e momentos históricos do torneio.',
    items: ['1 Álbum capa cartão (80p)', 'Pôster duplo dobrável', 'Adesivos extras de bônus'],
  },
  {
    id: 'alb-dura',
    name: 'Álbum Copa do Mundo 2026 — Capa Dura Premium',
    short: 'Álbum Capa Dura',
    type: 'Álbum',
    price: 49.9,
    oldPrice: 69.9,
    badge: 'premium',
    stock: 88,
    rating: 5.0,
    reviews: 642,
    palette: ['#072a1c', '#e8b86a', '#c4933e'],
    icon: 'album-hard',
    description:
      'Versão luxo com capa dura, lombada costurada e detalhes em hot stamping dourado. O álbum dos colecionadores que querem preservar a Copa para sempre.',
    items: ['1 Álbum capa dura', 'Marcador de página em metal', 'Certificado de edição'],
  },
  {
    id: 'kit-12',
    name: 'Kit Álbum Capa Cartão + 12 Envelopes',
    short: 'Kit + 12 Envelopes',
    type: 'Kit',
    price: 89.9,
    oldPrice: 108.7,
    badge: 'oferta',
    stock: 145,
    rating: 4.8,
    reviews: 412,
    palette: ['#0d4a30', '#e8b86a', '#c2391f'],
    icon: 'kit',
    description: 'O começo perfeito da sua coleção: álbum + 12 envelopes lacrados (60 figurinhas).',
    items: ['1 Álbum capa cartão', '12 Envelopes (5 figurinhas cada)'],
  },
  {
    id: 'kit-24',
    name: 'Kit Álbum Capa Cartão + 24 Envelopes',
    short: 'Kit + 24 Envelopes',
    type: 'Kit',
    price: 149.9,
    oldPrice: 174.5,
    badge: 'oferta',
    stock: 96,
    rating: 4.9,
    reviews: 287,
    palette: ['#0d4a30', '#1a6e48', '#e8b86a'],
    icon: 'kit',
    description: 'Kit estendido com 24 envelopes — 120 figurinhas para um arranque de coleção poderoso.',
    items: ['1 Álbum capa cartão', '24 Envelopes (5 figurinhas cada)'],
  },
  {
    id: 'box-40',
    name: 'Box Premium — Álbum Capa Dura + 40 Envelopes',
    short: 'Box Premium + 40',
    type: 'Box',
    price: 249.9,
    oldPrice: 319.6,
    badge: 'premium',
    stock: 42,
    rating: 5.0,
    reviews: 198,
    palette: ['#072a1c', '#e8b86a', '#c4933e'],
    icon: 'box',
    description:
      'A experiência completa em uma box selada: álbum capa dura, 40 envelopes e pôster colecionador exclusivo desta edição.',
    items: ['1 Álbum capa dura', '40 Envelopes lacrados', '1 Pôster exclusivo da box'],
  },
  {
    id: 'pkt-12',
    name: 'Pacote com 12 Envelopes',
    short: 'Pacote 12 Envelopes',
    type: 'Envelopes',
    price: 49.9,
    oldPrice: null,
    badge: null,
    stock: 530,
    rating: 4.7,
    reviews: 922,
    palette: ['#0d4a30', '#e8b86a', '#f7f3ea'],
    icon: 'envelope-pack',
    description: 'Doze envelopes lacrados, 60 figurinhas. Reabasteça sua coleção sem mistério.',
    items: ['12 Envelopes (5 figurinhas cada)'],
  },
  {
    id: 'pkt-1',
    name: 'Envelope Avulso de Figurinhas',
    short: 'Envelope Avulso',
    type: 'Envelopes',
    price: 4.9,
    oldPrice: null,
    badge: null,
    stock: 2400,
    rating: 4.6,
    reviews: 3120,
    palette: ['#0d4a30', '#e8b86a', '#f7f3ea'],
    icon: 'envelope',
    description: 'Um envelope, cinco figurinhas, infinitas chances. Compre quantos quiser.',
    items: ['1 Envelope (5 figurinhas)'],
  },
  {
    id: 'cards-starter',
    name: 'Starter Pack Cards 2026',
    short: 'Starter Cards',
    type: 'Cards',
    price: 39.9,
    oldPrice: 49.9,
    badge: 'novidade',
    stock: 220,
    rating: 4.8,
    reviews: 156,
    palette: ['#0a3a72', '#e8b86a', '#0d4a30'],
    icon: 'cards',
    description: 'Pacote inicial da linha Cards 2026: 50 cards padrão + 4 raros + 1 lendário garantido.',
    items: ['50 Cards padrão', '4 Cards raros', '1 Card lendário'],
  },
  {
    id: 'lata-cards',
    name: 'Lata Colecionável Cards 2026',
    short: 'Lata Colecionável',
    type: 'Cards',
    price: 129.9,
    oldPrice: 159.9,
    badge: 'premium',
    stock: 64,
    rating: 4.9,
    reviews: 89,
    palette: ['#c4933e', '#072a1c', '#e8b86a'],
    icon: 'lata',
    description: 'Lata metálica colecionável estampada com 200 cards, 3 lendários e 1 limited.',
    items: ['Lata metálica', '200 Cards', '3 Lendários + 1 Limited'],
  },
  {
    id: 'combo-torcedor',
    name: 'Combo Torcedor Premium 2026',
    short: 'Combo Torcedor',
    type: 'Combo',
    price: 299.9,
    oldPrice: 389.0,
    badge: 'oferta',
    stock: 28,
    rating: 5.0,
    reviews: 74,
    palette: ['#c2391f', '#0d4a30', '#e8b86a'],
    icon: 'combo',
    description:
      'O combo definitivo: álbum capa dura, 40 envelopes, lata de cards e cachecol exclusivo Coleção 2026.',
    items: ['Álbum capa dura', '40 Envelopes', 'Lata Cards 2026', 'Cachecol exclusivo'],
  },
  {
    id: 'mega-100',
    name: 'Mega Box 100 Envelopes',
    short: 'Mega Box 100',
    type: 'Box',
    price: 379.9,
    oldPrice: 489.0,
    badge: 'oferta',
    stock: 19,
    rating: 4.9,
    reviews: 51,
    palette: ['#0d4a30', '#1a6e48', '#e8b86a'],
    icon: 'megabox',
    description: 'Cem envelopes lacrados em uma única caixa. 500 figurinhas para devorar a coleção.',
    items: ['100 Envelopes lacrados'],
  },
  {
    id: 'display-50',
    name: 'Caixa Display 50 Envelopes',
    short: 'Display 50',
    type: 'Box',
    price: 199.9,
    oldPrice: 244.5,
    badge: 'mais-vendido',
    stock: 73,
    rating: 4.8,
    reviews: 168,
    palette: ['#0d4a30', '#e8b86a', '#f7f3ea'],
    icon: 'display',
    description: 'Caixa display original de revenda com 50 envelopes. 250 figurinhas em uma só caixa.',
    items: ['Display original com 50 envelopes'],
  },
];

const TYPES = ['Álbum', 'Envelopes', 'Kit', 'Box', 'Cards', 'Combo'];

const FAQ = [
  {
    q: 'Quando começam as entregas?',
    a: 'Os primeiros lotes da Coleção Copa do Mundo 2026 começam a ser despachados no dia útil seguinte à confirmação do pagamento. Pré-vendas seguem o cronograma indicado no produto.',
  },
  {
    q: 'Os envelopes são lacrados de fábrica?',
    a: 'Sim. Todos os envelopes saem lacrados pelo fabricante, sem qualquer manuseio prévio. As figurinhas internas são sortidas aleatoriamente.',
  },
  {
    q: 'Posso trocar figurinhas repetidas?',
    a: 'Mantemos uma comunidade ativa de troca dentro da Área do Cliente. Você cadastra suas repetidas e suas faltas, e o sistema sugere matches.',
  },
  {
    q: 'A Central da Copa 2026 é loja oficial?',
    a: 'Somos uma loja independente especializada em colecionáveis da Copa do Mundo 2026. Trabalhamos com produtos lacrados, originais e nota fiscal eletrônica.',
  },
];

const SHIPPING_RATES = {
  pac: { name: 'PAC — Correios', days: '6 a 9 dias úteis', price: 24.9 },
  sedex: { name: 'SEDEX — Correios', days: '2 a 4 dias úteis', price: 39.9 },
  expressa: { name: 'Transportadora expressa', days: '1 a 3 dias úteis', price: 49.9 },
  retirada: { name: 'Retirada na loja (SP)', days: 'Pronto em 4h', price: 0 },
};

const STORE = {
  whatsapp: '551148631950', // (11) 4863-1950
  whatsappDisplay: '(11) 4863-1950',
  pixKey: '52537392000126',
  cnpj: '52.537.392.0001-26',
  beneficiary: 'FULLBET INTERMEDIACOES',
  city: 'SAO PAULO',
};

// Mensagem padrão para checkout no cartão (redireciona para WhatsApp)
const buildWhatsAppCardMessage = (order) => {
  const itemsLines = order.items.map(
    (i) => `• ${i.qty}x ${i.product.short} — ${BRL(i.product.price * i.qty)}`,
  ).join('\n');
  const total = BRL(order.total);
  return [
    `Olá! Quero finalizar minha compra no *cartão de crédito*.`,
    ``,
    `*Pedido:* ${order.id}`,
    `*Cliente:* ${order.address?.name || ''}`,
    `*CPF:* ${order.address?.cpf || ''}`,
    ``,
    `*Itens:*`,
    itemsLines,
    ``,
    `*Frete:* ${order.shipping}`,
    `*Endereço:* ${order.address?.street || ''}, ${order.address?.number || ''} — ${order.address?.city || ''}/${order.address?.state || ''} — CEP ${order.address?.cep || ''}`,
    ``,
    `*Total:* ${total}`,
    ``,
    `Aguardo a maquineta virtual para parcelar. Obrigado!`,
  ].join('\n');
};

const openWhatsApp = (text) => {
  const url = `https://wa.me/${STORE.whatsapp}?text=${encodeURIComponent(text)}`;
  window.open(url, '_blank', 'noopener,noreferrer');
};

// Gera um Pix EMV (BR Code) — payload do copia-e-cola
function buildPixCode(amount, txid) {
  const f = (id, val) => id + String(val.length).padStart(2, '0') + val;
  const merchantAccount = f('00', 'br.gov.bcb.pix') + f('01', STORE.pixKey);
  const payload =
    f('00', '01') +
    f('26', merchantAccount) +
    f('52', '0000') +
    f('53', '986') +
    f('54', amount.toFixed(2)) +
    f('58', 'BR') +
    f('59', STORE.beneficiary.slice(0, 25)) +
    f('60', STORE.city.slice(0, 15)) +
    f('62', f('05', txid.slice(0, 25))) +
    '6304';
  // CRC16-CCITT
  let crc = 0xffff;
  for (let i = 0; i < payload.length; i++) {
    crc ^= payload.charCodeAt(i) << 8;
    for (let j = 0; j < 8; j++) {
      crc = (crc & 0x8000) ? ((crc << 1) ^ 0x1021) & 0xffff : (crc << 1) & 0xffff;
    }
  }
  return payload + crc.toString(16).toUpperCase().padStart(4, '0');
}

// WhatsApp templates para o painel: confirmação, despacho, entrega
const buildWhatsAppOrderConfirmed = (order) => {
  const itens = order.items.map((i) => `• ${i.qty}x ${i.product.short}`).join('\n');
  return [
    `Olá ${order.address?.name?.split(' ')[0] || 'colecionador'}! 🏆`,
    ``,
    `*Central da Copa 2026* confirmando seu pedido:`,
    `*Pedido:* ${order.id}`,
    ``,
    `*Itens:*`,
    itens,
    ``,
    `*Total:* ${BRL(order.total)}`,
    `*Frete:* ${order.shipping}`,
    ``,
    `Já estamos separando com carinho. Em breve você recebe o código de rastreio por aqui.`,
    ``,
    `Qualquer dúvida é só responder. Bora colar essa coleção! ⚽`,
  ].join('\n');
};

const buildWhatsAppOrderShipped = (order, tracking = '') => {
  return [
    `Olá ${order.address?.name?.split(' ')[0] || 'colecionador'}! 📦`,
    ``,
    `Seu pedido *${order.id}* acaba de ser despachado.`,
    tracking ? `*Rastreio:* ${tracking}` : `Em breve enviamos o código de rastreio.`,
    ``,
    `*Transportadora:* ${order.shipping}`,
    ``,
    `Boa coleção! 🏆 — Central da Copa 2026`,
  ].join('\n');
};

const buildWhatsAppOrderDelivered = (order) => {
  return [
    `Pedido *${order.id}* entregue! 🎉`,
    ``,
    `Esperamos que você curta cada figurinha.`,
    `Se puder, deixa uma avaliação pra gente — é o que mais ajuda outros colecionadores.`,
    ``,
    `*Central da Copa 2026* ⚽`,
  ].join('\n');
};

const sendWhatsAppToCustomer = (order, kind = 'confirmed', extra) => {
  const phone = String(order.address?.phone || '').replace(/\D/g, '');
  if (!phone) {
    alert('Este pedido não tem telefone do cliente cadastrado.');
    return;
  }
  // Adiciona DDI se faltar
  const fullPhone = phone.length === 11 || phone.length === 10 ? '55' + phone : phone;
  const builders = {
    confirmed: buildWhatsAppOrderConfirmed,
    shipped: buildWhatsAppOrderShipped,
    delivered: buildWhatsAppOrderDelivered,
  };
  const text = builders[kind](order, extra);
  const url = `https://wa.me/${fullPhone}?text=${encodeURIComponent(text)}`;
  window.open(url, '_blank', 'noopener,noreferrer');
};

const COUPONS = {
  COPA10: { off: 0.1, label: '10% off no carrinho' },
  TORCIDA20: { off: 0.2, label: '20% off acima de R$ 250', min: 250 },
  FRETEGRATIS: { freeShip: true, label: 'Frete grátis acima de R$ 150', min: 150 },
  VOLTA10: { off: 0.1, label: 'Volte e ganhe — 10% off de recuperação' },
};

// ─── Estado: Cart, Wishlist, Auth ─────────────────────────────────
const CartContext = React.createContext(null);

function useCartStore() {
  const [items, setItems] = React.useState(() => {
    try {
      return JSON.parse(localStorage.getItem('cc26.cart') || '[]');
    } catch (e) {
      return [];
    }
  });
  const [wishlist, setWishlist] = React.useState(() => {
    try {
      return JSON.parse(localStorage.getItem('cc26.wish') || '[]');
    } catch (e) {
      return [];
    }
  });
  const [coupon, setCoupon] = React.useState(() => localStorage.getItem('cc26.coupon') || '');
  const [user, setUser] = React.useState(() => {
    try {
      return JSON.parse(localStorage.getItem('cc26.user') || 'null');
    } catch (e) {
      return null;
    }
  });
  const [orders, setOrders] = React.useState(() => {
    try {
      return JSON.parse(localStorage.getItem('cc26.orders') || '[]');
    } catch (e) {
      return [];
    }
  });

  React.useEffect(() => {
    localStorage.setItem('cc26.cart', JSON.stringify(items));
  }, [items]);
  React.useEffect(() => {
    localStorage.setItem('cc26.wish', JSON.stringify(wishlist));
  }, [wishlist]);
  React.useEffect(() => {
    localStorage.setItem('cc26.coupon', coupon || '');
  }, [coupon]);
  React.useEffect(() => {
    localStorage.setItem('cc26.user', JSON.stringify(user));
  }, [user]);
  React.useEffect(() => {
    localStorage.setItem('cc26.orders', JSON.stringify(orders));
  }, [orders]);

  const add = (productId, qty = 1) => {
    setItems((prev) => {
      const found = prev.find((i) => i.id === productId);
      if (found) return prev.map((i) => (i.id === productId ? { ...i, qty: i.qty + qty } : i));
      return [...prev, { id: productId, qty }];
    });
  };
  const setQty = (productId, qty) => {
    setItems((prev) =>
      qty <= 0 ? prev.filter((i) => i.id !== productId) : prev.map((i) => (i.id === productId ? { ...i, qty } : i))
    );
  };
  const remove = (productId) => setItems((prev) => prev.filter((i) => i.id !== productId));
  const clear = () => setItems([]);
  const toggleWish = (productId) =>
    setWishlist((prev) => (prev.includes(productId) ? prev.filter((i) => i !== productId) : [...prev, productId]));

  const subtotal = items.reduce((s, i) => {
    const p = PRODUCTS.find((p) => p.id === i.id);
    return p ? s + p.price * i.qty : s;
  }, 0);
  const totalCount = items.reduce((s, i) => s + i.qty, 0);

  const couponData = coupon && COUPONS[coupon.toUpperCase()];
  let discount = 0;
  let freeShip = false;
  if (couponData) {
    if (couponData.min && subtotal < couponData.min) {
      // not eligible
    } else if (couponData.off) discount = subtotal * couponData.off;
    else if (couponData.freeShip) freeShip = true;
  }

  const placeOrder = (payload) => {
    const order = {
      id: 'CC26-' + String(Math.floor(Math.random() * 900000) + 100000),
      date: new Date().toISOString(),
      items: items.map((i) => ({ ...i, product: PRODUCTS.find((p) => p.id === i.id) })),
      subtotal,
      discount,
      ...payload,
      status: 'Pagamento confirmado',
    };
    setOrders((prev) => [order, ...prev]);
    setItems([]);
    return order;
  };

  return {
    items,
    wishlist,
    coupon,
    user,
    orders,
    add,
    setQty,
    remove,
    clear,
    toggleWish,
    setCoupon,
    setUser,
    placeOrder,
    subtotal,
    totalCount,
    discount,
    freeShip,
  };
}

Object.assign(window, {
  PRODUCTS,
  TYPES,
  FAQ,
  SHIPPING_RATES,
  COUPONS,
  STORE,
  buildWhatsAppCardMessage,
  buildWhatsAppOrderConfirmed,
  buildWhatsAppOrderShipped,
  buildWhatsAppOrderDelivered,
  sendWhatsAppToCustomer,
  openWhatsApp,
  buildPixCode,
  BRL,
  installments,
  CartContext,
  useCartStore,
});
