'use client'; import { useState } from 'react'; import { useRouter } from 'next/navigation'; import { useQuery } from '@tanstack/react-query'; import { Header } from '@/components/layouts/header'; import { Card, CardContent, CardHeader, CardTitle, CardDescription, Button } from '@horux/shared-ui'; import { useTimbres } from '@/lib/hooks/use-facturacion'; import { getPaquetesCatalogo, comprarPaquete } from '@/lib/api/facturacion'; import { formatCurrency } from '@/lib/utils'; import { Receipt, Zap, Package, ArrowLeft, ShoppingCart, Loader2, CheckCircle2, AlertTriangle, Calendar } from 'lucide-react'; import { useAuthStore } from '@/stores/auth-store'; export default function TimbresPage() { const router = useRouter(); const { user } = useAuthStore(); const { data: timbres, isLoading } = useTimbres(); const { data: catalogo = [] } = useQuery({ queryKey: ['timbres-paquetes-catalogo'], queryFn: getPaquetesCatalogo, }); const [buying, setBuying] = useState(null); const canBuy = user?.role === 'owner' || user?.role === 'cfo'; const handleComprar = async (catalogoId: number) => { if (!canBuy) return; setBuying(catalogoId); try { const { checkoutUrl } = await comprarPaquete(catalogoId); window.location.href = checkoutUrl; } catch (err: any) { alert(err?.response?.data?.message || 'Error al iniciar compra'); setBuying(null); } }; const mensualDisp = timbres?.mensual?.disponibles ?? (timbres?.disponibles ?? 0); const mensualTotal = timbres?.mensual?.limite ?? (timbres?.limite ?? 0); const adicionales = timbres?.adicionales; return ( <>
{/* Status actual */}
Plan mensual Se resetea cada mes. No acumulable.
{mensualDisp}

de {mensualTotal} disponibles

{timbres?.mensual?.periodoFin && (

Renueva: {new Date(timbres.mensual.periodoFin).toLocaleDateString('es-MX')}

)}
Adicionales Comprados. Vigencia 1 año c/u.
{adicionales?.disponibles ?? 0}

de {adicionales?.total ?? 0} ({adicionales?.usados ?? 0} usados)

Total disponible Suma mensual + adicionales.
{timbres?.totalDisponibles ?? mensualDisp}

timbres listos para emitir

{/* Explicación de orden de consumo */}
Orden de consumo: cada factura emitida descuenta primero de tus timbres mensuales del plan. Solo cuando estos se agoten empieza a consumir de tus paquetes adicionales, comenzando por los más próximos a vencer para no desperdiciarlos.
{/* Catálogo de paquetes */}

Comprar paquetes

{!canBuy && (
Solo el dueño o CFO de la empresa pueden comprar paquetes adicionales.
)}
{catalogo.map(p => ( {p.cantidad.toLocaleString('es-MX')} timbres Vigencia 1 año desde la compra
{formatCurrency(p.precio)}

≈ {formatCurrency(p.precio / p.cantidad)} por timbre · IVA incluido

))}

Al completar el pago en MercadoPago, tu factura se emitirá automáticamente.

{/* Paquetes vigentes */} {adicionales && adicionales.paquetes.length > 0 && (

Paquetes vigentes

{adicionales.paquetes.map(p => { const expira = new Date(p.expiraEn); const diasRestantes = Math.floor((expira.getTime() - Date.now()) / (1000 * 60 * 60 * 24)); return ( ); })}
Cantidad Usados Disponibles Adquirido Expira
{p.cantidad.toLocaleString('es-MX')} {p.usados.toLocaleString('es-MX')} {p.disponibles.toLocaleString('es-MX')} {new Date(p.adquiridoEn).toLocaleDateString('es-MX')} {expira.toLocaleDateString('es-MX')} ({diasRestantes} días)
)} {/* Success banner post-MP */} {typeof window !== 'undefined' && new URLSearchParams(window.location.search).get('timbres') === 'success' && (
Pago recibido. Tu paquete se activará en cuanto MercadoPago confirme la transacción (~1-2 minutos). Recarga la página si no lo ves enseguida.
)}
); }