JSON::writeTrackPoints()   B
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 28
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 28
rs 8.8571
c 0
b 0
f 0
cc 3
eloc 19
nc 3
nop 1
1
<?php
2
3
declare(strict_types = 1);
4
5
namespace SportTrackerConnector\Core\Workout\Dumper;
6
7
use SportTrackerConnector\Core\Workout\Extension\ExtensionInterface;
8
use SportTrackerConnector\Core\Workout\TrackPoint;
9
use SportTrackerConnector\Core\Workout\Workout;
10
11
/**
12
 * Dump a workout to JSON.
13
 */
14
class JSON implements DumperInterface
15
{
16
    /**
17
     * {@inheritdoc}
18
     */
19
    public function dump(Workout $workout): string
20
    {
21
        $data = array();
22
        $tracks = $workout->tracks();
23
        foreach ($tracks as $track) {
24
            $data[] = array(
25
                'workout' => array(
26
                    'points' => $this->writeTrackPoints($track->trackPoints())
27
                )
28
            );
29
        }
30
31
        return json_encode($data, JSON_PRETTY_PRINT);
32
    }
33
34
    /**
35
     * Write the track points into an array.
36
     *
37
     * @param TrackPoint[] $trackPoints The track points to write.
38
     * @return array
39
     */
40
    private function writeTrackPoints(array $trackPoints)
41
    {
42
        $points = array();
43
        $previousPoint = null;
44
        foreach ($trackPoints as $trackPoint) {
45
            $dateTime = clone $trackPoint->dateTime();
46
            $dateTime->setTimezone(new \DateTimeZone('UTC'));
47
48
            $distance = 0;
49
            if ($previousPoint !== null) {
50
                $distance = $trackPoint->distanceFromPoint($previousPoint);
51
            }
52
53
            $point = array(
54
                'time' => $dateTime->format(\DateTime::W3C),
55
                'latitude' => $trackPoint->latitude(),
56
                'longitude' => $trackPoint->longitude(),
57
                'elevation' => $trackPoint->elevation(),
58
                'distance' => $distance,
59
                'extensions' => $this->writeExtensions($trackPoint->extensions())
60
            );
61
            $previousPoint = $trackPoint;
62
63
            $points[] = $point;
64
        }
65
66
        return $points;
67
    }
68
69
    /**
70
     * Write the extensions into an array.
71
     *
72
     * @param ExtensionInterface[] $extensions The extensions to write.
73
     * @return array
74
     */
75
    protected function writeExtensions(array $extensions)
76
    {
77
        $return = array();
78
        foreach ($extensions as $extension) {
79
            $return[$extension::ID()] = $extension->value();
80
        }
81
82
        return $return;
83
    }
84
}
85