Completed
Push — master ( 7ff0dd...2ef7db )
by Jonas
31s queued 11s
created

Status::fromUdb3ModelStatus()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

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