Producer::circle()   A
last analyzed

Complexity

Conditions 4
Paths 8

Size

Total Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 4

Importance

Changes 0
Metric Value
dl 0
loc 12
ccs 9
cts 9
cp 1
rs 9.8666
c 0
b 0
f 0
cc 4
nc 8
nop 2
crap 4
1
<?php
2
namespace GetSky\AIRAC;
3
4
/**
5
 * Class Producer
6
 * @deprecated Use AiracProducer. This class will be removed in version 1.2.0
7
 * @package GetSky\AIRAC
8
 */
9
class Producer
10
{
11
    /**
12
     * @var \DateTime
13
     */
14
    private $bearing;
15
16
    /**
17
     * @param \DateTime|null $bearing
18
     * @throws \Exception
19
     */
20 57
    public function __construct(\DateTime $bearing = null)
21
    {
22 57
         $this->bearing = $bearing ? $bearing : new \DateTime('2016-01-07');
23 57
    }
24
25
    /**
26
     * @return \DateTime
27
     */
28 2
    public function getBearingDate(): \DateTime
29
    {
30 2
        return $this->bearing;
31
    }
32
33
    /**
34
     * Get next AIRAC date.
35
     *
36
     * @param \DateTime $date
37
     * @return Airac
38
     */
39 6
    public function next(\DateTime $date): Airac
40
    {
41 6
        return $this->circle($date, 1);
42
    }
43
44
    /**
45
     * Get next AIRAC date.
46
     *
47
     * @param string $number
48
     * @return Airac
49
     * @throws AiracNumberValidationException
50
     */
51 13
    public function nextByNumber(string $number): Airac
52
    {
53 13
        return $this->circleByNumber($number, 1);
54
    }
55
56
    /**
57
     * Get next AIRAC date.
58
     *
59
     * @param Airac $airac
60
     * @return Airac
61
     */
62 6
    public function nextByAirac(Airac $airac): Airac
63
    {
64 6
        return $this->circle($airac->getDateStart(), 1);
65
    }
66
67
    /**
68
     * Get current AIRAC date.
69
     *
70
     * @param \DateTime $date
71
     * @return Airac
72
     */
73 6
    public function now(\DateTime $date): Airac
74
    {
75 6
        return $this->circle($date, 0);
76
    }
77
78
    /**
79
     * Get current AIRAC date.
80
     *
81
     * @param string $number
82
     * @return Airac
83
     * @throws AiracNumberValidationException
84
     */
85 6
    public function nowByNumber(string $number): Airac
86
    {
87 6
        return $this->circleByNumber($number, 0);
88
    }
89
90
    /**
91
     * Get last AIRAC date.
92
     *
93
     * @param \DateTime $date
94
     * @return Airac
95
     */
96 6
    public function last(\DateTime $date): Airac
97
    {
98 6
        return $this->circle($date, -1);
99
    }
100
101
    /**
102
     * Get last AIRAC date.
103
     *
104
     * @param string $number
105
     * @return Airac
106
     * @throws AiracNumberValidationException
107
     */
108 6
    public function lastByNumber(string $number): Airac
109
    {
110 6
        return $this->circleByNumber($number, -1);
111
    }
112
113
    /**
114
     * Get last AIRAC date.
115
     *
116
     * @param Airac $airac
117
     * @return Airac
118
     */
119 6
    public function lastByAirac(Airac $airac): Airac
120
    {
121 6
        return $this->circle($airac->getDateStart(), -1);
122
    }
123
124
    /**
125
     * Generator AIRAC dates.
126
     *
127
     * @param \DateTime $date
128
     * @param $step
129
     * @return Airac
130
     */
131 48
    private function circle(\DateTime $date, int $step): Airac
132
    {
133 48
        $positive = ($date >= $this->bearing) ? 1 : -1;
134 48
        $days = $date->diff($this->bearing)->days;
135 48
        $countCircle = $positive * floor($days / 28) + $step - (($positive < 0 && $days % 28 != 0) ? 1 : 0);
136 48
        $dateStart = clone $this->bearing;
137 48
        $dateStart->modify(($countCircle * 28) . ' day');
138 48
        $dateEnd = clone $dateStart;
139 48
        $dateEnd->modify('28 day');
140
141 48
        return new Airac($dateStart, $dateEnd, $this->calcNumber($dateStart));
142
    }
143
144
    /**
145
     * Generator AIRAC dates.
146
     *
147
     * @param string $number
148
     * @param int $step
149
     * @return Airac
150
     * @throws AiracNumberValidationException
151
     */
152 25
    private function circleByNumber(string $number, int $step): Airac
153
    {
154 25
        $date = \DateTime::createFromFormat('!y', substr($number, 0, 2));
155 25
        if (preg_match("/[0-9]{4}/", $number) === 0 || $date === false) {
156 7
            throw new AiracNumberValidationException("Number '$number' isn't correct AIRAC.");
157
        }
158
159 18
        return $this->circle($date, $step + substr($number, 2, 2));
160
    }
161
162
    /**
163
     *Calculated number of AIRAC.
164
     *
165
     * @param \DateTime $date
166
     * @return string
167
     */
168 48
    private function calcNumber(\DateTime $date): string
169
    {
170 48
        $year = \DateTime::createFromFormat('!Y', $date->format('Y'));
171 48
        $number = 1 + floor($year->diff($date)->days / 28);
172
        
173 48
        return $year->format('y') . sprintf("%02d", $number);
174
    }
175
}
176