Passed
Push — dev ( 1dcdd9...74922b )
by Janko
06:48
created

ManageCrew::increaseCrew()   B

Complexity

Conditions 9
Paths 4

Size

Total Lines 48
Code Lines 28

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 29
CRAP Score 9.0029

Importance

Changes 0
Metric Value
cc 9
eloc 28
nc 4
nop 6
dl 0
loc 48
ccs 29
cts 30
cp 0.9667
crap 9.0029
rs 8.0555
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() === $user
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
                $mincrew = $ship->getBuildplan()->getCrew();
112 2
                $actualcrew = $ship->getCrewCount();
113 2
                $maxcrew = $this->shipCrewCalculator->getMaxCrewCountByRump($ship->getRump());
114
115
                if (
116 2
                    $actualcrew >= $mincrew
117 2
                    && $actualcrew + $additionalCrew > $maxcrew
118 2
                    && ($ship->hasSpacecraftSystem(SpacecraftSystemTypeEnum::TROOP_QUARTERS) && ($additionalCrew > 0
119 2
                        && $ship->getSpacecraftSystem(SpacecraftSystemTypeEnum::TROOP_QUARTERS)->getMode() === SpacecraftSystemModeEnum::MODE_OFF
120 2
                        && !$this->helper->activate($wrapper, SpacecraftSystemTypeEnum::TROOP_QUARTERS, $informations)))
121
                ) {
122
123
                    $additionalCrew  = 0;
124
                }
125
            }
126
127 2
            $managerProvider->addCrewAssignment($ship, $additionalCrew);
128 2
            $msg[] = sprintf(
129 2
                _('%s: %d Crewman wurde(n) hochgebeamt'),
130 2
                $ship->getName(),
131 2
                $additionalCrew
132 2
            );
133
134 2
            $this->spacecraftStartup->startup($wrapper);
135
        }
136
    }
137
138
    /**
139
     * @param array<string> $msg
140
     */
141 3
    private function descreaseCrew(
142
        int $newCrewCount,
143
        SpacecraftWrapperInterface $wrapper,
144
        ManagerProviderInterface $managerProvider,
145
        array &$msg
146
    ): void {
147 3
        $ship = $wrapper->get();
148 3
        $user = $managerProvider->getUser();
149
150 3
        if ($managerProvider->getFreeCrewStorage() == 0) {
151 1
            $msg[] = sprintf(
152 1
                _('%s: Kein Platz für die Crew auf der %s'),
153 1
                $ship->getName(),
154 1
                $managerProvider->getName()
155 1
            );
156 1
            return;
157
        }
158
159 2
        $ownCrewCount = $this->troopTransferUtility->ownCrewOnTarget($user, $ship);
160
161 2
        $removedCrew = min(
162 2
            $ownCrewCount,
163 2
            $ship->getCrewCount() - $newCrewCount,
164 2
            $managerProvider->getFreeCrewStorage()
165 2
        );
166
167 2
        $this->dumpForeignCrew($ship);
168
169 2
        $managerProvider->addCrewAssignments(array_slice(
170 2
            $ship->getCrewAssignments()->toArray(),
171 2
            0,
172 2
            $removedCrew
173 2
        ));
174
175 2
        $msg[] = sprintf(
176 2
            _('%s: %d Crewman wurde(n) runtergebeamt'),
177 2
            $ship->getName(),
178 2
            $removedCrew
179 2
        );
180
181 2
        if ($removedCrew === $ownCrewCount) {
182 1
            $this->spacecraftShutdown->shutdown($wrapper);
183
        }
184
    }
185
186 2
    private function dumpForeignCrew(Spacecraft $spacecraft): void
187
    {
188 2
        foreach ($spacecraft->getCrewAssignments() as $shipCrew) {
189 2
            if ($shipCrew->getCrew()->getUser() !== $spacecraft->getUser()) {
190 1
                $this->spacecraftLeaver->dumpCrewman(
191 1
                    $shipCrew,
192 1
                    sprintf(
193 1
                        'Die Dienste von Crewman %s werden nicht mehr auf der Station %s von Spieler %s benötigt.',
194 1
                        $shipCrew->getCrew()->getName(),
195 1
                        $spacecraft->getName(),
196 1
                        $spacecraft->getUser()->getName(),
197 1
                    )
198 1
                );
199
            }
200
        }
201
    }
202
}
203