name => 'oeuf', self::hatchedEgg->name => 'oeuf éclos', self::chick->name => 'poussin', self::hen->name => 'poule', self::chicken->name => 'poulet', ]; /** * Point levels definition. */ private const LEVELS = [ self::egg->name => 0, self::hatchedEgg->name => 50, self::chick->name => 130, self::hen->name => 230, self::chicken->name => 1000, ]; /** * Get Level */ public function level(): int { return self::LEVELS[$this->name]; } /** * Get picture */ public function picture(): string { return Vite::asset("resources/assets/images/club/game-points/{$this->name()}.png"); } /** * Get enum Levels * * @return array */ public static function toLevels(): array { return self::LEVELS; } /** * Get Level from point value */ public static function fromPoints(int $points): self { $levels = array_reverse(self::all()); foreach ($levels as $level) { if ($points >= $level->level()) { return $level; } } // * This should not happen while egg level is 0 return self::egg; } /** * Next Level */ public static function fromPointsNextLevel(int $points): ?self { $currentLevel = self::fromPoints($points); return collect(self::all()) ->filter(fn ($level) => $level->level() > $currentLevel->level()) ->first(); } /** * Percent from points */ public static function percentFromPoints(int $points): float { $levels = collect(self::toValues()); $level = self::fromPoints($points); $nextLevel = self::fromPointsNextLevel($points); if (! $nextLevel) { return 100; } // * Bars between 2 levels $ratio = 4; $percentBetween2Levels = 100 / ($levels->count() - 1); $adjustment = $percentBetween2Levels * ($nextLevel->level() - $points) / ($nextLevel->level() - $level->level()); return round((($level->value() * 100) / $levels->last()) + $percentBetween2Levels - $adjustment); } }