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

ManageTorpedo::sendMessage()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 19
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 12
nc 1
nop 4
dl 0
loc 19
rs 9.8666
c 0
b 0
f 0
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\SpacecraftSystemTypeEnum;
10
use Stu\Lib\SpacecraftManagement\Provider\ManagerProviderInterface;
11
use Stu\Module\Message\Lib\PrivateMessageFolderTypeEnum;
12
use Stu\Module\Message\Lib\PrivateMessageSenderInterface;
13
use Stu\Module\Spacecraft\Lib\Torpedo\ShipTorpedoManagerInterface;
14
use Stu\Module\Spacecraft\Lib\SpacecraftWrapperInterface;
15
use Stu\Orm\Entity\SpacecraftInterface;
16
use Stu\Orm\Entity\TorpedoTypeInterface;
17
use Stu\Orm\Repository\TorpedoTypeRepositoryInterface;
18
19
class ManageTorpedo implements ManagerInterface
20
{
21
    public function __construct(
22
        private TorpedoTypeRepositoryInterface $torpedoTypeRepository,
23
        private ShipTorpedoManagerInterface $shipTorpedoManager,
24
        private PrivateMessageSenderInterface $privateMessageSender
25
    ) {}
26
27
    #[Override]
28
    public function manage(SpacecraftWrapperInterface $wrapper, array $values, ManagerProviderInterface $managerProvider): array
29
    {
30
        $torp = $values['torp'] ?? null;
31
        if ($torp === null) {
32
            throw new RuntimeException('value array not existent');
33
        }
34
35
        $ship = $wrapper->get();
36
37
        if (!array_key_exists($ship->getId(), $torp)) {
38
            return [];
39
        }
40
41
        $count = $this->determineCount($torp[$ship->getId()], $ship);
42
43
        if ($count < 0) {
44
            return [];
45
        }
46
        if ($count === $ship->getTorpedoCount()) {
47
            return [];
48
        }
49
50
        $load = $count - $ship->getTorpedoCount();
51
        $isUnload = $load < 0;
52
53
        if ($isUnload) {
54
            return $this->unloadTorpedo(abs($load), $wrapper, $managerProvider);
0 ignored issues
show
Bug introduced by
It seems like abs($load) can also be of type double; however, parameter $unload of Stu\Lib\SpacecraftManage...orpedo::unloadTorpedo() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

54
            return $this->unloadTorpedo(/** @scrutinizer ignore-type */ abs($load), $wrapper, $managerProvider);
Loading history...
55
        } else {
56
            $selectedTorpedoTypeArray = $values['torp_type'] ?? null;
57
            $torpedoType = $this->determineTorpedoType($ship, $selectedTorpedoTypeArray);
58
59
            return $this->loadTorpedo($load, $torpedoType, $wrapper, $managerProvider);
60
        }
61
    }
62
63
    private function determineCount(mixed $value, SpacecraftInterface $spacecraft): int
64
    {
65
        if ($value == 'm') {
66
            return $spacecraft->getMaxTorpedos();
67
        } else {
68
            $count = (int) $value;
69
70
            if ($count > $spacecraft->getMaxTorpedos()) {
71
                $count = $spacecraft->getMaxTorpedos();
72
            }
73
74
            return $count;
75
        }
76
    }
77
78
    /**
79
     * @return array<int, TorpedoTypeInterface>
80
     */
81
    private function getPossibleTorpedoTypes(SpacecraftInterface $spacecraft): array
82
    {
83
        if ($spacecraft->hasShipSystem(SpacecraftSystemTypeEnum::SYSTEM_TORPEDO_STORAGE)) {
84
            return $this->torpedoTypeRepository->getAll();
85
        } else {
86
            return $this->torpedoTypeRepository->getByLevel($spacecraft->getRump()->getTorpedoLevel());
87
        }
88
    }
89
90
    /**
91
     * @return array<string>
92
     */
93
    private function unloadTorpedo(int $unload, SpacecraftWrapperInterface $wrapper, ManagerProviderInterface $managerProvider): array
94
    {
95
        $user = $managerProvider->getUser();
96
        $ship = $wrapper->get();
97
98
        if ($ship->getUser() !== $user) {
99
            return [];
100
        }
101
102
        $torpedoType = $ship->getTorpedo();
103
104
        if ($torpedoType === null) {
105
            return [];
106
        }
107
108
        $managerProvider->upperStorage($torpedoType->getCommodity(), $unload);
109
        $this->shipTorpedoManager->changeTorpedo($wrapper, -$unload);
110
111
        return [sprintf(
112
            _('%s: Es wurden %d Torpedos des Typs %s vom Schiff transferiert'),
113
            $ship->getName(),
114
            $unload,
115
            $torpedoType->getName()
116
        )];
117
    }
118
119
    /**
120
     * @param array<int|string, mixed>|null $selectedTorpedoTypeArray
121
     */
122
    private function determineTorpedoType(SpacecraftInterface $spacecraft, ?array $selectedTorpedoTypeArray): ?TorpedoTypeInterface
123
    {
124
        if ($spacecraft->getTorpedoCount() > 0) {
125
            return $spacecraft->getTorpedo();
126
        }
127
128
        if ($selectedTorpedoTypeArray === null) {
0 ignored issues
show
introduced by
The condition $selectedTorpedoTypeArray === null is always false.
Loading history...
129
            return null;
130
        }
131
132
        if (!array_key_exists($spacecraft->getId(), $selectedTorpedoTypeArray)) {
133
            return null;
134
        }
135
136
        $selectedTorpedoTypeId = (int) $selectedTorpedoTypeArray[$spacecraft->getId()];
137
        $possibleTorpedoTypes = $this->getPossibleTorpedoTypes($spacecraft);
138
139
        if (!array_key_exists($selectedTorpedoTypeId, $possibleTorpedoTypes)) {
140
            return null;
141
        }
142
143
        return $possibleTorpedoTypes[$selectedTorpedoTypeId];
144
    }
145
146
    /**
147
     * @return array<string>
148
     */
149
    private function loadTorpedo(
150
        int $load,
151
        ?TorpedoTypeInterface $torpedoType,
152
        SpacecraftWrapperInterface $wrapper,
153
        ManagerProviderInterface $managerProvider
154
    ): array {
155
        $ship = $wrapper->get();
156
157
        if ($torpedoType === null) {
158
            return [];
159
        }
160
161
        $storageElement = $managerProvider->getStorage()->get($torpedoType->getCommodityId());
162
        if ($storageElement === null) {
163
            return [sprintf(
164
                _('%s: Es sind keine Torpedos des Typs %s auf der %s vorhanden'),
165
                $ship->getName(),
166
                $torpedoType->getName(),
167
                $managerProvider->getName()
168
            )];
169
        }
170
171
        if ($load > $storageElement->getAmount()) {
172
            $load = $storageElement->getAmount();
173
        }
174
175
        $managerProvider->lowerStorage(
176
            $torpedoType->getCommodity(),
177
            $load
178
        );
179
180
        if ($ship->getTorpedoCount() === 0) {
181
            $this->shipTorpedoManager->changeTorpedo($wrapper, $load, $torpedoType);
182
        } else {
183
            $this->shipTorpedoManager->changeTorpedo($wrapper, $load);
184
        }
185
186
        $this->sendMessage(
187
            $load,
188
            $torpedoType,
189
            $managerProvider,
190
            $ship
191
        );
192
193
        return  [sprintf(
194
            _('%s: Es wurden %d Torpedos des Typs %s zum Schiff transferiert'),
195
            $ship->getName(),
196
            $load,
197
            $torpedoType->getName()
198
        )];
199
    }
200
201
    private function sendMessage(
202
        int $load,
203
        TorpedoTypeInterface $torpedoType,
204
        ManagerProviderInterface $managerProvider,
205
        SpacecraftInterface $spacecraft
206
    ): void {
207
        $this->privateMessageSender->send(
208
            $managerProvider->getUser()->getId(),
209
            $spacecraft->getUser()->getId(),
210
            sprintf(
211
                _('Die %s hat in Sektor %s %d %s auf die %s transferiert'),
212
                $managerProvider->getName(),
213
                $spacecraft->getSectorString(),
214
                $load,
215
                $torpedoType->getName(),
216
                $spacecraft->getName()
217
            ),
218
            PrivateMessageFolderTypeEnum::SPECIAL_TRADE,
219
            $spacecraft->getHref()
220
        );
221
    }
222
}
223