"use client"; import { useState } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Card, CardContent, CardHeader, CardTitle, CardFooter } from "@/components/ui/card"; import { cn } from "@/lib/utils"; interface Player { id: string; firstName: string; lastName: string; } interface Match { id: string; round: number; position: number; status: string; team1Players: string[]; team2Players: string[]; team1Score: number[] | null; team2Score: number[] | null; winnerId: string | null; } interface MatchScoreDialogProps { match: Match; players: Map; onSave: (matchId: string, data: { score1: number[]; score2: number[]; winnerId: string; status: string; }) => Promise; onClose: () => void; } export function MatchScoreDialog({ match, players, onSave, onClose, }: MatchScoreDialogProps) { const [sets, setSets] = useState>(() => { // Initialize with existing scores or 3 empty sets const existingScore1 = match.team1Score || []; const existingScore2 = match.team2Score || []; const initialSets = []; for (let i = 0; i < 3; i++) { initialSets.push({ team1: existingScore1[i]?.toString() || "", team2: existingScore2[i]?.toString() || "", }); } return initialSets; }); const [selectedWinner, setSelectedWinner] = useState<"team1" | "team2" | null>( () => { if (match.winnerId) { if (match.team1Players.includes(match.winnerId)) return "team1"; if (match.team2Players.includes(match.winnerId)) return "team2"; } return null; } ); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); const getTeamName = (playerIds: string[]): string => { return playerIds .map((id) => { const player = players.get(id); if (!player) return "Desconocido"; return `${player.firstName} ${player.lastName.charAt(0)}.`; }) .join(" / "); }; const team1Name = getTeamName(match.team1Players); const team2Name = getTeamName(match.team2Players); const handleSetChange = (setIndex: number, team: "team1" | "team2", value: string) => { // Only allow numbers if (value && !/^\d*$/.test(value)) return; const newSets = [...sets]; newSets[setIndex] = { ...newSets[setIndex], [team]: value, }; setSets(newSets); }; const calculateWinnerFromScore = (): "team1" | "team2" | null => { let team1Sets = 0; let team2Sets = 0; sets.forEach((set) => { const t1 = parseInt(set.team1) || 0; const t2 = parseInt(set.team2) || 0; if (t1 > t2) team1Sets++; if (t2 > t1) team2Sets++; }); if (team1Sets > team2Sets) return "team1"; if (team2Sets > team1Sets) return "team2"; return null; }; const handleAutoSelectWinner = () => { const winner = calculateWinnerFromScore(); if (winner) { setSelectedWinner(winner); } }; const handleSave = async () => { setError(null); if (!selectedWinner) { setError("Selecciona un ganador"); return; } // Build scores array (filter out empty sets) const score1: number[] = []; const score2: number[] = []; let hasValidScore = false; sets.forEach((set) => { const t1 = set.team1 !== "" ? parseInt(set.team1) : null; const t2 = set.team2 !== "" ? parseInt(set.team2) : null; if (t1 !== null && t2 !== null) { score1.push(t1); score2.push(t2); hasValidScore = true; } }); if (!hasValidScore) { setError("Ingresa al menos un set con resultado"); return; } const winnerId = selectedWinner === "team1" ? match.team1Players[0] : match.team2Players[0]; setIsLoading(true); try { await onSave(match.id, { score1, score2, winnerId, status: "COMPLETED", }); onClose(); } catch (err) { setError(err instanceof Error ? err.message : "Error al guardar"); } finally { setIsLoading(false); } }; const handleOverlayClick = (e: React.MouseEvent) => { if (e.target === e.currentTarget) { onClose(); } }; return (
Resultado del Partido

Ronda {match.round}, Partido {match.position}

{error && (
{error}
)} {/* Score Grid */}
{/* Header */}
Set 1
Set 2
Set 3
{/* Team 1 */}
{sets.map((set, i) => ( handleSetChange(i, "team1", e.target.value)} onBlur={handleAutoSelectWinner} className="text-center px-2" /> ))}
{/* Team 2 */}
{sets.map((set, i) => ( handleSetChange(i, "team2", e.target.value)} onBlur={handleAutoSelectWinner} className="text-center px-2" /> ))}
{/* Winner Selection Info */}
{selectedWinner ? ( Ganador:{" "} {selectedWinner === "team1" ? team1Name : team2Name} ) : ( Haz clic en el equipo ganador o ingresa el marcador )}
); }