'use client';
import React from 'react';
import { Card } from '@/ui/Card';
import { Box } from '@/ui/Box';
import { Stack } from '@/ui/Stack';
import { Text } from '@/ui/Text';
import { Heading } from '@/ui/Heading';
import { Badge } from '@/ui/Badge';
import { Grid } from '@/ui/Grid';
import { Table, TableHead, TableBody, TableRow, TableHeader, TableCell } from '@/ui/Table';
import { PointsTable } from '@/ui/PointsTable';
import { RulebookTabs, type RulebookSection } from '@/ui/RulebookTabs';
import type { LeagueRulebookViewData } from '@/lib/view-data/LeagueRulebookViewData';
import { Surface } from '@/ui/Surface';
import { Clock } from 'lucide-react';
interface LeagueRulebookTemplateProps {
viewData: LeagueRulebookViewData;
activeSection: RulebookSection;
onSectionChange: (section: RulebookSection) => void;
loading?: boolean;
}
export function LeagueRulebookTemplate({
viewData,
activeSection,
onSectionChange,
loading = false,
}: LeagueRulebookTemplateProps) {
if (loading) {
return (
Loading rulebook...
);
}
if (!viewData || !viewData.scoringConfig) {
return (
Unable to load rulebook
);
}
const { scoringConfig } = viewData;
const primaryChampionship = scoringConfig.championships.find(c => c.type === 'driver') ?? scoringConfig.championships[0];
const positionPoints = viewData.positionPoints;
return (
{/* Header */}
Rulebook
Official rules and regulations
{scoringConfig.scoringPresetName || 'Custom Rules'}
{/* Navigation Tabs */}
{/* Content Sections */}
{activeSection === 'scoring' && (
{/* Quick Stats */}
{/* Weekend Structure */}
Weekend Structure & Timings
PRACTICE
20 min
QUALIFYING
30 min
SPRINT
—
MAIN RACE
40 min
{/* Points Table */}
{/* Bonus Points */}
{primaryChampionship?.bonusSummary && primaryChampionship.bonusSummary.length > 0 && (
Bonus Points
{primaryChampionship.bonusSummary.map((bonus, idx) => (
+
{bonus}
))}
)}
{/* Drop Policy */}
{!scoringConfig.dropPolicySummary.includes('All results count') && (
Drop Policy
{scoringConfig.dropPolicySummary}
Drop rules are applied automatically when calculating championship standings.
)}
)}
{activeSection === 'conduct' && (
Driver Conduct
)}
{activeSection === 'protests' && (
Protest Process
)}
{activeSection === 'penalties' && (
Penalty Guidelines
Infraction
Typical Penalty
Penalties are applied at steward discretion based on incident severity and driver history.
)}
);
}
function StatItem({ label, value }: { label: string, value: string | number }) {
return (
{label.toUpperCase()}
{value}
);
}
function ConductItem({ number, title, text }: { number: number, title: string, text: string }) {
return (
{number}. {title}
{text}
);
}
function PenaltyRow({ infraction, penalty, color }: { infraction: string, penalty: string, color?: string }) {
return (
{infraction}
{penalty}
);
}