Passed
Push — dev ( 736547...8e9f1f )
by Janko
06:55
created

ColonyResetter::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 24
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 12
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 11
nc 1
nop 11
dl 0
loc 24
ccs 12
cts 12
cp 1
crap 1
rs 9.9
c 0
b 0
f 0

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
3
declare(strict_types=1);
4
5
namespace Stu\Module\Colony\Lib;
6
7
use Stu\Module\Message\Lib\PrivateMessageFolderSpecialEnum;
8
use Stu\Module\Message\Lib\PrivateMessageSenderInterface;
9
use Stu\Module\PlayerSetting\Lib\UserEnum;
10
use Stu\Orm\Entity\ColonyInterface;
11
use Stu\Orm\Entity\FleetInterface;
12
use Stu\Orm\Repository\ColonyRepositoryInterface;
13
use Stu\Orm\Repository\ColonyShipQueueRepositoryInterface;
14
use Stu\Orm\Repository\ColonyTerraformingRepositoryInterface;
15
use Stu\Orm\Repository\CrewRepositoryInterface;
16
use Stu\Orm\Repository\CrewTrainingRepositoryInterface;
17
use Stu\Orm\Repository\FleetRepositoryInterface;
18
use Stu\Orm\Repository\PlanetFieldRepositoryInterface;
19
use Stu\Orm\Repository\ShipCrewRepositoryInterface;
20
use Stu\Orm\Repository\StorageRepositoryInterface;
21
use Stu\Orm\Repository\UserRepositoryInterface;
22
23
final class ColonyResetter implements ColonyResetterInterface
24
{
25
    private ColonyRepositoryInterface $colonyRepository;
26
27
    private UserRepositoryInterface $userRepository;
28
29
    private StorageRepositoryInterface $storageRepository;
30
31
    private ColonyTerraformingRepositoryInterface $colonyTerraformingRepository;
32
33
    private ColonyShipQueueRepositoryInterface $colonyShipQueueRepository;
34
35
    private PlanetFieldRepositoryInterface $planetFieldRepository;
36
37
    private FleetRepositoryInterface $fleetRepository;
38
39
    private CrewRepositoryInterface $crewRepository;
40
41
    private CrewTrainingRepositoryInterface $crewTrainingRepository;
42
43
    private ShipCrewRepositoryInterface $shipCrewRepository;
44
45
    private PrivateMessageSenderInterface $privateMessageSender;
46
47 1
    public function __construct(
48
        ColonyRepositoryInterface $colonyRepository,
49
        UserRepositoryInterface $userRepository,
50
        StorageRepositoryInterface $storageRepository,
51
        ColonyTerraformingRepositoryInterface $colonyTerraformingRepository,
52
        ColonyShipQueueRepositoryInterface $colonyShipQueueRepository,
53
        PlanetFieldRepositoryInterface $planetFieldRepository,
54
        FleetRepositoryInterface $fleetRepository,
55
        CrewRepositoryInterface $crewRepository,
56
        CrewTrainingRepositoryInterface $crewTrainingRepository,
57
        ShipCrewRepositoryInterface $shipCrewRepository,
58
        PrivateMessageSenderInterface $privateMessageSender
59
    ) {
60 1
        $this->colonyRepository = $colonyRepository;
61 1
        $this->userRepository = $userRepository;
62 1
        $this->storageRepository = $storageRepository;
63 1
        $this->colonyTerraformingRepository = $colonyTerraformingRepository;
64 1
        $this->colonyShipQueueRepository = $colonyShipQueueRepository;
65 1
        $this->planetFieldRepository = $planetFieldRepository;
66 1
        $this->fleetRepository = $fleetRepository;
67 1
        $this->crewRepository = $crewRepository;
68 1
        $this->crewTrainingRepository = $crewTrainingRepository;
69 1
        $this->shipCrewRepository = $shipCrewRepository;
70 1
        $this->privateMessageSender = $privateMessageSender;
71
    }
72
73 1
    public function reset(
74
        ColonyInterface $colony,
75
        bool $sendMessage = true
76
    ): void {
77 1
        $this->resetBlockers($colony, $sendMessage);
78 1
        $this->resetDefenders($colony, $sendMessage);
79 1
        $this->resetCrew($colony);
80 1
        $this->resetCrewTraining($colony);
81
82 1
        $colony->setEps(0)
83 1
            ->setMaxEps(0)
84 1
            ->setMaxStorage(0)
85 1
            ->setWorkers(0)
86 1
            ->setWorkless(0)
87 1
            ->setMaxBev(0)
88 1
            ->setImmigrationstate(true)
89 1
            ->setPopulationlimit(0)
90 1
            ->setUser($this->userRepository->getFallbackUser())
91 1
            ->setName('');
92
93 1
        $this->colonyRepository->save($colony);
94
95 1
        $this->storageRepository->truncateByColony($colony);
96
97 1
        foreach ($this->colonyTerraformingRepository->getByColony([$colony]) as $fieldTerraforming) {
98 1
            $this->colonyTerraformingRepository->delete($fieldTerraforming);
99
        }
100
101 1
        $this->colonyShipQueueRepository->truncateByColony($colony);
102 1
        $this->planetFieldRepository->truncateByColony($colony);
103
    }
104
105 1
    private function resetBlockers(ColonyInterface $colony, bool $sendMessage = true): void
106
    {
107 1
        foreach ($colony->getBlockers() as $blockerFleet) {
108 1
            if ($sendMessage) {
109
                $this->sendMessage($colony, $blockerFleet, false);
110
            }
111 1
            $blockerFleet->setBlockedColony(null);
112 1
            $this->fleetRepository->save($blockerFleet);
113
        }
114 1
        $colony->getBlockers()->clear();
115
    }
116
117 1
    private function resetDefenders(ColonyInterface $colony, bool $sendMessage = true): void
118
    {
119 1
        foreach ($colony->getDefenders() as $defenderFleet) {
120 1
            if ($sendMessage) {
121
                $this->sendMessage($colony, $defenderFleet, true);
122
            }
123 1
            $defenderFleet->setDefendedColony(null);
124 1
            $this->fleetRepository->save($defenderFleet);
125
        }
126 1
        $colony->getDefenders()->clear();
127
    }
128
129 1
    private function resetCrew(ColonyInterface $colony): void
130
    {
131 1
        foreach ($colony->getCrewAssignments() as $crewAssignment) {
132 1
            $this->shipCrewRepository->delete($crewAssignment);
133 1
            $this->crewRepository->delete($crewAssignment->getCrew());
134
        }
135
    }
136
137 1
    private function resetCrewTraining(ColonyInterface $colony): void
138
    {
139 1
        $this->crewTrainingRepository->truncateByColony($colony);
140
    }
141
142
    private function sendMessage(ColonyInterface $colony, FleetInterface $fleet, bool $isDefending): void
143
    {
144
        $txt = sprintf(
145
            'Der Spieler %s hat die Kolonie %s in Sektor %d|%d (%s System) verlassen. Deine Flotte %s hat die %s beendet.',
146
            $colony->getUser()->getName(),
147
            $colony->getName(),
148
            $colony->getSx(),
149
            $colony->getSy(),
150
            $colony->getSystem()->getName(),
151
            $fleet->getName(),
152
            $isDefending ? 'Verteidigung' : 'Blockade'
153
        );
154
155
        $this->privateMessageSender->send(
156
            UserEnum::USER_NOONE,
157
            (int) $fleet->getUserId(),
158
            $txt,
159
            PrivateMessageFolderSpecialEnum::PM_SPECIAL_SHIP
160
        );
161
    }
162
}
163