DefaultStatusFactory::create()   A
last analyzed

Complexity

Conditions 3
Paths 2

Size

Total Lines 16
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 3.0327

Importance

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