Passed
Push — develop ( 3b0ceb...9dc7fc )
by Brent
02:07
created

PaginationAdapter::getEntries()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 6
nc 1
nop 1
dl 0
loc 9
ccs 6
cts 6
cp 1
crap 1
rs 9.6666
c 0
b 0
f 0
1
<?php
2
3
namespace Stitcher\Page\Adapter;
4
5
use Stitcher\Page\Adapter;
6
use Stitcher\Exception\InvalidConfiguration;
7
use Stitcher\Configureable;
8
use Stitcher\Variable\VariableParser;
9
10
class PaginationAdapter implements Adapter, Configureable
11
{
12
    protected $variableParser;
13
    protected $variable;
14
    protected $perPage;
15
    protected $parameter;
16
17 9
    public function __construct(array $adapterConfiguration, VariableParser $variableParser)
18
    {
19 9
        if (! $this->isValidConfiguration($adapterConfiguration)) {
20
            throw InvalidConfiguration::invalidAdapterConfiguration('pagination', '`variable`, `parameter`, `perPage`');
21
        }
22
23 9
        $this->variable = $adapterConfiguration['variable'];
24 9
        $this->parameter = $adapterConfiguration['parameter'];
25 9
        $this->perPage = $adapterConfiguration['perPage'] ?? 12;
26 9
        $this->variableParser = $variableParser;
27 9
    }
28
29 9
    public static function make(array $adapterConfiguration, VariableParser $variableParser): PaginationAdapter
30
    {
31 9
        return new self($adapterConfiguration, $variableParser);
32
    }
33
34 8
    public function transform(array $pageConfiguration): array
35
    {
36 8
        $paginationPageConfiguration = [];
37 8
        $entries = $this->getEntries($pageConfiguration);
38 8
        $pageCount = (int) ceil(count($entries) / $this->perPage);
39
40 8
        for ($pageIndex = 1; $pageIndex <= $pageCount; $pageIndex++) {
41 8
            $entriesForPage = array_splice($entries, 0, $this->perPage);
42
43 8
            $entryConfiguration = $this->createPageConfiguration(
44 8
                $pageConfiguration,
45 8
                $entriesForPage,
46 8
                $pageIndex,
47 8
                $pageCount
48
            );
49
50 8
            $paginationPageConfiguration[$entryConfiguration['id']] = $entryConfiguration;
51
        }
52
53 8
        return $paginationPageConfiguration;
54
    }
55
56 9
    public function isValidConfiguration($subject): bool
57
    {
58 9
        return is_array($subject) && isset($subject['variable']) && isset($subject['parameter']);
59
    }
60
61 8
    protected function getEntries(array $pageConfiguration): ?array
62
    {
63 8
        $variable = $pageConfiguration['variables'][$this->variable] ?? null;
64 8
        $entries = $this->variableParser->parse($variable)['entries']
65 6
            ?? $this->variableParser->parse($variable)
66 8
            ?? $variable;
67
68 8
        return $entries;
69
    }
70
71 8
    protected function createPageConfiguration(
72
        array $entryConfiguration,
73
        array $entriesForPage,
74
        int $pageIndex,
75
        int $pageCount
76
    ): array {
77 8
        $pageId = rtrim($entryConfiguration['id'], '/');
78 8
        $paginatedId = $this->createPaginatedUrl($pageId, $pageIndex);
79
80 8
        $entryConfiguration['id'] = $paginatedId;
81 8
        $entryConfiguration['variables'][$this->variable] = $entriesForPage;
82
83 8
        $paginationVariable = $this->createPaginationVariable($pageId, $pageIndex, $pageCount);
84 8
        $entryConfiguration['variables']['_pagination'] = $paginationVariable;
85
86 8
        unset($entryConfiguration['config']['pagination']);
87
88 8
        return $entryConfiguration;
89
    }
90
91 8
    protected function createPaginationVariable(string $pageId, int $pageIndex, int $pageCount): array
92
    {
93
        return [
94 8
            'current'  => $pageIndex,
95 8
            'previous' => $this->createPreviousPagination($pageId, $pageIndex),
96 8
            'next'     => $this->createNextPagination($pageId, $pageIndex, $pageCount),
97 8
            'pages'    => $pageCount,
98
        ];
99
    }
100
101 8
    protected function createPreviousPagination(string $pageId, int $pageIndex): ?array
102
    {
103 8
        if ($pageIndex <= 1) {
104 8
            return null;
105
        }
106
107 8
        $previous = $pageIndex - 1;
108
109
        return [
110 8
            'url'   => $this->createPaginatedUrl($pageId, $previous),
111 8
            'index' => $previous,
112
        ];
113
    }
114
115 8
    protected function createNextPagination(string $pageId, int $pageIndex, int $pageCount): ?array
116
    {
117 8
        if ($pageIndex >= $pageCount) {
118 8
            return null;
119
        }
120
121 8
        $next = $pageIndex + 1;
122
123
        return [
124 8
            'url'   => $this->createPaginatedUrl($pageId, $next),
125 8
            'index' => $next,
126
        ];
127
    }
128
129 8
    protected function createPaginatedUrl(string $pageId, int $index): string
130
    {
131 8
        return str_replace('{' .$this->parameter. '}', "page-{$index}", $pageId);
132
    }
133
}
134