Completed
Pull Request — master (#481)
by
unknown
16:18
created

EventStatus::fromUdb3ModelEventStatus()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 16
rs 9.7333
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\Model\ValueObject\Calendar\EventStatus as Udb3ModelEventStatus;
7
use CultuurNet\UDB3\Model\ValueObject\Translation\Language;
8
use InvalidArgumentException;
9
10
final class EventStatus implements SerializableInterface
11
{
12
    /**
13
     * @var EventStatusType
14
     */
15
    private $eventStatusType;
16
17
    /**
18
     * @var EventStatusReason[]
19
     */
20
    private $eventStatusReasons;
21
22
    public function __construct(EventStatusType $eventStatusType, array $eventStatusReasons)
23
    {
24
        $this->ensureTranslationsAreUnique($eventStatusReasons);
25
        $this->eventStatusType = $eventStatusType;
26
        $this->eventStatusReasons = $eventStatusReasons;
27
    }
28
29
    public function getEventStatusType(): EventStatusType
30
    {
31
        return $this->eventStatusType;
32
    }
33
34
    public function getEventStatusReasons(): array
35
    {
36
        return $this->eventStatusReasons;
37
    }
38
39
    public static function deserialize(array $data): EventStatus
40
    {
41
        $eventStatusReasons = [];
42
        foreach ($data['eventStatusReason'] as $language => $eventStatusReason) {
43
            $eventStatusReasons[] = new EventStatusReason(
44
                new Language($language),
45
                $eventStatusReason
46
            );
47
        }
48
49
        return new EventStatus(
50
            EventStatusType::fromNative($data['eventStatus']),
51
            $eventStatusReasons
52
        );
53
    }
54
55
    public function serialize(): array
56
    {
57
        $eventStatusReasons = [];
58
        foreach ($this->eventStatusReasons as $statusReason) {
59
            $eventStatusReasons[$statusReason->getLanguage()->getCode()] = $statusReason->getReason();
60
        }
61
62
        return [
63
            'eventStatus' => $this->eventStatusType->toNative(),
64
            'eventStatusReason' => $eventStatusReasons,
65
        ];
66
    }
67
68
    /**
69
     * @param EventStatusReason[] $eventStatusReasons
70
     */
71
    private function ensureTranslationsAreUnique(array $eventStatusReasons): void
72
    {
73
        $languageCodes = \array_map(static function (EventStatusReason $reason) {
74
            return $reason->getLanguage()->getCode();
75
        }, $eventStatusReasons);
76
77
        if (count($languageCodes) !== count(array_unique($languageCodes))) {
78
            throw new InvalidArgumentException('Duplicate translations are not allowed for EventStatusReason');
79
        }
80
    }
81
82
    public static function fromUdb3ModelEventStatus(Udb3ModelEventStatus $udb3ModelEventStatus): EventStatus
83
    {
84
        $type = EventStatusType::fromNative($udb3ModelEventStatus->getType()->toString());
85
        $reasons = [];
86
87
        $udb3ModelReason = $udb3ModelEventStatus->getReason();
88
89
        $languages = $udb3ModelReason ? $udb3ModelReason->getLanguages()->toArray() : [];
90
        foreach ($languages as $language)
91
        {
92
            $translation = $udb3ModelReason->getTranslation($language);
93
            $reasons[$language->getCode()] = $translation->toString();
94
        }
95
96
        return new EventStatus($type, $reasons);
97
    }
98
}
99