Test Failed
Push — dev ( d4c172...a63c79 )
by Janko
09:28
created

ManageBattery   A

Complexity

Total Complexity 16

Size/Duplication

Total Lines 93
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 52
dl 0
loc 93
rs 10
c 0
b 0
f 0
wmc 16

4 Methods

Rating   Name   Duplication   Size   Complexity  
B manage() 0 50 10
A sendMessageToOwner() 0 14 1
A determineLoad() 0 18 4
A __construct() 0 4 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Stu\Lib\SpacecraftManagement\Manager;
6
7
use Override;
0 ignored issues
show
Bug introduced by
The type Override was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
8
use RuntimeException;
9
use Stu\Component\Spacecraft\System\Data\EpsSystemData;
10
use Stu\Component\Player\Relation\PlayerRelationDeterminatorInterface;
11
use Stu\Lib\SpacecraftManagement\Provider\ManagerProviderInterface;
12
use Stu\Module\Message\Lib\PrivateMessageFolderTypeEnum;
13
use Stu\Module\Message\Lib\PrivateMessageSenderInterface;
14
use Stu\Module\Spacecraft\Lib\SpacecraftWrapperInterface;
15
use Stu\Orm\Entity\SpacecraftInterface;
16
17
class ManageBattery implements ManagerInterface
18
{
19
    public function __construct(
20
        private PrivateMessageSenderInterface $privateMessageSender,
21
        private PlayerRelationDeterminatorInterface $playerRelationDeterminator
22
    ) {}
23
24
    #[Override]
25
    public function manage(SpacecraftWrapperInterface $wrapper, array $values, ManagerProviderInterface $managerProvider): array
26
    {
27
        $msg = [];
28
29
        $batt = $values['batt'] ?? null;
30
        if ($batt === null) {
31
            throw new RuntimeException('value array not existent');
32
        }
33
34
        $ship = $wrapper->get();
35
        $shipId = $ship->getId();
36
        $epsSystem = $wrapper->getEpsSystemData();
37
38
        if (
39
            $epsSystem === null
40
            || !array_key_exists($shipId, $batt)
41
            || $batt[$shipId] === ''
42
        ) {
43
            return $msg;
44
        }
45
46
        if ($ship->getShieldState() && !$this->playerRelationDeterminator->isFriend($ship->getUser(), $managerProvider->getUser())) {
47
            $msg[] = sprintf(
48
                _('%s: Batterie konnte wegen aktivierter Schilde nicht aufgeladen werden.'),
49
                $ship->getName()
50
            );
51
            return $msg;
52
        }
53
54
        if (
55
            $managerProvider->getEps() > 0
56
            && $epsSystem->getBattery() < $epsSystem->getMaxBattery()
57
        ) {
58
            $load = $this->determineLoad($batt[$shipId], $epsSystem, $managerProvider);
59
60
            if ($load > 0) {
61
                $epsSystem->setBattery($epsSystem->getBattery() + $load)->update();
62
                $managerProvider->lowerEps($load);
63
                $msg[] = sprintf(
64
                    _('%s: Batterie um %d Einheiten aufgeladen'),
65
                    $ship->getName(),
66
                    $load
67
                );
68
69
                $this->sendMessageToOwner($ship, $managerProvider, $load);
70
            }
71
        }
72
73
        return $msg;
74
    }
75
76
    private function determineLoad(
77
        string $value,
78
        EpsSystemData $epsSystem,
79
        ManagerProviderInterface $managerProvider
80
    ): int {
81
        if ($value === 'm') {
82
            $load = $epsSystem->getMaxBattery() - $epsSystem->getBattery();
83
        } else {
84
            $load = (int) $value;
85
            if ($epsSystem->getBattery() + $load > $epsSystem->getMaxBattery()) {
86
                $load = $epsSystem->getMaxBattery() - $epsSystem->getBattery();
87
            }
88
        }
89
        if ($load > $managerProvider->getEps()) {
90
            $load = $managerProvider->getEps();
91
        }
92
93
        return $load;
94
    }
95
96
    private function sendMessageToOwner(SpacecraftInterface $spacecraft, ManagerProviderInterface $managerProvider, int $load): void
97
    {
98
        $this->privateMessageSender->send(
99
            $managerProvider->getUser()->getId(),
100
            $spacecraft->getUser()->getId(),
101
            sprintf(
102
                _('Die %s lädt in Sektor %s die Batterie der %s um %s Einheiten'),
103
                $managerProvider->getName(),
104
                $managerProvider->getSectorString(),
105
                $spacecraft->getName(),
106
                $load
107
            ),
108
            PrivateMessageFolderTypeEnum::SPECIAL_TRADE,
109
            $spacecraft->getHref()
110
        );
111
    }
112
}
113