'use client'; import React, { useState, useRef, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import { useCarrinho } from '@/contexts/CarrinhoContext'; import { pedidoApiService } from '@/services/pedidoApiService'; import { ShoppingCartIcon, XMarkIcon, TrashIcon } from '@heroicons/react/24/outline'; import Link from 'next/link'; import { toast } from 'react-hot-toast'; const CarrinhoCompras: React.FC = () => { const router = useRouter(); const { itens, totalItens, valorTotal, carrinhoId, removerItem, atualizarQuantidade, limparCarrinho, isCarrinhoAberto, setIsCarrinhoAberto, } = useCarrinho(); const [finalizandoPedido, setFinalizandoPedido] = useState(false); const dropdownRef = useRef(null); // Função de teste para debug const testarFinalizacao = async () => { console.log('🧪 [TESTE] Iniciando teste de finalização'); console.log('🧪 [TESTE] Itens:', itens); console.log('🧪 [TESTE] Total itens:', totalItens); console.log('🧪 [TESTE] Valor total:', valorTotal); console.log('🧪 [TESTE] Carrinho ID:', carrinhoId); try { setFinalizandoPedido(true); await new Promise(resolve => setTimeout(resolve, 100)); console.log('🧪 [TESTE] Simulando criação de pedido...'); const response = await pedidoApiService.criar(itens, carrinhoId || undefined); console.log('🧪 [TESTE] Resposta:', response); if (response.success) { toast.success('Teste de pedido OK!'); } else { toast.error(`Erro no teste: ${response.error}`); } } catch (error) { console.error('🧪 [TESTE] Erro:', error); toast.error('Erro no teste'); } finally { setFinalizandoPedido(false); } }; // Fechar dropdown ao clicar fora useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { setIsCarrinhoAberto(false); } } document.addEventListener('mousedown', handleClickOutside); return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, [setIsCarrinhoAberto]); const formatarPreco = (preco: number) => { return new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(preco); }; const obterPreco = (produto: any) => { // Retorna apenas o preco_final, se não existir retorna 0 return produto.preco_final || 0; }; const handleFinalizarCompra = async (event?: React.MouseEvent) => { console.log('🚀 [Header] handleFinalizarCompra INICIADO'); console.log('🚀 [Header] Event recebido:', event); console.log('🚀 [Header] Estado inicial finalizandoPedido:', finalizandoPedido); // Prevenir propagação e comportamento padrão if (event) { event.preventDefault(); event.stopPropagation(); console.log('🚀 [Header] Event prevented'); } // Verificar se já está processando para evitar duplo clique if (finalizandoPedido) { console.log('⚠️ [Header] Já está finalizando, ignorando clique duplicado'); return; } // Verificar carrinho novamente no momento do clique const itensAtual = itens; console.log('🚀 [Header] Itens atuais:', itensAtual); console.log('🚀 [Header] Quantidade de itens:', itensAtual?.length); if (!itensAtual || itensAtual.length === 0) { console.log('❌ [Header] Carrinho vazio!'); toast.error("Adicione produtos ao carrinho antes de finalizar a compra"); return; } try { setFinalizandoPedido(true); console.log('🛒 [Header] Iniciando criação de pedido...', { itensCarrinho: itensAtual.length, carrinhoId, valorTotal: totalItens }); let pedidoId: string | null = null; console.log('🆕 [Header] Criando novo pedido...'); // Aguardar um pequeno delay para garantir sincronização do estado await new Promise(resolve => setTimeout(resolve, 100)); // Criar pedido na API BFF const response = await pedidoApiService.criar(itensAtual, carrinhoId || undefined); if (response.success) { setIsCarrinhoAberto(false); pedidoId = response.data?.$id || response.data?.id; // Aguardar um momento antes do redirecionamento await new Promise(resolve => setTimeout(resolve, 500)); console.log('🔄 [Header] Redirecionando para checkout com pedido:', pedidoId); try { await router.push(`/checkout?pedido=${pedidoId}`); } catch (routerError) { console.warn('⚠️ [Header] Router falhou, usando window.location:', routerError); window.location.href = `/checkout?pedido=${pedidoId}`; } } else { console.warn('⚠️ [Header] Erro ao criar pedido, tentando recuperar pedido existente...', response.error); let recuperado = false; // 1. Tentar buscar pedido pendente existente para este carrinho if (carrinhoId) { const pedidoExistente = await pedidoApiService.buscarPendentePorCarrinho(carrinhoId); if (pedidoExistente.success && pedidoExistente.data) { console.log('✅ [Header] Pedido pendente encontrado:', pedidoExistente.data); pedidoId = pedidoExistente.data.$id || pedidoExistente.data.id; toast.success('Retomando pedido existente...'); recuperado = true; setIsCarrinhoAberto(false); await new Promise(resolve => setTimeout(resolve, 500)); router.push(`/checkout?pedido=${pedidoId}`); } } // 2. Se não conseguiu recuperar, tentar criar um NOVO pedido forçando unique() (já configurado no serviço, mas tentando novamente caso seja erro transiente) if (!recuperado) { console.log('⚠️ [Header] Não foi possível recuperar pedido existente. Tentando criar um novo...'); // Aguardar um pouco antes de tentar novamente await new Promise(resolve => setTimeout(resolve, 500)); const novaTentativa = await pedidoApiService.criar(itensAtual, carrinhoId || undefined); if (novaTentativa.success) { console.log('✅ [Header] Novo pedido criado com sucesso na segunda tentativa:', novaTentativa.data); pedidoId = novaTentativa.data?.$id || novaTentativa.data?.id; toast.success('Novo pedido criado com sucesso!'); setIsCarrinhoAberto(false); await new Promise(resolve => setTimeout(resolve, 500)); router.push(`/checkout?pedido=${pedidoId}`); } else { // Se falhar novamente, aí sim mostra o erro original/novo console.error('❌ [Header] Erro ao criar pedido (tentativa 2):', novaTentativa.error); toast.error(`Erro ao criar pedido: ${response.error}`); router.push("/checkout"); } } } } catch (error) { console.error('💥 [Header] Erro na finalização da compra:', error); toast.error("Erro ao finalizar compra. Tente novamente."); } finally { // Aguardar um momento antes de liberar o botão setTimeout(() => { setFinalizandoPedido(false); }, 1000); } }; return (
{/* Botão do Carrinho */} {/* Dropdown do Carrinho */} {isCarrinhoAberto && (
{/* Header do Carrinho */}

Carrinho de Compras

{/* Conteúdo do Carrinho */}
{itens.length === 0 ? (

Seu carrinho está vazio

setIsCarrinhoAberto(false)} className="inline-block bg-blue-600 text-white px-4 py-2 rounded-lg hover:bg-blue-700 transition-colors" > Ver Produtos
) : (
{itens.map((item) => { const preco = obterPreco(item.produto); return (
{/* Informações do Produto */}

{item.produto.nome || 'Produto'}

{/* Código EAN */} {item.produto.codigo_ean && (

EAN: {item.produto.codigo_ean}

)} {/* Laboratório e Categoria */}
{item.produto.cat_nome && ( {item.produto.cat_nome} )} {item.produto.cat_nome && item.produto.lab_nome && ( | )} {item.produto.lab_nome && ( {item.produto.lab_nome} )}

{formatarPreco(preco)}

{/* Área de Controles */}
{/* Controles de Quantidade */}
{ const newQty = parseInt(e.target.value) || 1; const maxQty = item.produto.quantidade_estoque || 999; if (newQty >= 1 && newQty <= maxQty) { atualizarQuantidade(item.produto.id, newQty); } }} className="px-2 py-1 text-xs font-medium text-gray-900 bg-gray-50 border-x border-gray-300 min-w-[35px] text-center focus:outline-none focus:bg-white focus:border-blue-500" />
{/* Botão Remover */}
{/* Estoque disponível */} Estoque: {item.produto.quantidade_estoque || 0}
); })}
)}
{/* Footer do Carrinho */} {itens.length > 0 && (
Total: {formatarPreco(valorTotal)}
{/* Botão de teste */}
)}
)}
); }; export default CarrinhoCompras;