"use client" import { useState, useEffect } from "react" import { useRouter } from "next/navigation" import Navigation from "@/components/Navigation" interface Player { id: number name: string currentElo: number } interface TournamentFormData { name: string description: string eventDate: string format: string maxParticipants: string participants: number[] // Array of player IDs } export default function NewTournamentPage() { const router = useRouter() const [step, setStep] = useState(1) const [formData, setFormData] = useState({ name: "", description: "", eventDate: "", format: "round_robin", maxParticipants: "", participants: [], }) const [error, setError] = useState("") const [isLoading, setIsLoading] = useState(false) // Player search state const [searchQuery, setSearchQuery] = useState("") const [searchResults, setSearchResults] = useState([]) const [selectedPlayers, setSelectedPlayers] = useState([]) const [isSearching, setIsSearching] = useState(false) // Search for players as user types useEffect(() => { const searchPlayers = async () => { if (searchQuery.length < 2) { setSearchResults([]) return } setIsSearching(true) try { const response = await fetch(`/api/players/search?q=${encodeURIComponent(searchQuery)}`) const data = await response.json() if (response.ok) { // Filter out already selected players const availablePlayers = data.players.filter( (p: Player) => !selectedPlayers.find(sp => sp.id === p.id) ) setSearchResults(availablePlayers) } } catch (err) { console.error("Search failed:", err) } finally { setIsSearching(false) } } const debounceTimer = setTimeout(searchPlayers, 300) return () => clearTimeout(debounceTimer) }, [searchQuery, selectedPlayers]) const addPlayer = (player: Player) => { setSelectedPlayers([...selectedPlayers, player]) setSearchQuery("") setSearchResults([]) } const removePlayer = (playerId: number) => { setSelectedPlayers(selectedPlayers.filter(p => p.id !== playerId)) } const handleChange = (e: React.ChangeEvent) => { setFormData({ ...formData, [e.target.name]: e.target.value, }) } const nextStep = () => { if (step === 1) { if (!formData.name.trim()) { setError("Tournament name is required") return } if (selectedPlayers.length < 2) { setError("At least 2 participants are required") return } } setError("") setStep(step + 1) } const prevStep = () => { setStep(step - 1) setError("") } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setError("") setIsLoading(true) try { // First create the tournament const tournamentResponse = await fetch("/api/tournaments", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ name: formData.name, description: formData.description, eventDate: formData.eventDate || null, format: formData.format, maxParticipants: formData.maxParticipants ? parseInt(formData.maxParticipants) : null, }), }) const tournamentData = await tournamentResponse.json() if (!tournamentResponse.ok) { throw new Error(tournamentData.error || "Failed to create tournament") } const tournamentId = tournamentData.tournament.id // Add participants to the tournament if (selectedPlayers.length > 0) { await fetch(`/api/tournaments/${tournamentId}/participants`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ playerIds: selectedPlayers.map(p => p.id), }), }) } // Redirect to game entry page router.push(`/admin/tournaments/${tournamentId}/entry`) } catch (err: any) { setError(err.message) } finally { setIsLoading(false) } } return (

Create New Tournament

{/* Step Indicator */}
= 1 ? 'bg-green-600 text-white' : 'bg-gray-300 text-gray-600'}`}> 1
= 2 ? 'bg-green-600' : 'bg-gray-300'}`} />
= 2 ? 'bg-green-600 text-white' : 'bg-gray-300 text-gray-600'}`}> 2
Tournament Details Participants
{error && (
{error}
)} {/* Step 1: Tournament Details */} {step === 1 && ( <>