"use client";
import { GroupTable, Match, Team, ThirdPlaceRow } from "@/lib/types";
import { ThirdAssignment } from "@/lib/bracket";
import { resolveBracket, ResolvedSide, ResolvedTie } from "@/lib/resolve-bracket";
function Side({ s, prob }: { s: ResolvedSide; prob?: number | null }) {
return (
{s.teamId ? (
<>
{s.label}
{s.code && {s.code}}
>
) : (
{s.label}
)}
{prob != null && prob > 0 && (
{Math.round(prob * 100)}%
)}
{s.score != null ? s.score : "–"}
);
}
function Tie({ tie, isFinal }: { tie: ResolvedTie; isFinal?: boolean }) {
return (
#{tie.matchNumber}
);
}
export default function Bracket({
matches, teams, tables, thirds, assignment, annexResolved,
}: {
matches: Match[]; teams: Team[]; tables: GroupTable[];
thirds: ThirdPlaceRow[]; assignment: ThirdAssignment | null; annexResolved: boolean;
}) {
const { r32, later } = resolveBracket(matches, teams, tables, thirds, assignment);
const pick = (nums: number[]) => nums.map((n) => later[n]).filter(Boolean);
const r16 = pick([89, 90, 91, 92, 93, 94, 95, 96]);
const qf = pick([97, 98, 99, 100]);
const sf = pick([101, 102]);
const fin = later[104];
const third = later[103];
return (
Annex-C-Zuordnung der Drittplatzierten:
{annexResolved
? "aufgelöst — die acht Dritten sind den Gruppensiegern fest zugeteilt"
: "noch offen — sobald die 8 besten Dritten feststehen, verbindet sich der Baum automatisch"}
Letzte 32
{r32.map((t) => )}
Achtelfinale
{r16.map((t) => )}
Viertelfinale
{qf.map((t) => )}
Halbfinale
{sf.map((t) => )}
Sieger / weiter
Finale
Platzhalter offen
%-Werte: Polymarket-Wahrscheinlichkeit (falls verfügbar)
);
}