Passed
Push — master ( 0f4d43...722d87 )
by Tomáš
16:32
created

DefaultStatusFactory   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 89
Duplicated Lines 0 %

Test Coverage

Coverage 92.31%

Importance

Changes 0
Metric Value
eloc 42
dl 0
loc 89
rs 10
c 0
b 0
f 0
ccs 48
cts 52
cp 0.9231
wmc 9

6 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A createLastStatus() 0 17 2
A createCollection() 0 8 1
A createStatuses() 0 10 1
A create() 0 16 3
A createLastStatusCollection() 0 8 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Inspirum\Balikobot\Model\Status;
6
7
use DateTimeImmutable;
8
use Inspirum\Balikobot\Client\Response\Validator;
9
use Inspirum\Balikobot\Exception\BadRequestException;
10
use Throwable;
11
use function array_key_exists;
12
use function array_map;
13
use function count;
14
15
final class DefaultStatusFactory implements StatusFactory
16
{
17 18
    public function __construct(
18
        private readonly Validator $validator,
19
    ) {
20 18
    }
21
22
    /** @inheritDoc */
23 7
    public function create(string $carrier, string $carrierId, array $data, array $response = []): Status
24
    {
25 7
        $this->validator->validateResponseItemHasSomeAttributes($data, ['status_id_v2', 'status_id'], $response);
26
27
        try {
28 6
            return new DefaultStatus(
29 6
                $carrier,
30 6
                $carrierId,
31 6
                (float) ($data['status_id_v2'] ?? $data['status_id']),
32 6
                (string) ($data['name_balikobot'] ?? ($data['name_internal'] ?? $data['name'])),
33 6
                (string) $data['name'],
34 6
                (string) ($data['type'] ?? 'event'),
35 6
                array_key_exists('date', $data) ? new DateTimeImmutable((string) $data['date']) : null,
36 6
            );
37
        } catch (Throwable $exception) {
38
            throw new BadRequestException($response, previous: $exception);
39
        }
40
    }
41
42
    /** @inheritDoc */
43 5
    public function createLastStatus(string $carrier, array $data, array $response = []): Status
44
    {
45 5
        $this->validator->validateResponseStatus($data, $response);
46 5
        $this->validator->validateResponseItemHasAttribute($data, 'status_id', $response);
47
48
        try {
49 4
            return new DefaultStatus(
50 4
                $carrier,
51 4
                (string) $data['carrier_id'],
52 4
                (float) $data['status_id'],
53 4
                (string) $data['status_text'],
54 4
                (string) $data['status_text'],
55 4
                'event',
56 4
                null,
57 4
            );
58
        } catch (Throwable $exception) {
59
            throw new BadRequestException($response, previous: $exception);
60
        }
61
    }
62
63
    /** @inheritDoc */
64 7
    public function createCollection(string $carrier, array $carrierIds, array $data): StatusesCollection
65
    {
66 7
        $packages = $data['packages'] ?? [];
67 7
        $this->validator->validateIndexes($packages, count($carrierIds));
68
69 4
        return new DefaultStatusesCollection($carrier, array_map(
70 4
            fn(array $status): Statuses => $this->createStatuses($carrier, $status, $data),
71 4
            $packages,
72 4
        ));
73
    }
74
75
    /**
76
     * @param array<mixed,mixed> $data
77
     * @param array<mixed,mixed> $response
78
     *
79
     * @throws \Inspirum\Balikobot\Exception\Exception
80
     */
81 4
    private function createStatuses(string $carrier, array $data, array $response = []): Statuses
82
    {
83 4
        $this->validator->validateResponseStatus($data, $response);
84
85 4
        return new DefaultStatuses(
86 4
            $carrier,
87 4
            (string) $data['carrier_id'],
88 4
            new DefaultStatusCollection(
89 4
                $carrier,
90 4
                array_map(fn(array $status): Status => $this->create($carrier, (string) $data['carrier_id'], $status, $response), $data['states'] ?? []),
91 4
            ),
92 4
        );
93
    }
94
95
    /** @inheritDoc */
96 6
    public function createLastStatusCollection(string $carrier, array $carrierIds, array $data): StatusCollection
97
    {
98 6
        $packages = $data['packages'] ?? [];
99 6
        $this->validator->validateIndexes($packages, count($carrierIds));
100
101 3
        return new DefaultStatusCollection($carrier, array_map(
102 3
            fn(array $status): Status => $this->createLastStatus($carrier, $status, $data),
103 3
            $packages,
104 3
        ));
105
    }
106
}
107