Completed
Pull Request — master (#481)
by Jonas
01:58
created

Status   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 88
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 7

Importance

Changes 0
Metric Value
wmc 12
lcom 1
cbo 7
dl 0
loc 88
rs 10
c 0
b 0
f 0

7 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 6 1
A getStatusType() 0 4 1
A getStatusReason() 0 4 1
A deserialize() 0 15 2
A serialize() 0 12 2
A ensureTranslationsAreUnique() 0 10 2
A fromUdb3ModelStatus() 0 15 3
1
<?php declare(strict_types=1);
2
3
namespace CultuurNet\UDB3\Event\ValueObjects;
4
5
use Broadway\Serializer\SerializableInterface;
6
use CultuurNet\UDB3\Model\ValueObject\Calendar\EventStatus;
7
use CultuurNet\UDB3\Model\ValueObject\Translation\Language;
8
use InvalidArgumentException;
9
10
final class Status implements SerializableInterface
11
{
12
    /**
13
     * @var StatusType
14
     */
15
    private $statusType;
16
17
    /**
18
     * @var StatusReason[]
19
     */
20
    private $statusReason;
21
22
    public function __construct(StatusType $statusType, array $statusReason)
23
    {
24
        $this->ensureTranslationsAreUnique($statusReason);
25
        $this->statusType = $statusType;
26
        $this->statusReason = $statusReason;
27
    }
28
29
    public function getStatusType(): StatusType
30
    {
31
        return $this->statusType;
32
    }
33
34
    public function getStatusReason(): array
35
    {
36
        return $this->statusReason;
37
    }
38
39
    public static function deserialize(array $data): Status
40
    {
41
        $statusReasons = [];
42
        foreach ($data['statusReason'] as $language => $statusReason) {
43
            $statusReasons[] = new StatusReason(
44
                new Language($language),
45
                $statusReason
46
            );
47
        }
48
49
        return new Status(
50
            StatusType::fromNative($data['status']),
51
            $statusReasons
52
        );
53
    }
54
55
    public function serialize(): array
56
    {
57
        $statusReasons = [];
58
        foreach ($this->statusReason as $statusReason) {
59
            $statusReasons[$statusReason->getLanguage()->getCode()] = $statusReason->getReason();
60
        }
61
62
        return [
63
            'status' => $this->statusType->toNative(),
64
            'statusReason' => $statusReasons,
65
        ];
66
    }
67
68
    /**
69
     * @param StatusReason[] $statusReason
70
     */
71
    private function ensureTranslationsAreUnique(array $statusReason): void
72
    {
73
        $languageCodes = \array_map(static function (StatusReason $reason) {
74
            return $reason->getLanguage()->getCode();
75
        }, $statusReason);
76
77
        if (count($languageCodes) !== count(array_unique($languageCodes))) {
78
            throw new InvalidArgumentException('Duplicate translations are not allowed for StatusReason');
79
        }
80
    }
81
82
    public static function fromUdb3ModelStatus(EventStatus $udb3ModelStatus): self
83
    {
84
        $type = StatusType::fromNative($udb3ModelStatus->getType()->toString());
85
        $reasons = [];
86
87
        $udb3ModelReason = $udb3ModelStatus->getReason();
88
89
        $languages = $udb3ModelReason ? $udb3ModelReason->getLanguages()->toArray() : [];
90
        foreach ($languages as $language) {
91
            $translation = $udb3ModelReason->getTranslation($language);
92
            $reasons[$language->getCode()] = $translation->toString();
93
        }
94
95
        return new self($type, $reasons);
96
    }
97
}
98