= $primeraFecha && $hoy <= $ultimaFecha) ? $hoy : $primeraFecha;
}
// Si la fecha elegida NO tiene partidos (día de descanso o deep-link a un día
// vacío), saltamos al día CON partidos más cercano hacia adelante (o al último
// que haya, si ya pasaron todos). Así nunca queda seleccionado un día vacío.
if ($fechasMundial && !in_array($fechaSel, $fechasMundial, true)) {
$snap = null;
foreach ($fechasMundial as $d) {
if ($d >= $fechaSel) { $snap = $d; break; }
}
$fechaSel = $snap ?? end($fechasMundial);
}
/**
* Ventana de la barra de días: muestra hasta $ventana días QUE TIENEN PARTIDO
* (los días sin partido no están en $diasConPartido, así que nunca aparecen),
* centrada alrededor del día seleccionado.
*/
function buildBarraDias(string $fechaSel, array $diasConPartido, int $ventana = 7): array {
$total = count($diasConPartido);
if ($total <= $ventana) return $diasConPartido;
$idx = array_search($fechaSel, $diasConPartido, true);
if ($idx === false) {
// $fechaSel ya se ajusta a un día con partido antes de llamar acá; por
// las dudas, ubicamos el día con partido más cercano hacia adelante.
$idx = $total - 1;
foreach ($diasConPartido as $i => $d) {
if ($d >= $fechaSel) { $idx = $i; break; }
}
}
$mitad = intdiv($ventana, 2);
$start = max(0, min($idx - $mitad, $total - $ventana));
return array_slice($diasConPartido, $start, $ventana);
}
function etiquetaDia(string $f, string $hoy): string {
$ts = strtotime($f);
$dif = ($ts - strtotime($hoy)) / 86400;
$dias = ['Dom', 'Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sáb'];
$meses = ['', 'Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun',
'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'];
$num = (int)date('j', $ts);
$mes = $meses[(int)date('n', $ts)];
if ($dif === 0.0) return "Hoy $num $mes";
if ($dif === 1.0) return "Mañana $num $mes";
if ($dif === -1.0) return "Ayer $num $mes";
return $dias[(int)date('w', $ts)] . " $num $mes";
}
function mesTorneo(string $fechaSel): string {
$meses = ['', 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio',
'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'];
return $meses[(int)date('n', strtotime($fechaSel))];
}
$diasBarra = buildBarraDias($fechaSel, $fechasMundial);
$partidosDelDia = array_values(array_filter($partidos, fn($p) => $p['fecha'] === $fechaSel));
$koDelDia = array_values(array_filter($partidosKO, fn($p) => $p['fecha'] === $fechaSel));
// Pronósticos de TODOS los participantes, pero solo de los partidos del día cuyo
// CIERRE de apuestas ya pasó (ya no se puede predecir). Mientras se pueda cargar
// un pronóstico, las apuestas ajenas siguen ocultas (la regla se aplica partido
// por partido en el backend). Incluye grupos y eliminatorias del día.
$pronosticosVisibles = $user ? getPronosticosAjenosVisibles(array_merge($partidosDelDia, $koDelDia)) : [];
$faseDelDia = $koDelDia ? $koDelDia[0]['fase_nombre'] : 'Fase de grupos';
$idxSel = array_search($fechaSel, $fechasMundial, true);
$diaPrev = $idxSel > 0 ? $fechasMundial[$idxSel - 1] : null;
$diaNext = $idxSel < count($fechasMundial) - 1 ? $fechasMundial[$idxSel + 1] : null;
$bienvenida = isset($_GET['bienvenida']);
?>