import { NextResponse } from "next/server"; import type { NextRequest } from "next/server"; import { fetchMatchesAndTeamsFifa, fetchOdds, attachOdds, attachKOOdds, fetchFifaScores, applyFifaScores, attachFifaGoals } from "@/lib/feeds"; import { computeGroupTables, computeThirdPlaceTable } from "@/lib/standings"; import { qualifiedThirdGroups, resolveAnnexC } from "@/lib/bracket"; import { securelyQualifiedThirdTeams } from "@/lib/third-place-security"; // Diese Route wird vom Frontend gepollt. FIFA-API als Primärquelle. export const dynamic = "force-dynamic"; export async function GET(request: NextRequest) { const locale = request.nextUrl.searchParams.get("locale") || "de"; try { const { matches: rawMatches, teams } = await fetchMatchesAndTeamsFifa(locale); // Odds sind optional: fällt der Polymarket-Call aus, liefern wir trotzdem. let matches = rawMatches; let odds: Awaited> | null = null; try { odds = await fetchOdds(); matches = attachOdds(rawMatches, teams, odds); } catch (err) { console.error("[polymarket] fetchOdds fehlgeschlagen:", err); } if (odds) { matches = attachKOOdds(matches, teams, odds); } // FIFA-Live-Scores als häufiger gecachtes Overlay try { const fifaData = await fetchFifaScores(locale); matches = applyFifaScores(matches, teams, fifaData); try { matches = await attachFifaGoals(matches, fifaData, locale); } catch (err) { console.warn("[fifa] Goals fehlgeschlagen:", err instanceof Error ? err.message : err); } } catch (err) { console.warn("[fifa] Scores fehlgeschlagen:", err instanceof Error ? err.message : err); } const groupTables = computeGroupTables(teams, matches); const groupTablesLive = computeGroupTables(teams, matches, true); const normalizedMatches = matches.map((m) => ({ ...m, prob: m.prob ?? null })); const thirdTable = computeThirdPlaceTable(groupTablesLive); const qGroups = qualifiedThirdGroups(thirdTable); const annex = qGroups.length === 8 ? resolveAnnexC(qGroups) : null; // Sichere Drittplatzierte (Team-IDs, deren Top-8-Platz mathematisch feststeht) const secureThirdTeams = securelyQualifiedThirdTeams(matches, teams); return NextResponse.json({ updatedAt: new Date().toISOString(), teams, matches: normalizedMatches, groupTables, groupTablesLive, thirdTable, secureThirdTeams: [...secureThirdTeams], annexAssignment: annex, annexResolved: annex != null, }); } catch (err) { const message = err instanceof Error ? err.message : "unbekannter Fehler"; return NextResponse.json( { error: "Feed nicht erreichbar", detail: message }, { status: 502 }, ); } }