'use client'; import { BillingSummaryPanel } from '@/components/sponsors/BillingSummaryPanel'; import { PricingTableShell, PricingTier } from '@/components/sponsors/PricingTableShell'; import { SponsorBrandingPreview } from '@/components/sponsors/SponsorBrandingPreview'; import { SponsorDashboardHeader } from '@/components/sponsors/SponsorDashboardHeader'; import { SponsorStatusChip } from '@/components/sponsors/SponsorStatusChip'; import { routes } from '@/lib/routing/RouteConfig'; import { siteConfig } from '@/lib/siteConfig'; import { SharedBox, SharedButton, SharedStack, SharedText, SharedIcon, SharedCard, SharedContainer } from '@/components/shared/UIComponents'; import { Heading } from '@/ui/Heading'; import { Link } from '@/ui/Link'; import { Grid } from '@/ui/Grid'; import { GridItem } from '@/ui/GridItem'; import { Surface } from '@/ui/Surface'; import { BarChart3, Calendar, CreditCard, Eye, FileText, Flag, Megaphone, TrendingUp, Trophy, type LucideIcon } from 'lucide-react'; import { TemplateProps } from '@/lib/contracts/components/ComponentContracts'; import { ViewData } from '@/lib/contracts/view-data/ViewData'; export interface SponsorLeagueDetailViewData extends ViewData { league: { id: string; name: string; game: string; season: string; description: string; tier: 'premium' | 'standard' | 'starter'; rating: number; formattedRating: string; drivers: number; formattedDrivers: string; races: number; formattedRaces: string; completedRaces: number; racesLeft: number; formattedRacesLeft: string; engagement: number; formattedEngagement: string; totalImpressions: number; formattedTotalImpressions: string; projectedTotal: number; formattedProjectedTotal: string; mainSponsorCpm: number; formattedMainSponsorCpm: string; avgViewsPerRace: number; formattedAvgViewsPerRace: string; nextRace?: { name: string; date: string; formattedDate: string; }; sponsorSlots: { main: { available: boolean; price: number; priceLabel: string; benefits: string[]; }; secondary: { available: number; total: number; price: number; priceLabel: string; benefits: string[]; }; }; tierConfig: { bgColor: string; color: string; border: string; }; }; drivers: Array<{ id: string; position: number; positionLabel: string; name: string; team: string; country: string; races: number; formattedRaces: string; impressions: number; formattedImpressions: string; }>; races: Array<{ id: string; name: string; date: string; formattedDate: string; status: 'completed' | 'upcoming'; views: number; formattedViews: string; }>; } export type SponsorLeagueDetailTab = 'overview' | 'drivers' | 'races' | 'sponsor'; interface SponsorLeagueDetailTemplateProps extends TemplateProps { activeTab: SponsorLeagueDetailTab; setActiveTab: (tab: SponsorLeagueDetailTab) => void; selectedTier: 'main' | 'secondary'; setSelectedTier: (tier: 'main' | 'secondary') => void; } export function SponsorLeagueDetailTemplate({ viewData, activeTab, setActiveTab, selectedTier, setSelectedTier }: SponsorLeagueDetailTemplateProps) { const league = viewData.league; const billingStats: Array<{ label: string; value: string | number; icon: LucideIcon; variant: 'info' | 'success' | 'warning' | 'default'; }> = [ { label: 'Total Views', value: league.formattedTotalImpressions, icon: Eye, variant: 'info', }, { label: 'Avg/Race', value: league.formattedAvgViewsPerRace, icon: TrendingUp, variant: 'success', }, { label: 'Engagement', value: league.formattedEngagement, icon: BarChart3, variant: 'warning', }, { label: 'Races Left', value: league.formattedRacesLeft, icon: Calendar, variant: 'default', }, ]; const pricingTiers: PricingTier[] = [ { id: 'main', name: 'Main Sponsor', price: league.sponsorSlots.main.price, priceLabel: league.sponsorSlots.main.priceLabel, period: 'Season', description: 'Exclusive primary branding across all league assets.', features: league.sponsorSlots.main.benefits, available: league.sponsorSlots.main.available, isPopular: true, }, { id: 'secondary', name: 'Secondary Sponsor', price: league.sponsorSlots.secondary.price, priceLabel: league.sponsorSlots.secondary.priceLabel, period: 'Season', description: 'Supporting branding on cars and broadcast overlays.', features: league.sponsorSlots.secondary.benefits, available: league.sponsorSlots.secondary.available > 0, } ]; return ( {/* Breadcrumb */} Dashboard / Leagues / {league.name} {/* Header */} console.log('Refresh')} /> {/* Quick Stats */} {/* Tabs */} {(['overview', 'drivers', 'races', 'sponsor'] as const).map((tab) => ( setActiveTab(tab)} style={{ paddingBottom: '0.75rem' }} cursor="pointer" borderBottom={activeTab === tab} borderColor={activeTab === tab ? 'border-primary-blue' : 'border-transparent'} color={activeTab === tab ? 'text-primary-blue' : 'text-gray-400'} > {tab === 'sponsor' ? '🎯 Become a Sponsor' : tab} ))} {/* Tab Content */} {activeTab === 'overview' && ( League Information }> Sponsorship Value {league.nextRace && ( }> Next Race {league.nextRace.name} {league.nextRace.formattedDate} View Schedule )} )} {activeTab === 'drivers' && ( Championship Standings Top drivers carrying sponsor branding {viewData.drivers.map((driver, index) => ( {driver.positionLabel} {driver.name} {driver.team} • {driver.country} {driver.formattedRaces} races {driver.formattedImpressions} views ))} )} {activeTab === 'races' && ( Race Calendar Season schedule with view statistics {viewData.races.map((race, index) => ( {race.name} {race.formattedDate} {race.status === 'completed' ? ( {race.formattedViews} views ) : ( )} ))} )} {activeTab === 'sponsor' && ( setSelectedTier(id as 'main' | 'secondary')} /> }> Sponsorship Summary Total (excl. VAT) ${((selectedTier === 'main' ? league.sponsorSlots.main.price : league.sponsorSlots.secondary.price) * (1 + siteConfig.fees.platformFeePercent / 100)).toFixed(2)} {siteConfig.vat.notice} }> Request Sponsorship }> Download Info Pack )} ); } function InfoRow({ label, value, color = 'text-white', last }: { label: string, value: string | number, color?: string, last?: boolean }) { return ( {label} {value} ); }