Passed
Push — master ( 35eebd...7b8a1a )
by Roman
16:45
created

Grid::calculateGridSize()   A

Complexity

Conditions 5
Paths 6

Size

Total Lines 12
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 30

Importance

Changes 0
Metric Value
cc 5
eloc 7
nc 6
nop 1
dl 0
loc 12
ccs 0
cts 8
cp 0
crap 30
rs 9.6111
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace App\Game\Features\GamePlay\Crossword;
6
7
final class Grid
8
{
9
    private int $size;
10
    private array $field;
11
12
    public function __construct(array $crossword)
13
    {
14
        $this->size = $this->calculateGridSize($crossword);
15
        $this->field = $this->createNewGrid($this->size);
16
    }
17
18
    public function field(): array
19
    {
20
        return $this->field;
21
    }
22
23
    public function size(): int
24
    {
25
        return $this->size;
26
    }
27
28 1
    public function fillLetter(array $cell): void
29
    {
30 1
        $this->field[$cell['coordinate']]['letter'] = $cell['letter'];
31 1
    }
32
33 1
    public function fillCrossLineNumbers(array $cell, int $index): void
34
    {
35 1
        $coordinate = $cell['coordinate'];
36
37 1
        $this->field[$coordinate]['index'] = array_key_exists('index', $this->field[$coordinate]) ?
38 1
            $this->field[$coordinate]['index'] . '/' . ($index + 1) :
39 1
            $index + 1;
40 1
    }
41
42 1
    public function fillLineNumbers(array $cell, int $index): void
43
    {
44 1
        $coordinate = $cell['coordinate'];
45
46 1
        $this->field[$coordinate]['number'] = array_key_exists('number', $this->field[$coordinate]) ?
47 1
            $this->field[$coordinate]['number'] . '/' . ($index + 1) :
48 1
            $index + 1;
49 1
    }
50
51
    private function calculateGridSize(array $crossword): int
52
    {
53
        $sizeX = $sizeY = 0;
54
        foreach ($crossword as $item) {
55
            foreach ($item['line'] as $cell) {
56
                $coordinate = explode('.', $cell['coordinate']);
57
                $coordinate[0] > $sizeX && $sizeX = $coordinate[0];
58
                $coordinate[1] > $sizeY && $sizeY = $coordinate[1];
59
            }
60
        }
61
62
        return (int) max([$sizeX, $sizeY]);
63
    }
64
65
    private function createNewGrid(int $size): array
66
    {
67
        $grid = [];
68
        for ($counterX = 1; $counterX <= $size; $counterX++) {
69
            for ($counterY = 1; $counterY <= $size; $counterY++) {
70
                $grid[sprintf('%s.%s', $counterX, $counterY)] = [
71
                    'letter' => '',
72
                    'coordinate' => [
73
                        'x' => $counterX,
74
                        'y' => $counterY,
75
                    ],
76
                ];
77
            }
78
        }
79
80
        return $grid;
81
    }
82
}
83