Test Failed
Push — master ( bbdbb0...ecc533 )
by Nico
16:37 queued 10:47
created

ManageWarpcoreTransfer   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 64
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 37
c 1
b 0
f 0
dl 0
loc 64
rs 10
wmc 11

1 Method

Rating   Name   Duplication   Size   Complexity  
B manage() 0 62 11
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Stu\Lib\SpacecraftManagement\Manager;
6
7
use RuntimeException;
8
use Stu\Component\Spacecraft\System\SpacecraftSystemTypeEnum;
9
use Stu\Lib\SpacecraftManagement\Provider\ManagerProviderInterface;
10
use Stu\Lib\SpacecraftManagement\Provider\ManagerProviderSpacecraft;
11
use Stu\Module\Spacecraft\Lib\SpacecraftWrapperInterface;
12
13
class ManageWarpcoreTransfer implements ManagerInterface
14
{
15
    #[\Override]
16
    public function manage(SpacecraftWrapperInterface $wrapper, array $values, ManagerProviderInterface $managerProvider): array
17
    {
18
        $values = $values['warpcore_transfer'] ?? null;
19
        if ($values === null) {
20
            throw new RuntimeException('value array not existent');
21
        }
22
23
        $targetSpacecraft = $wrapper->get();
24
25
        if (!array_key_exists($targetSpacecraft->getId(), $values)) {
26
            return [];
27
        }
28
29
        if ($values[$targetSpacecraft->getId()] === '' || $values[$targetSpacecraft->getId()] < 1) {
30
            return [];
31
        }
32
33
        if (!$managerProvider instanceof ManagerProviderSpacecraft) {
34
            return [];
35
        }
36
37
        $requestedAmount = (int)$values[$targetSpacecraft->getId()];
38
39
        $targetReactor = $wrapper->getReactorWrapper();
40
        if ($targetReactor === null) {
41
            return [];
42
        }
43
44
        if (
45
            $targetSpacecraft->getSystemState(SpacecraftSystemTypeEnum::WARPDRIVE) ||
46
            $targetSpacecraft->getSystemState(SpacecraftSystemTypeEnum::SHIELDS)
47
        ) {
48
            return [sprintf(
49
                '%s: Warpantrieb und Schilde müssen deaktiviert sein',
50
                $targetSpacecraft->getName()
51
            )];
52
        }
53
54
        $availableSourceLoad = $managerProvider->getReactorLoad();
55
        $targetCapacity = $targetReactor->getCapacity() - $targetReactor->getLoad();
56
57
        if ($availableSourceLoad <= 0) {
58
            return [];
59
        }
60
61
        if ($targetCapacity <= 0) {
62
            return [sprintf(
63
                '%s: Warpkern ist bereits voll geladen',
64
                $targetSpacecraft->getName()
65
            )];
66
        }
67
68
        $actualTransfer = min($requestedAmount, $availableSourceLoad, $targetCapacity);
69
70
        $targetReactor->changeLoad((int)$actualTransfer);
71
        $managerProvider->lowerReactorLoad((int)$actualTransfer);
72
73
        return [sprintf(
74
            'Warpkern-Ladung von %d an %s übertragen',
75
            $actualTransfer,
76
            $targetSpacecraft->getName()
77
        )];
78
    }
79
}
80