Test Failed
Push — master ( e66f09...2b1c87 )
by Laurens
03:56
created

ThermostatFactory::fromData()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 33

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 2
dl 0
loc 33
rs 9.392
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace LauLamanApps\NestApi\Client\Factory\Device;
6
7
use DateTimeImmutable;
8
use LauLamanApps\NestApi\Client\__shared\AbstractFactory;
9
use LauLamanApps\NestApi\Client\Device\Thermostat;
10
use LauLamanApps\NestApi\Client\Device\Thermostat\HvacMode;
11
use LauLamanApps\NestApi\Client\Device\Thermostat\HvacState;
12
use LauLamanApps\NestApi\Client\Device\Thermostat\Temperature\Scale;
13
use LauLamanApps\NestApi\NestClientInterface;
14
15
final class ThermostatFactory extends AbstractFactory implements ThermostatFactoryInterface
16
{
17
    public function fromData(array $data, NestClientInterface $client): Thermostat
18
    {
19
        $scale = Scale::get($this->extractString('temperature_scale', $data));
20
21
        return new Thermostat(
22
            $client,
23
            $this->extractString('device_id', $data),
24
            $this->extractString('where_id', $data),
25
            $this->extractString('structure_id', $data),
26
            $this->extractString('name', $data),
27
            $this->extractString('name_long', $data),
28
            $scale,
29
            $this->extractString('locale', $data),
30
            $this->extractString('software_version', $data),
31
            $this->extractBoolean('can_heat', $data),
32
            $this->extractBoolean('can_cool', $data),
33
            $this->extractBoolean('has_fan', $data),
34
            $this->extractTemperature('ambient_temperature', $scale, $data),
35
            $this->extractTemperature('target_temperature', $scale, $data),
36
            $this->extractTemperature('target_temperature_high', $scale, $data),
37
            $this->extractTemperature('target_temperature_low', $scale, $data),
38
            $this->extractTemperature('locked_temp_min', $scale, $data),
39
            $this->extractTemperature('locked_temp_max', $scale, $data),
40
            $this->extractBoolean('has_leaf', $data),
41
            $this->extractInteger('humidity', $data),
42
            HvacMode::get($this->extractString('hvac_mode', $data)),
43
            HvacState::get($this->extractString('hvac_state', $data)),
44
            $this->extractBoolean('is_using_emergency_heat', $data),
45
            $this->extractBoolean('is_locked', $data),
46
            $this->extractBoolean('is_online', $data),
47
            $this->extractDateTimeImmutableOrNull('last_connection', $data),
48
            $this->extractBoolean('fan_timer_active', $data),
49
            new DateTimeImmutable($this->extractString('fan_timer_timeout', $data))
50
        );
51
    }
52
53
    private function extractTemperature(string $key, Scale $scale, array $data)
54
    {
55
        $key = sprintf('%s_%s', $key, strtolower($scale->getValue()));
56
57
        return new Thermostat\Temperature($scale, $this->extractFloat($key, $data));
58
    }
59
}
60