Completed
Push — master ( 7519e7...9ee5fa )
by Risan Bagja
02:34
created

DepartureMapper::mapTramTypes()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 13
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 13
ccs 9
cts 9
cp 1
rs 9.4285
cc 2
eloc 7
nc 2
nop 2
crap 2
1
<?php
2
3
namespace Sl\Mappers;
4
5
use Sl\Departure;
6
use Sl\Contracts\Mapper;
7
8
class DepartureMapper implements Mapper
9
{
10
    /**
11
     * Map data to array of object instance.
12
     *
13
     * @param array $data
14
     *
15
     * @return array
16
     */
17 9
    public function map(array $data)
18
    {
19 9
        $data = $data['data'];
20
21 9
        $busses = $this->busses($data);
22
23 9
        $trains = $this->trains($data);
24
25 9
        $metros = $this->metros($data);
26
27 9
        $trams = $this->trams($data);
28
29 9
        $lightRails = $this->lightRails($data);
30
31 9
        $ships = $this->ships($data);
32
33 9
        return array_merge($busses, $trains, $metros, $trams, $lightRails, $ships);
34
    }
35
36
    /**
37
     * Busses group departures.
38
     *
39
     * @param array $data
40
     *
41
     * @return array
42
     */
43 9
    private function busses(array $data)
44
    {
45 9
        return $this->mapGroups($data['BusGroups'], 'bus', null);
46
    }
47
48
    /**
49
     * Trains group departures.
50
     *
51
     * @param array $data
52
     *
53
     * @return array
54
     */
55 9
    private function trains(array $data)
56
    {
57 9
        return $this->mapGroups($data['TrainGroups'], 'train', null);
58
    }
59
60
    /**
61
     * Metros group departures.
62
     *
63
     * @param array $data
64
     *
65
     * @return array
66
     */
67 9
    private function metros(array $data)
68
    {
69 9
        $red = $this->mapGroups($data['MetroRedGroups'], 'metro', 'red');
70
71 9
        $green = $this->mapGroups($data['MetroGreenGroups'], 'metro', 'green');
72
73 9
        $blue = $this->mapGroups($data['MetroBlueGroups'], 'metro', 'blue');
74
75 9
        return array_merge($red, $green, $blue);
76
    }
77
78
    /**
79
     * Trams group departures.
80
     *
81
     * @param array $data
82
     *
83
     * @return array
84
     */
85 9
    private function trams(array $data)
86
    {
87 9
        return $this->mapTramTypes($data['TranCityTypes'], 'tram');
88
    }
89
90
    /**
91
     * Light rails group departures.
92
     *
93
     * @param array $data
94
     *
95
     * @return array
96
     */
97 9
    private function lightRails(array $data)
98
    {
99 9
        return $this->mapTramTypes($data['TramTypes'], 'light rail');
100
    }
101
102
    /**
103
     * Map tram group departures.
104
     *
105
     * @param array  $types
106
     * @param string $tramType
107
     *
108
     * @return array
109
     */
110 9
    private function mapTramTypes(array $types, $tramType)
111
    {
112 9
        $trams = [];
113
114 9
        foreach ($types as $type) {
115 3
            $trams = array_merge(
116 3
                $trams,
117 3
                $this->mapGroups($type['TramGroups'], $tramType, $type['GroupId'])
118 3
            );
119 9
        }
120
121 9
        return $trams;
122
    }
123
124
    /**
125
     * Ships group departures.
126
     *
127
     * @param array $data
128
     *
129
     * @return array
130
     */
131 9
    private function ships(array $data)
132
    {
133 9
        return $this->mapGroups($data['ShipGroups'], 'ship', null);
134
    }
135
136
    /**
137
     * Map groups departures.
138
     *
139
     * @param array  $groups
140
     * @param string $type
141
     * @param string $subType
142
     *
143
     * @return array
144
     */
145 9
    private function mapGroups(array $groups, $type, $subType)
146
    {
147 9
        if (count($groups) === 0) {
148 9
            return [];
149
        }
150
151 9
        $departures = [];
152
153 9
        foreach ($groups as $group) {
154 9
            $departures = array_merge(
155 9
                $departures,
156 9
                $this->createDepartures($group['Departures'], $type, $subType)
157 9
            );
158 9
        }
159
160 9
        return $departures;
161
    }
162
163
    /**
164
     * Create departures array.
165
     *
166
     * @param array  $items
167
     * @param string $type
168
     * @param string $subType
169
     *
170
     * @return array
171
     */
172
    private function createDepartures(array $items, $type, $subType)
173
    {
174 9
        return array_map(function ($departure) use ($type, $subType) {
175 9
            return new Departure(
176 9
                $departure['LineNumber'],
177 9
                $type,
178 9
                $subType,
179 9
                $departure['Destination'],
180 9
                $departure['DisplayTime']
181 9
            );
182 9
        }, $items);
183
    }
184
}
185