'use client'; import { useState, useEffect } from 'react'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from '@/components/ui/dialog'; import { Badge } from '@/components/ui/badge'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Separator } from '@/components/ui/separator'; import { ScrollArea } from '@/components/ui/scroll-area'; import { Calendar, Target, TrendingUp, Package, ShoppingCart, Percent, DollarSign, Users, Clock, CheckCircle, XCircle, Info } from 'lucide-react'; import { Promotion, Product } from '@/lib/types/promotion'; import { fetchClient } from '@/lib/api'; import { toast } from '@/components/ui/use-toast'; interface PromotionDetailsModalProps { promotion: Promotion | null; onClose: () => void; } export default function PromotionDetailsModal({ promotion, onClose }: PromotionDetailsModalProps) { const [products, setProducts] = useState([]); const [loading, setLoading] = useState(false); useEffect(() => { if (promotion && (promotion.blacklistedProducts.length > 0 || promotion.specificProducts.length > 0)) { loadProducts(); } }, [promotion]); const loadProducts = async () => { setLoading(true); try { const response = await fetchClient('/promotions/products/all'); setProducts(response || []); } catch (error) { console.error('Failed to fetch products:', error); toast({ title: 'Warning', description: 'Could not load product details', variant: 'destructive', }); } finally { setLoading(false); } }; const getProductDetails = (productIds: string[]): Product[] => { return products.filter(product => productIds.includes(product._id)); }; const formatDate = (dateString: string | null) => { if (!dateString) return 'No end date'; return new Date(dateString).toLocaleDateString('en-GB', { day: 'numeric', month: 'short', year: 'numeric', hour: '2-digit', minute: '2-digit' }); }; const calculateUsagePercentage = () => { if (!promotion?.maxUsage) return 0; return Math.round((promotion.usageCount / promotion.maxUsage) * 100); }; const getDiscountDisplay = () => { if (!promotion) return ''; return promotion.discountType === 'percentage' ? `${promotion.discountValue}%` : `£${promotion.discountValue.toFixed(2)}`; }; const getApplicabilityText = () => { if (!promotion) return ''; switch (promotion.applicableProducts) { case 'all': return 'All products (except blacklisted)'; case 'specific': return 'Only specific products'; case 'exclude_specific': return 'All products except specific ones'; default: return 'All products'; } }; const isActive = () => { if (!promotion) return false; const now = new Date(); const startDate = new Date(promotion.startDate); const endDate = promotion.endDate ? new Date(promotion.endDate) : null; return promotion.isActive && now >= startDate && (!endDate || now <= endDate) && (!promotion.maxUsage || promotion.usageCount < promotion.maxUsage); }; if (!promotion) return null; return (
{promotion.code} Comprehensive promotion details and analytics
{isActive() ? 'Active' : 'Inactive'}
{/* Basic Information */} Basic Information

{promotion.code}

{promotion.description || 'No description provided'}

{promotion.discountType === 'percentage' ? ( ) : ( )}

{getDiscountDisplay()}

{promotion.discountType === 'percentage' ? 'Percentage' : 'Fixed Amount'}

{promotion.minOrderAmount > 0 ? `£${promotion.minOrderAmount.toFixed(2)}` : 'None'}

Required minimum

{promotion.maxUsage ? promotion.maxUsage.toLocaleString() : 'Unlimited'}

Maximum uses

{/* Usage Analytics */} Usage Analytics
Current Usage {promotion.usageCount} / {promotion.maxUsage || '∞'}
{promotion.maxUsage && (

{calculateUsagePercentage()}% of limit used

)}
Total Uses {promotion.usageCount.toLocaleString()}
Remaining Uses {promotion.maxUsage ? (promotion.maxUsage - promotion.usageCount).toLocaleString() : 'Unlimited' }
{/* Validity Period */} Validity Period

{formatDate(promotion.startDate)}

{promotion.endDate ? ( ) : ( )}

{promotion.endDate ? formatDate(promotion.endDate) : 'No expiry date'}

{/* Product Eligibility */} Product Eligibility

{getApplicabilityText()}

{promotion.applicableProducts === 'specific' && promotion.specificProducts.length > 0 && (
{loading ? (

Loading products...

) : ( getProductDetails(promotion.specificProducts).map((product) => (
{product.name} {!product.enabled && ( Disabled )}
)) )}
)} {promotion.blacklistedProducts.length > 0 && (
{loading ? (

Loading products...

) : ( getProductDetails(promotion.blacklistedProducts).map((product) => (
{product.name} {!product.enabled && ( Disabled )}
)) )}
)} {promotion.applicableProducts === 'all' && promotion.blacklistedProducts.length === 0 && (
This promotion applies to all products in your store
)}
{/* Metadata */} Additional Information

{formatDate(promotion.createdAt)}

{formatDate(promotion.updatedAt)}

); }