'use client'; import { useState, useEffect } from 'react'; import { useRouter, useSearchParams } from 'next/navigation'; import { motion, useReducedMotion, AnimatePresence } from 'framer-motion'; import Link from 'next/link'; import Card from '@/components/ui/Card'; import Button from '@/components/ui/Button'; import StatusBadge from '@/components/ui/StatusBadge'; import InfoBanner from '@/components/ui/InfoBanner'; import { Megaphone, Trophy, Users, Eye, Calendar, ExternalLink, Plus, ChevronRight, Check, Clock, XCircle, Car, Flag, Search, Filter, TrendingUp, BarChart3, ArrowUpRight, ArrowDownRight, AlertCircle, Send, ThumbsUp, ThumbsDown, RefreshCw, Handshake } from 'lucide-react'; // ============================================================================ // Types // ============================================================================ type SponsorshipType = 'all' | 'leagues' | 'teams' | 'drivers' | 'races' | 'platform'; type SponsorshipStatus = 'all' | 'active' | 'pending_approval' | 'approved' | 'rejected' | 'expired'; interface Sponsorship { id: string; type: SponsorshipType; entityId: string; entityName: string; tier?: 'main' | 'secondary'; status: 'active' | 'pending_approval' | 'approved' | 'rejected' | 'expired'; applicationDate?: Date; approvalDate?: Date; rejectionReason?: string; startDate: Date; endDate: Date; price: number; impressions: number; impressionsChange?: number; engagement?: number; details?: string; // For pending approvals entityOwner?: string; applicationMessage?: string; } // ============================================================================ // Mock Data - Updated to show application workflow // ============================================================================ const MOCK_SPONSORSHIPS: Sponsorship[] = [ // Active sponsorships (approved and started) { id: 's1', type: 'leagues', entityId: 'l1', entityName: 'GT3 Masters Championship', tier: 'main', status: 'active', applicationDate: new Date('2025-09-15'), approvalDate: new Date('2025-09-18'), startDate: new Date('2025-10-01'), endDate: new Date('2026-02-28'), price: 1200, impressions: 45200, impressionsChange: 12.5, engagement: 4.2, details: '48 drivers • 12 races', entityOwner: 'Championship Admin', }, { id: 's2', type: 'leagues', entityId: 'l2', entityName: 'Endurance Pro Series', tier: 'secondary', status: 'active', applicationDate: new Date('2025-10-20'), approvalDate: new Date('2025-10-25'), startDate: new Date('2025-11-01'), endDate: new Date('2026-03-31'), price: 500, impressions: 38400, impressionsChange: 8.3, engagement: 3.8, details: '72 drivers • 6 races', entityOwner: 'Endurance Racing LLC', }, { id: 's3', type: 'teams', entityId: 't1', entityName: 'Velocity Racing', status: 'active', applicationDate: new Date('2025-08-25'), approvalDate: new Date('2025-08-26'), startDate: new Date('2025-09-01'), endDate: new Date('2026-08-31'), price: 400, impressions: 12300, impressionsChange: 5.2, engagement: 5.1, details: '4 drivers • GT3 & LMP', entityOwner: 'Team Principal', }, // Pending approval (waiting for entity owner) { id: 's9', type: 'leagues', entityId: 'l3', entityName: 'Formula Sim Series', tier: 'main', status: 'pending_approval', applicationDate: new Date('2025-12-14'), startDate: new Date('2026-01-01'), endDate: new Date('2026-06-30'), price: 1500, impressions: 0, details: '36 drivers • F3 class', entityOwner: 'Formula Sim Organization', applicationMessage: 'We would love to be your main sponsor for the upcoming season.', }, { id: 's10', type: 'teams', entityId: 't3', entityName: 'Phoenix Racing Team', status: 'pending_approval', applicationDate: new Date('2025-12-12'), startDate: new Date('2026-01-01'), endDate: new Date('2026-12-31'), price: 600, impressions: 0, details: '5 drivers • Multi-class', entityOwner: 'Phoenix Team Manager', applicationMessage: 'Interested in sponsoring your team for the full 2026 season.', }, { id: 's11', type: 'drivers', entityId: 'd3', entityName: 'James Rodriguez', status: 'pending_approval', applicationDate: new Date('2025-12-10'), startDate: new Date('2026-01-01'), endDate: new Date('2026-12-31'), price: 250, impressions: 0, details: 'Rising rookie • GT3 Masters', entityOwner: 'James Rodriguez', applicationMessage: 'Would like to support your racing career.', }, // Recently approved (not yet started) { id: 's12', type: 'races', entityId: 'r1', entityName: 'Spa 24 Hours', status: 'approved', applicationDate: new Date('2025-12-01'), approvalDate: new Date('2025-12-05'), startDate: new Date('2025-12-20'), endDate: new Date('2025-12-21'), price: 300, impressions: 0, details: 'Endurance Pro Series • Dec 20-21', entityOwner: 'Race Director', }, { id: 's13', type: 'drivers', entityId: 'd4', entityName: 'Emma Wilson', status: 'approved', applicationDate: new Date('2025-12-08'), approvalDate: new Date('2025-12-10'), startDate: new Date('2026-01-01'), endDate: new Date('2026-12-31'), price: 180, impressions: 0, details: 'Touring Car specialist', entityOwner: 'Emma Wilson', }, // Rejected applications { id: 's14', type: 'leagues', entityId: 'l4', entityName: 'Elite GT Championship', tier: 'main', status: 'rejected', applicationDate: new Date('2025-11-20'), startDate: new Date('2026-01-01'), endDate: new Date('2026-06-30'), price: 2000, impressions: 0, details: '24 drivers • Invite-only', entityOwner: 'Elite Racing Committee', rejectionReason: 'Main sponsor position already filled for the upcoming season.', }, { id: 's15', type: 'teams', entityId: 't4', entityName: 'Apex Motorsport', status: 'rejected', applicationDate: new Date('2025-11-15'), startDate: new Date('2026-01-01'), endDate: new Date('2026-12-31'), price: 450, impressions: 0, details: '3 drivers • LMP2', entityOwner: 'Apex Team Owner', rejectionReason: 'Already have exclusive sponsor agreement in this category.', }, // Existing active ones { id: 's4', type: 'teams', entityId: 't2', entityName: 'Storm Motorsport', status: 'active', applicationDate: new Date('2025-10-01'), approvalDate: new Date('2025-10-05'), startDate: new Date('2025-10-15'), endDate: new Date('2026-10-14'), price: 350, impressions: 8900, impressionsChange: -2.1, engagement: 4.5, details: '3 drivers • Formula', entityOwner: 'Storm Racing LLC', }, { id: 's5', type: 'drivers', entityId: 'd1', entityName: 'Max Velocity', status: 'active', applicationDate: new Date('2025-10-20'), approvalDate: new Date('2025-10-21'), startDate: new Date('2025-11-01'), endDate: new Date('2026-10-31'), price: 200, impressions: 8200, impressionsChange: 15.8, engagement: 6.2, details: 'Velocity Racing • P1 in GT3 Masters', entityOwner: 'Max Velocity', }, { id: 's6', type: 'drivers', entityId: 'd2', entityName: 'Sarah Storm', status: 'active', applicationDate: new Date('2025-09-25'), approvalDate: new Date('2025-09-26'), startDate: new Date('2025-10-01'), endDate: new Date('2026-09-30'), price: 150, impressions: 6100, impressionsChange: 22.4, engagement: 5.8, details: 'Storm Motorsport • Rising star', entityOwner: 'Sarah Storm', }, { id: 's8', type: 'platform', entityId: 'p1', entityName: 'Homepage Banner', status: 'active', applicationDate: new Date('2025-11-25'), approvalDate: new Date('2025-11-25'), startDate: new Date('2025-12-01'), endDate: new Date('2025-12-31'), price: 500, impressions: 52000, impressionsChange: 3.4, engagement: 2.1, details: 'Header position • All pages', entityOwner: 'GridPilot', }, ]; // ============================================================================ // Configuration // ============================================================================ const TYPE_CONFIG = { leagues: { icon: Trophy, color: 'text-primary-blue', bgColor: 'bg-primary-blue/10', label: 'League' }, teams: { icon: Users, color: 'text-purple-400', bgColor: 'bg-purple-400/10', label: 'Team' }, drivers: { icon: Car, color: 'text-performance-green', bgColor: 'bg-performance-green/10', label: 'Driver' }, races: { icon: Flag, color: 'text-warning-amber', bgColor: 'bg-warning-amber/10', label: 'Race' }, platform: { icon: Megaphone, color: 'text-racing-red', bgColor: 'bg-racing-red/10', label: 'Platform' }, all: { icon: BarChart3, color: 'text-gray-400', bgColor: 'bg-gray-400/10', label: 'All' }, }; const STATUS_CONFIG = { active: { icon: Check, color: 'text-performance-green', bgColor: 'bg-performance-green/10', borderColor: 'border-performance-green/30', label: 'Active' }, pending_approval: { icon: Clock, color: 'text-warning-amber', bgColor: 'bg-warning-amber/10', borderColor: 'border-warning-amber/30', label: 'Awaiting Approval' }, approved: { icon: ThumbsUp, color: 'text-primary-blue', bgColor: 'bg-primary-blue/10', borderColor: 'border-primary-blue/30', label: 'Approved' }, rejected: { icon: ThumbsDown, color: 'text-racing-red', bgColor: 'bg-racing-red/10', borderColor: 'border-racing-red/30', label: 'Declined' }, expired: { icon: XCircle, color: 'text-gray-400', bgColor: 'bg-gray-400/10', borderColor: 'border-gray-400/30', label: 'Expired' }, }; // ============================================================================ // Components // ============================================================================ function SponsorshipCard({ sponsorship }: { sponsorship: Sponsorship }) { const router = useRouter(); const shouldReduceMotion = useReducedMotion(); const typeConfig = TYPE_CONFIG[sponsorship.type as keyof typeof TYPE_CONFIG]; const statusConfig = STATUS_CONFIG[sponsorship.status]; const TypeIcon = typeConfig.icon; const StatusIcon = statusConfig.icon; const daysRemaining = Math.ceil((sponsorship.endDate.getTime() - Date.now()) / (1000 * 60 * 60 * 24)); const isExpiringSoon = daysRemaining > 0 && daysRemaining <= 30; const isPending = sponsorship.status === 'pending_approval'; const isRejected = sponsorship.status === 'rejected'; const isApproved = sponsorship.status === 'approved'; const getEntityLink = () => { switch (sponsorship.type) { case 'leagues': return `/leagues/${sponsorship.entityId}`; case 'teams': return `/teams/${sponsorship.entityId}`; case 'drivers': return `/drivers/${sponsorship.entityId}`; case 'races': return `/races/${sponsorship.entityId}`; default: return '#'; } }; return ( {/* Header */}
{typeConfig.label} {sponsorship.tier && ( {sponsorship.tier === 'main' ? 'Main Sponsor' : 'Secondary'} )}
{statusConfig.label}
{/* Entity Name */}

{sponsorship.entityName}

{sponsorship.details && (

{sponsorship.details}

)} {/* Application/Approval Info for non-active states */} {isPending && (
Application Pending

Sent to {sponsorship.entityOwner} on{' '} {sponsorship.applicationDate?.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' })}

{sponsorship.applicationMessage && (

"{sponsorship.applicationMessage}"

)}
)} {isApproved && (
Approved!

Approved by {sponsorship.entityOwner} on{' '} {sponsorship.approvalDate?.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' })}

Starts {sponsorship.startDate.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}

)} {isRejected && (
Application Declined
{sponsorship.rejectionReason && (

Reason: {sponsorship.rejectionReason}

)}
)} {/* Metrics Grid - Only show for active sponsorships */} {sponsorship.status === 'active' && (
Impressions
{sponsorship.impressions.toLocaleString()} {sponsorship.impressionsChange !== undefined && sponsorship.impressionsChange !== 0 && ( 0 ? 'text-performance-green' : 'text-racing-red' }`}> {sponsorship.impressionsChange > 0 ? : } {Math.abs(sponsorship.impressionsChange)}% )}
{sponsorship.engagement && (
Engagement
{sponsorship.engagement}%
)}
Period
{sponsorship.startDate.toLocaleDateString('en-US', { month: 'short', year: 'numeric' })} - {sponsorship.endDate.toLocaleDateString('en-US', { month: 'short', year: 'numeric' })}
Investment
${sponsorship.price}
)} {/* Basic info for non-active */} {sponsorship.status !== 'active' && (
{sponsorship.startDate.toLocaleDateString('en-US', { month: 'short', year: 'numeric' })} - {sponsorship.endDate.toLocaleDateString('en-US', { month: 'short', year: 'numeric' })}
${sponsorship.price}
)} {/* Footer */}
{sponsorship.status === 'active' && ( {daysRemaining > 0 ? `${daysRemaining} days remaining` : 'Ended'} )} {isPending && ( Waiting for response... )}
{sponsorship.type !== 'platform' && ( )} {isPending && ( )} {sponsorship.status === 'active' && ( )}
); } // ============================================================================ // Main Component // ============================================================================ export default function SponsorCampaignsPage() { const router = useRouter(); const searchParams = useSearchParams(); const shouldReduceMotion = useReducedMotion(); const initialType = (searchParams.get('type') as SponsorshipType) || 'all'; const [typeFilter, setTypeFilter] = useState(initialType); const [statusFilter, setStatusFilter] = useState('all'); const [searchQuery, setSearchQuery] = useState(''); const [loading, setLoading] = useState(true); useEffect(() => { const timer = setTimeout(() => setLoading(false), 300); return () => clearTimeout(timer); }, []); // Filter sponsorships const filteredSponsorships = MOCK_SPONSORSHIPS.filter(s => { if (typeFilter !== 'all' && s.type !== typeFilter) return false; if (statusFilter !== 'all' && s.status !== statusFilter) return false; if (searchQuery && !s.entityName.toLowerCase().includes(searchQuery.toLowerCase())) return false; return true; }); // Calculate stats const stats = { total: MOCK_SPONSORSHIPS.length, active: MOCK_SPONSORSHIPS.filter(s => s.status === 'active').length, pending: MOCK_SPONSORSHIPS.filter(s => s.status === 'pending_approval').length, approved: MOCK_SPONSORSHIPS.filter(s => s.status === 'approved').length, rejected: MOCK_SPONSORSHIPS.filter(s => s.status === 'rejected').length, totalInvestment: MOCK_SPONSORSHIPS.filter(s => s.status === 'active').reduce((sum, s) => sum + s.price, 0), totalImpressions: MOCK_SPONSORSHIPS.reduce((sum, s) => sum + s.impressions, 0), }; // Stats by type const statsByType = { leagues: MOCK_SPONSORSHIPS.filter(s => s.type === 'leagues').length, teams: MOCK_SPONSORSHIPS.filter(s => s.type === 'teams').length, drivers: MOCK_SPONSORSHIPS.filter(s => s.type === 'drivers').length, races: MOCK_SPONSORSHIPS.filter(s => s.type === 'races').length, platform: MOCK_SPONSORSHIPS.filter(s => s.type === 'platform').length, }; if (loading) { return (

Loading sponsorships...

); } return (
{/* Header */}

My Sponsorships

Manage applications and active sponsorship campaigns

{/* Info Banner about how sponsorships work */} {stats.pending > 0 && (

You have {stats.pending} pending application{stats.pending !== 1 ? 's' : ''} waiting for approval. League admins, team owners, and drivers review applications before accepting sponsorships.

)} {/* Quick Stats */}
{stats.total}
Total
{stats.active}
Active
0 ? 'border-warning-amber/30' : ''}`}>
{stats.pending}
Pending
{stats.approved}
Approved
${stats.totalInvestment.toLocaleString()}
Active Investment
{(stats.totalImpressions / 1000).toFixed(0)}k
Impressions
{/* Filters */}
{/* Search */}
setSearchQuery(e.target.value)} className="w-full pl-10 pr-4 py-2.5 rounded-lg border border-charcoal-outline bg-iron-gray text-white placeholder-gray-500 focus:border-primary-blue focus:outline-none" />
{/* Type Filter */}
{(['all', 'leagues', 'teams', 'drivers', 'races', 'platform'] as const).map((type) => { const config = TYPE_CONFIG[type]; const Icon = config.icon; const count = type === 'all' ? stats.total : statsByType[type]; return ( ); })}
{/* Status Filter */}
{(['all', 'active', 'pending_approval', 'approved', 'rejected'] as const).map((status) => { const config = status === 'all' ? { label: 'All', color: 'text-gray-400' } : STATUS_CONFIG[status]; const count = status === 'all' ? stats.total : MOCK_SPONSORSHIPS.filter(s => s.status === status).length; return ( ); })}
{/* Sponsorship List */} {filteredSponsorships.length === 0 ? (

No sponsorships found

{searchQuery || typeFilter !== 'all' || statusFilter !== 'all' ? 'Try adjusting your filters to see more results.' : 'Start sponsoring leagues, teams, or drivers to grow your brand visibility.'}

) : (
{filteredSponsorships.map((sponsorship) => ( ))}
)}
); }