>|null */ private static ?array $byId = null; /** @return array> */ public static function all(): array { if (self::$byId !== null) { return self::$byId; } $candidates = [ dirname(__DIR__) . '/config/campuses.json', dirname(__DIR__, 3) . '/config/campuses.json', ]; foreach ($candidates as $file) { if (is_readable($file)) { $data = json_decode((string)file_get_contents($file), true); if (is_array($data) && isset($data['campuses'])) { $out = []; foreach ($data['campuses'] as $c) { $out[$c['id']] = $c; } return self::$byId = $out; } } } throw new RuntimeException('campuses.json not found'); } /** @return array|null */ public static function get(string $id): ?array { return self::all()[$id] ?? null; } /** @return string[] */ public static function openIds(): array { return array_keys(array_filter(self::all(), static fn($c) => ($c['status'] ?? 'open') === 'open')); } /** "Sunday 9:30 AM" style summary of the first service day. */ public static function timesSummary(array $campus): string { $parts = []; foreach ($campus['serviceTimes'] ?? [] as $st) { $parts[] = $st['day'] . ' ' . implode(', ', $st['times']); } return implode(' ยท ', $parts); } }