From ef155463abe8618d791760ac8c30b11b59b25553 Mon Sep 17 00:00:00 2001 From: thibaud-leclere Date: Mon, 30 Mar 2026 19:44:50 +0200 Subject: [PATCH] feat: add GameGridGenerator service Co-Authored-By: Claude Sonnet 4.6 --- src/Service/GameGridGenerator.php | 100 ++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 src/Service/GameGridGenerator.php diff --git a/src/Service/GameGridGenerator.php b/src/Service/GameGridGenerator.php new file mode 100644 index 0000000..564069f --- /dev/null +++ b/src/Service/GameGridGenerator.php @@ -0,0 +1,100 @@ +actorRepository->findOneRandom(4); + + $game = new Game(); + $game->setMainActor($mainActor); + $game->setUser($user); + + $usedActors = [$mainActor->getId()]; + $rowOrder = 0; + + foreach (str_split(strtolower($mainActor->getName())) as $char) { + if (!preg_match('/[a-z]/', $char)) { + continue; + } + + $tryFindActor = 0; + do { + $actor = $this->actorRepository->findOneRandom(4, $char); + ++$tryFindActor; + } while ( + in_array($actor->getId(), $usedActors) + || $tryFindActor < 5 + ); + + $usedActors[] = $actor->getId(); + + $row = new GameRow(); + $row->setActor($actor); + $row->setPosition(strpos(strtolower($actor->getName()), $char)); + $row->setRowOrder($rowOrder); + + $game->addRow($row); + ++$rowOrder; + } + + $this->em->persist($game); + $this->em->flush(); + + return $game; + } + + /** + * Compute display data (grid, width, middle) from a Game entity for the React component. + * + * @return array{grid: list, width: int, middle: int} + */ + public function computeGridData(Game $game): array + { + $leftSize = 0; + $rightSize = 0; + $grid = []; + + foreach ($game->getRows() as $row) { + $actor = $row->getActor(); + $pos = $row->getPosition(); + + if ($leftSize < $pos) { + $leftSize = $pos; + } + + $rightSizeActor = strlen($actor->getName()) - $pos - 1; + if ($rightSize < $rightSizeActor) { + $rightSize = $rightSizeActor; + } + + $grid[] = [ + 'actorName' => $actor->getName(), + 'actorId' => $actor->getId(), + 'pos' => $pos, + ]; + } + + return [ + 'grid' => $grid, + 'width' => $rightSize + $leftSize + 1, + 'middle' => $leftSize, + ]; + } +}