'use client'; import React, { useState, useEffect } from 'react'; import Link from 'next/link'; import { ArrowLeft, CheckCircle2, ShieldCheck, Truck, Zap, QrCode, Phone, MapPin, User, MessageCircle, ExternalLink, CreditCard } from 'lucide-react'; import { City, PaymentMethod, Order, StoreSettings } from '@/types'; import { INITIAL_CITIES, INITIAL_PAYMENT_METHODS, INITIAL_PRODUCTS } from '@/lib/data-service'; import { formatCOP } from '@/lib/pricing-engine'; import { useBrand } from '@/context/BrandContext'; import { useAuth } from '@/context/AuthContext'; import { renderClientTemplate } from '@/lib/templates-client'; import confetti from 'canvas-confetti'; import { OptimizedImage } from '@/components/ui/OptimizedImage'; export default function CheckoutPage() { const { currentBrand } = useBrand(); const { user } = useAuth(); const [customerName, setCustomerName] = useState(''); const [customerPhone, setCustomerPhone] = useState(''); const [address, setAddress] = useState(''); const [neighborhood, setNeighborhood] = useState(''); const [notes, setNotes] = useState(''); const [cities, setCities] = useState(INITIAL_CITIES); const [paymentMethods, setPaymentMethods] = useState(INITIAL_PAYMENT_METHODS); const [selectedCityId, setSelectedCityId] = useState('city-cali'); const [selectedPaymentId, setSelectedPaymentId] = useState('pay-deposit-10k'); const [storeSettings, setStoreSettings] = useState(null); const [checkoutItems] = useState>( INITIAL_PRODUCTS.length > 0 ? [ { productId: INITIAL_PRODUCTS[0].id, productName: INITIAL_PRODUCTS[0].name, brand: INITIAL_PRODUCTS[0].brand, size: '39', quantity: 1, price: INITIAL_PRODUCTS[0].retailPrice, image: INITIAL_PRODUCTS[0].images[0], }, ] : [] ); const [isSubmitting, setIsSubmitting] = useState(false); const [orderCompleted, setOrderCompleted] = useState(null); const [userRequiresDeposit, setUserRequiresDeposit] = useState(false); const [userDepositReason, setUserDepositReason] = useState(''); useEffect(() => { fetch('/api/cities') .then((r) => r.json()) .then((d) => d.success && setCities(d.cities)) .catch(() => {}); fetch('/api/payment-methods') .then((r) => r.json()) .then((d) => d.success && setPaymentMethods(d.paymentMethods)) .catch(() => {}); fetch('/api/settings') .then((r) => r.json()) .then((d) => d.success && setStoreSettings(d.settings)) .catch(() => {}); }, []); useEffect(() => { if (user) { setUserRequiresDeposit(user.requiresShippingDeposit === true); setUserDepositReason(user.depositReason || ''); } }, [user]); useEffect(() => { const clean = customerPhone.replace(/\D/g, ''); if (clean.length >= 10) { fetch(`/api/users?phone=${clean}`) .then((r) => r.json()) .then((data) => { if (data.success) { setUserRequiresDeposit(data.requiresShippingDeposit === true); setUserDepositReason(data.depositReason || ''); } }) .catch(() => {}); } }, [customerPhone]); const activeCity = cities.find((c) => c.id === selectedCityId) || cities[0]; const activePayment = paymentMethods.find((p) => p.id === selectedPaymentId) || paymentMethods[0]; const subtotal = checkoutItems.reduce((acc, it) => acc + it.price * it.quantity, 0); const shippingCost = activeCity.shippingCost; const totalAmount = subtotal + shippingCost; // Valor de garantía por flete según la ciudad seleccionada (o $10.000 COP si flete local es 0) const cityShippingFee = activeCity.shippingCost > 0 ? activeCity.shippingCost : 10000; // Por defecto NO se cobra anticipo a clientes nuevos // Solo se activa si el cliente tiene un pedido rechazado previo o si un admin lo activó const isMandatoryDeposit = userRequiresDeposit; const depositAmount = isMandatoryDeposit ? cityShippingFee : (activePayment.requiresDeposit ? activePayment.depositAmount : 0); const balanceDue = Math.max(0, totalAmount - depositAmount); const officialWhatsapp = storeSettings?.whatsappNumber || '573167455877'; const boldLink = storeSettings?.boldPaymentLink || 'https://bold.co/p/carlos-lasso'; const handleSubmitOrder = async (e: React.FormEvent) => { e.preventDefault(); if (!customerName || !customerPhone || !address) { alert('Por favor completa tu nombre, celular y dirección para el despacho.'); return; } setIsSubmitting(true); try { const orderPayload = { customerName, customerPhone, address: `${address} - Barrio: ${neighborhood || 'Centro'}`, cityId: activeCity.id, cityName: activeCity.name, items: checkoutItems, subtotal, shippingCost, totalAmount, depositAmount, balanceDue, paymentMethodId: activePayment.id, paymentMethodName: activePayment.name, notes, }; const res = await fetch('/api/orders', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(orderPayload), }); const data = await res.json(); if (data.success) { setOrderCompleted(data.order); confetti({ particleCount: 100, spread: 70, origin: { y: 0.6 }, }); } } catch (err) { console.error('Error creando orden:', err); } finally { setIsSubmitting(false); } }; const handleOpenWhatsAppOrder = (order: Order) => { const itemsSummary = order.items .map((i) => `• ${i.productName} (Talla ${i.size}) x${i.quantity} = ${formatCOP(i.price * i.quantity)}`) .join('\n'); const paymentCondition = order.depositAmount > 0 ? `⚡ *Separación:* ${formatCOP(order.depositAmount)}\n🤝 *Saldo Contraentrega:* ${formatCOP(order.balanceDue)}` : '🤝 *Pago 100% Contraentrega.*'; const rawText = renderClientTemplate('order_checkout_wa', { tienda_nombre: currentBrand.name, orden_id: order.id, cliente_nombre: order.customerName, cliente_telefono: order.customerPhone, cliente_direccion: order.address, cliente_ciudad: order.cityName, articulos_resumen: itemsSummary, total: formatCOP(order.totalAmount), condicion_pago_resumen: paymentCondition, metodo_pago: order.paymentMethodName, saldo_contraentrega: formatCOP(order.balanceDue), }); window.open(`https://wa.me/${officialWhatsapp}?text=${encodeURIComponent(rawText)}`, '_blank'); }; if (orderCompleted) { return (
¡Pedido Registrado con Éxito!

Orden #{orderCompleted.id}

Hemos recibido tu solicitud para entrega en {orderCompleted.cityName} con {currentBrand.name}.

{/* Bold.co or Nequi Separation Box */} {orderCompleted.depositAmount > 0 ? (
Paso 2: Realiza la separación de $10.000 COP

Paga de inmediato con Link de Pago Bold.co (PSE / Tarjeta / Nequi) o transfiere a nuestra cuenta oficial:

{boldLink && ( Pagar $10.000 COP con Bold.co (PSE / Tarjetas) )}
📱 Nequi / Daviplata: {storeSettings?.nequiAccount || '316 745 5877'} ({storeSettings?.accountHolder || 'Carlos Andrés Lasso'})

🤝 Cancelas el saldo de {formatCOP(orderCompleted.balanceDue)} al recibir el paquete en tu casa.

) : (

Tu pedido quedó programado para entrega contraentrega en 24 horas. ¡Nos pondremos en contacto contigo por WhatsApp!

)}
Volver a la Tienda
); } return (
{/* Header */}
Regresar a {currentBrand.name}
Compra Segura & Garantizada
{/* Left Column: Shipping & Payment Details (7 cols) */}
{/* 1. Datos del Cliente */}

1. Datos de Entrega

setCustomerName(e.target.value)} className="w-full bg-neutral-950 border border-neutral-800 rounded-xl px-3 py-2 text-sm text-white focus:border-purple-400 outline-hidden" />
setCustomerPhone(e.target.value)} className="w-full bg-neutral-950 border border-neutral-800 rounded-xl px-3 py-2 text-sm text-white focus:border-purple-400 outline-hidden" />
{/* City Selection */}
setAddress(e.target.value)} className="w-full bg-neutral-950 border border-neutral-800 rounded-xl px-3 py-2 text-sm text-white focus:border-purple-400 outline-hidden" />
setNeighborhood(e.target.value)} className="w-full bg-neutral-950 border border-neutral-800 rounded-xl px-3 py-2 text-sm text-white focus:border-purple-400 outline-hidden" />
{/* 2. Método de Pago */}

2. Selecciona tu Método de Pago

{paymentMethods.map((method) => { const isSelected = selectedPaymentId === method.id; return (
setSelectedPaymentId(method.id)} className={`p-4 rounded-2xl border transition-all cursor-pointer space-y-1.5 ${ isSelected ? `border-purple-400 bg-purple-950/20 shadow-md` : 'border-neutral-800 hover:border-neutral-700 bg-neutral-950' }`} >
{isSelected &&
}
{method.name}
{method.requiresDeposit && ( Separa con $10.000 )}

{method.description}

{isSelected && (method.accountInfo || (method.type === 'bold' && boldLink)) && (
{method.accountInfo &&

{method.accountInfo}

} {method.type === 'bold' && boldLink && ( Abrir Link de Pago Bold.co )}
)}
); })}
{/* Right Column: Summary (5 cols) */}

Resumen del Pedido

{/* Items */}
{checkoutItems.map((item, i) => (

{item.productName}

Talla: {item.size} | Cant: {item.quantity}

{formatCOP(item.price * item.quantity)}

))}
{/* Breakdown */}
Subtotal: {formatCOP(subtotal)}
Envío ({activeCity.name}): {shippingCost === 0 ? Gratis : formatCOP(shippingCost)}
Total a Pagar: {formatCOP(totalAmount)}
{/* Garantía de Flete / Despacho (Solo visible si está activo para el usuario) */} {isMandatoryDeposit ? (
Garantía de Despacho & Reserva ({activeCity.name})

Para asegurar tu turno prioritario de entrega con la transportadora en {activeCity.name}, se realiza un anticipo de {formatCOP(depositAmount)} por concepto de flete, el cual es 100% descontable del valor total al recibir tu calzado en tu domicilio.

Saldo a pagar en efectivo al recibir: {formatCOP(balanceDue)}
) : depositAmount > 0 ? (
Anticipo de Separación: {formatCOP(depositAmount)}
Saldo a pagar al recibir: {formatCOP(balanceDue)}
) : null}
Garantía en {activeCity.name}:

{activeCity.firstExchangeFree ? '1er Cambio de Talla 100% GRATIS (cambios posteriores con flete estándar).' : 'Cambios de talla 100% garantizados (los costos de envío son asumidos por el cliente).'}

Al confirmar, se guardará tu pedido y recibirás asistencia inmediata por WhatsApp oficial ({officialWhatsapp}) para el seguimiento de tu entrega en 24 horas.

); }