Passed
Push — dev ( f1d1a0...3da2bc )
by Nico
05:28
created

ManageCrew::increaseCrew()   B

Complexity

Conditions 8
Paths 4

Size

Total Lines 46
Code Lines 26

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 27
CRAP Score 8.0029

Importance

Changes 0
Metric Value
cc 8
eloc 26
nc 4
nop 6
dl 0
loc 46
ccs 27
cts 28
cp 0.9643
crap 8.0029
rs 8.4444
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\Crew\SpacecraftCrewCalculatorInterface;
10
use Stu\Component\Spacecraft\System\SpacecraftSystemTypeEnum;
11
use Stu\Component\Spacecraft\System\SpacecraftSystemModeEnum;
12
use Stu\Lib\SpacecraftManagement\Provider\ManagerProviderInterface;
13
use Stu\Module\Spacecraft\Lib\Auxiliary\SpacecraftShutdownInterface;
14
use Stu\Module\Spacecraft\Lib\Crew\SpacecraftLeaverInterface;
15
use Stu\Module\Spacecraft\Lib\Crew\TroopTransferUtilityInterface;
16
use Stu\Component\Spacecraft\System\Control\ActivatorDeactivatorHelperInterface;
17
use Stu\Lib\Information\InformationWrapper;
18
use Stu\Module\Spacecraft\Lib\Auxiliary\SpacecraftStartupInterface;
19
use Stu\Module\Spacecraft\Lib\SpacecraftWrapperInterface;
20
use Stu\Orm\Entity\SpacecraftBuildplan;
21
use Stu\Orm\Entity\Spacecraft;
22
23
class ManageCrew implements ManagerInterface
24
{
25 13
    public function __construct(
26
        private readonly SpacecraftCrewCalculatorInterface $shipCrewCalculator,
27
        private readonly TroopTransferUtilityInterface $troopTransferUtility,
28
        private readonly SpacecraftShutdownInterface $spacecraftShutdown,
29
        private readonly SpacecraftLeaverInterface $spacecraftLeaver,
30
        private readonly ActivatorDeactivatorHelperInterface $helper,
31
        private readonly SpacecraftStartupInterface $spacecraftStartup
32 13
    ) {}
33
34 12
    #[Override]
35
    public function manage(SpacecraftWrapperInterface $wrapper, array $values, ManagerProviderInterface $managerProvider): array
36
    {
37 12
        $msg = [];
38 12
        $informations = new InformationWrapper();
39
40 12
        $newCrewCountArray = $values['crew'] ?? null;
41 12
        if ($newCrewCountArray === null) {
42 1
            throw new RuntimeException('value array not existent');
43
        }
44
45 11
        $ship = $wrapper->get();
46 11
        $user = $managerProvider->getUser();
47 11
        $buildplan = $ship->getBuildplan();
48
49
        if (
50 11
            isset($newCrewCountArray[$ship->getId()])
51 11
            && $wrapper->canMan()
52 11
            && $buildplan !== null
53 11
            && $ship->getUser()->getId() === $user->getId()
54
        ) {
55 7
            $newCrewCount = (int)$newCrewCountArray[$ship->getId()];
56 7
            if ($ship->getCrewCount() !== $newCrewCount) {
57 6
                $this->setNewCrew($newCrewCount, $wrapper, $buildplan, $managerProvider, $msg, $informations);
58
            }
59
        }
60
61 11
        return array_merge($msg, $informations->getInformations());
62
    }
63
64
    /**
65
     * @param array<string> $msg
66
     */
67 6
    private function setNewCrew(
68
        int $newCrewCount,
69
        SpacecraftWrapperInterface $wrapper,
70
        SpacecraftBuildplan $buildplan,
71
        ManagerProviderInterface $managerProvider,
72
        array &$msg,
73
        InformationWrapper $informations
74
    ): void {
75 6
        $ship = $wrapper->get();
76
77 6
        if ($newCrewCount > $ship->getCrewCount()) {
78 3
            $this->increaseCrew($newCrewCount, $wrapper, $buildplan, $managerProvider, $msg, $informations);
79
        } else {
80 3
            $this->descreaseCrew($newCrewCount, $wrapper, $managerProvider, $msg);
81
        }
82
    }
83
84
    /**
85
     * @param array<string> $msg
86
     */
87 3
    private function increaseCrew(
88
        int $newCrewCount,
89
        SpacecraftWrapperInterface $wrapper,
90
        SpacecraftBuildplan $buildplan,
91
        ManagerProviderInterface $managerProvider,
92
        array &$msg,
93
        InformationWrapper $informations
94
    ): void {
95 3
        $ship = $wrapper->get();
96
97 3
        if ($managerProvider->getFreeCrewAmount() == 0) {
98 1
            $msg[] = sprintf(
99 1
                _('%s: Keine Crew auf der %s vorhanden'),
100 1
                $ship->getName(),
101 1
                $managerProvider->getName(),
102 1
                $buildplan->getCrew()
103 1
            );
104
        } else {
105 2
            $additionalCrew = min(
106 2
                $newCrewCount - $ship->getCrewCount(),
107 2
                $managerProvider->getFreeCrewAmount()
108 2
            );
109
110 2
            if ($ship->getBuildplan() != null) {
111 2
                $actualcrew = $ship->getCrewCount();
112 2
                $maxcrew = $this->shipCrewCalculator->getMaxCrewCountByRump($ship->getRump());
113
114
                if (
115 2
                    $actualcrew + $additionalCrew > $maxcrew
116 2
                    && ($ship->hasSpacecraftSystem(SpacecraftSystemTypeEnum::TROOP_QUARTERS) && ($additionalCrew > 0
117 2
                        && $ship->getSpacecraftSystem(SpacecraftSystemTypeEnum::TROOP_QUARTERS)->getMode() === SpacecraftSystemModeEnum::MODE_OFF
118 2
                        && !$this->helper->activate($wrapper, SpacecraftSystemTypeEnum::TROOP_QUARTERS, $informations)))
119
                ) {
120
121
                    $additionalCrew  = 0;
122
                }
123
            }
124
125 2
            $managerProvider->addCrewAssignment($ship, $additionalCrew);
126 2
            $msg[] = sprintf(
127 2
                _('%s: %d Crewman wurde(n) hochgebeamt'),
128 2
                $ship->getName(),
129 2
                $additionalCrew
130 2
            );
131
132 2
            $this->spacecraftStartup->startup($wrapper);
133
        }
134
    }
135
136
    /**
137
     * @param array<string> $msg
138
     */
139 3
    private function descreaseCrew(
140
        int $newCrewCount,
141
        SpacecraftWrapperInterface $wrapper,
142
        ManagerProviderInterface $managerProvider,
143
        array &$msg
144
    ): void {
145 3
        $ship = $wrapper->get();
146 3
        $user = $managerProvider->getUser();
147 3
        if ($managerProvider->getFreeCrewStorage() == 0) {
148 1
            $msg[] = sprintf(
149 1
                _('%s: Kein Platz für die Crew auf der %s'),
150 1
                $ship->getName(),
151 1
                $managerProvider->getName()
152 1
            );
153 1
            return;
154
        }
155
156 2
        $ownCrewCount = $this->troopTransferUtility->ownCrewOnTarget($user, $ship);
157
158 2
        $removedCrew = min(
159 2
            $ownCrewCount,
160 2
            $ship->getCrewCount() - $newCrewCount,
161 2
            $managerProvider->getFreeCrewStorage()
162 2
        );
163
164 2
        if ($ship->getBuildplan() != null) {
165 2
            $mincrew = $ship->getBuildplan()->getCrew();
166 2
            $actualcrew = $ship->getCrewCount();
167 2
            $maxcrew = $this->shipCrewCalculator->getMaxCrewCountByRump($ship->getRump());
168
169
            if (
170 2
                $actualcrew - $removedCrew >= $mincrew && $actualcrew - $removedCrew < $maxcrew &&
171 2
                $ship->hasSpacecraftSystem(SpacecraftSystemTypeEnum::TROOP_QUARTERS)
172 2
                && ($removedCrew > 0 && $ship->getSpacecraftSystem(SpacecraftSystemTypeEnum::TROOP_QUARTERS)->getMode() === SpacecraftSystemModeEnum::MODE_ON
173
                )
174
            ) {
175
                $informations = new InformationWrapper();
176
                $this->helper->deactivate($wrapper, SpacecraftSystemTypeEnum::TROOP_QUARTERS, $informations);
177
                $msg = array_merge($msg, $informations->getInformations());
178
            }
179
        }
180
181
182 2
        $this->dumpForeignCrew($ship);
183
184 2
        $managerProvider->addCrewAssignments(array_slice(
185 2
            $ship->getCrewAssignments()->toArray(),
186 2
            0,
187 2
            $removedCrew
188 2
        ));
189
190 2
        $msg[] = sprintf(
191 2
            _('%s: %d Crewman wurde(n) runtergebeamt'),
192 2
            $ship->getName(),
193 2
            $removedCrew
194 2
        );
195
196 2
        if ($removedCrew === $ownCrewCount) {
197 1
            $this->spacecraftShutdown->shutdown($wrapper);
198
        }
199
    }
200
201 2
    private function dumpForeignCrew(Spacecraft $spacecraft): void
202
    {
203 2
        foreach ($spacecraft->getCrewAssignments() as $shipCrew) {
204 2
            if ($shipCrew->getCrew()->getUser()->getId() !== $spacecraft->getUser()->getId()) {
205 1
                $this->spacecraftLeaver->dumpCrewman(
206 1
                    $shipCrew,
207 1
                    sprintf(
208 1
                        'Die Dienste von Crewman %s werden nicht mehr auf der Station %s von Spieler %s benötigt.',
209 1
                        $shipCrew->getCrew()->getName(),
210 1
                        $spacecraft->getName(),
211 1
                        $spacecraft->getUser()->getName(),
212 1
                    )
213 1
                );
214
            }
215
        }
216
    }
217
}