Completed
Push — master ( 913de5...7ff0dd )
by Jonas
21s queued 11s
created

Status::deserialize()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 17
rs 9.7
c 0
b 0
f 0
cc 3
nc 2
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\Translation\Language;
7
use InvalidArgumentException;
8
9
final class Status implements SerializableInterface
10
{
11
    /**
12
     * @var StatusType
13
     */
14
    private $type;
15
16
    /**
17
     * @var StatusReason[]
18
     */
19
    private $reason;
20
21
    public function __construct(StatusType $type, array $reason)
22
    {
23
        $this->ensureTranslationsAreUnique($reason);
24
        $this->type = $type;
25
        $this->reason = $reason;
26
    }
27
28
    public function getType(): StatusType
29
    {
30
        return $this->type;
31
    }
32
33
    public function getReason(): array
34
    {
35
        return $this->reason;
36
    }
37
38
    public static function deserialize(array $data): Status
39
    {
40
        $statusReasons = [];
41
        if (isset($data['reason'])) {
42
            foreach ($data['reason'] as $language => $statusReason) {
43
                $statusReasons[] = new StatusReason(
44
                    new Language($language),
45
                    $statusReason
46
                );
47
            }
48
        }
49
50
        return new Status(
51
            StatusType::fromNative($data['type']),
52
            $statusReasons
53
        );
54
    }
55
56
    public function serialize(): array
57
    {
58
        $serialized = [
59
            'type' => $this->type->toNative(),
60
        ];
61
62
        $statusReasons = [];
63
        foreach ($this->reason as $statusReason) {
64
            $statusReasons[$statusReason->getLanguage()->getCode()] = $statusReason->getReason();
65
        }
66
67
        if (!empty($statusReasons)) {
68
            $serialized['reason'] = $statusReasons;
69
        }
70
71
        return $serialized;
72
    }
73
74
    /**
75
     * @param StatusReason[] $statusReason
76
     */
77
    private function ensureTranslationsAreUnique(array $statusReason): void
78
    {
79
        $languageCodes = \array_map(static function (StatusReason $reason) {
80
            return $reason->getLanguage()->getCode();
81
        }, $statusReason);
82
83
        if (count($languageCodes) !== count(array_unique($languageCodes))) {
84
            throw new InvalidArgumentException('Duplicate translations are not allowed for StatusReason');
85
        }
86
    }
87
}
88