'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 confetti from 'canvas-confetti'; export default function CheckoutPage() { const { currentBrand } = useBrand(); 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); 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(() => {}); }, []); 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; const depositAmount = activePayment.requiresDeposit ? activePayment.depositAmount : 0; const balanceDue = 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 text = `🎉 *CONFIRMACIÓN DE PEDIDO EN ${currentBrand.name} #${order.id}* 🎉 👤 *Cliente:* ${order.customerName} 📱 *Teléfono:* ${order.customerPhone} 📍 *Dirección:* ${order.address} 🏙️ *Ciudad:* ${order.cityName} 📦 *Artículos:* ${order.items.map((i) => `• ${i.productName} (Talla ${i.size}) x${i.quantity} = ${formatCOP(i.price * i.quantity)}`).join('\n')} 💰 *Total:* ${formatCOP(order.totalAmount)} ${order.depositAmount > 0 ? `⚡ *Separación:* ${formatCOP(order.depositAmount)}\n🤝 *Saldo Contraentrega:* ${formatCOP(order.balanceDue)}` : '🤝 *Pago 100% Contraentrega.*'} 💳 *Método de Pago:* ${order.paymentMethodName} ¡Hola ${currentBrand.shortName}! Acabo de registrar mi pedido en la web. ¿Me confirman despacho por favor?`; window.open(`https://wa.me/${officialWhatsapp}?text=${encodeURIComponent(text)}`, '_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-zinc-950 border border-zinc-800 rounded-xl px-3 py-2 text-sm text-white focus:border-orange-500 outline-hidden" />
setCustomerPhone(e.target.value)} className="w-full bg-zinc-950 border border-zinc-800 rounded-xl px-3 py-2 text-sm text-white focus:border-orange-500 outline-hidden" />
{/* City Selection */}
setAddress(e.target.value)} className="w-full bg-zinc-950 border border-zinc-800 rounded-xl px-3 py-2 text-sm text-white focus:border-orange-500 outline-hidden" />
setNeighborhood(e.target.value)} className="w-full bg-zinc-950 border border-zinc-800 rounded-xl px-3 py-2 text-sm text-white focus:border-orange-500 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-orange-500 bg-orange-950/20 shadow-md` : 'border-zinc-800 hover:border-zinc-700 bg-zinc-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)}
{depositAmount > 0 && (
Separación por Bold / Nequi / Daviplata: {formatCOP(depositAmount)}
Saldo a pagar al mensajero: {formatCOP(balanceDue)}
)}
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.

); }