Passed
Push — master ( 4ae4ec...ea03fa )
by Nico
17:36
created

ChangeFleetLeader::change()   A

Complexity

Conditions 4
Paths 5

Size

Total Lines 34
Code Lines 22

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 24
CRAP Score 4.001

Importance

Changes 2
Bugs 1 Features 0
Metric Value
cc 4
eloc 22
c 2
b 1
f 0
nc 5
nop 1
dl 0
loc 34
ccs 24
cts 25
cp 0.96
crap 4.001
rs 9.568
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Stu\Module\Ship\Lib\Fleet;
6
7
use RuntimeException;
8
use Stu\Lib\InformationWrapper;
9
use Stu\Module\Ship\Lib\CancelColonyBlockOrDefendInterface;
10
use Stu\Orm\Entity\ShipInterface;
11
use Stu\Orm\Repository\FleetRepositoryInterface;
12
use Stu\Orm\Repository\ShipRepositoryInterface;
13
14
final class ChangeFleetLeader implements ChangeFleetLeaderInterface
15
{
16
    private FleetRepositoryInterface $fleetRepository;
17
18
    private ShipRepositoryInterface $shipRepository;
19
20
    private CancelColonyBlockOrDefendInterface $cancelColonyBlockOrDefend;
21
22 2
    public function __construct(
23
        FleetRepositoryInterface $fleetRepository,
24
        ShipRepositoryInterface $shipRepository,
25
        CancelColonyBlockOrDefendInterface $cancelColonyBlockOrDefend
26
    ) {
27 2
        $this->fleetRepository = $fleetRepository;
28 2
        $this->shipRepository = $shipRepository;
29 2
        $this->cancelColonyBlockOrDefend = $cancelColonyBlockOrDefend;
30
    }
31
32 2
    public function change(ShipInterface $oldLeader): void
33
    {
34 2
        $fleet = $oldLeader->getFleet();
35 2
        if ($fleet === null) {
36
            throw new RuntimeException('no fleet available');
37
        }
38
39 2
        $newLeader = current(
40 2
            array_filter(
41 2
                $fleet->getShips()->toArray(),
42 2
                fn (ShipInterface $ship): bool => $ship !== $oldLeader
43 2
            )
44 2
        );
45
46 2
        if ($newLeader === false) {
47 1
            $this->cancelColonyBlockOrDefend->work(
48 1
                $oldLeader,
49 1
                new InformationWrapper()
50 1
            );
51
        } else {
52 1
            $newLeader->setIsFleetLeader(true);
53 1
            $this->shipRepository->save($newLeader);
54
55 1
            $fleet->setLeadShip($newLeader);
56 1
            $fleet->getShips()->removeElement($oldLeader);
57 1
            $this->fleetRepository->save($fleet);
58
        }
59
60 2
        $oldLeader->setFleet(null);
61 2
        $oldLeader->setIsFleetLeader(false);
62 2
        $this->shipRepository->save($oldLeader);
63
64 2
        if ($newLeader === false) {
65 1
            $this->fleetRepository->delete($fleet);
66
        }
67
    }
68
}
69