Passed
Push — dev ( 91d807...b97e85 )
by Janko
28:41
created

CallForSupportBehaviour::createSupportFleet()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 7
nc 1
nop 1
dl 0
loc 11
ccs 0
cts 9
cp 0
crap 2
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace Stu\Lib\Pirate\Behaviour;
4
5
use RuntimeException;
6
use Stu\Lib\Map\DistanceCalculationInterface;
7
use Stu\Lib\Pirate\Component\PirateNavigationInterface;
8
use Stu\Lib\Pirate\Component\ReloadMinimalEpsInterface;
9
use Stu\Lib\Pirate\PirateBehaviourEnum;
10
use Stu\Lib\Pirate\PirateCreationInterface;
11
use Stu\Module\Ship\Lib\FleetWrapperInterface;
12
use Stu\Lib\Pirate\PirateReactionInterface;
13
use Stu\Lib\Pirate\PirateReactionTriggerEnum;
14
use Stu\Module\Logging\LoggerUtilFactoryInterface;
15
use Stu\Module\Logging\PirateLoggerInterface;
16
use Stu\Module\Ship\Lib\ShipWrapperFactoryInterface;
17
use Stu\Orm\Entity\FleetInterface;
18
use Stu\Orm\Entity\ShipInterface;
19
use Stu\Orm\Repository\ShipRepositoryInterface;
20
21
class CallForSupportBehaviour implements PirateBehaviourInterface
22
{
23
    private PirateLoggerInterface $logger;
24
25
    public function __construct(
26
        private ShipRepositoryInterface $shipRepository,
27
        private PirateCreationInterface $pirateCreation,
28
        private DistanceCalculationInterface $distanceCalculation,
29
        private ReloadMinimalEpsInterface $reloadMinimalEps,
30
        private PirateNavigationInterface $pirateNavigation,
31
        private ShipWrapperFactoryInterface $shipWrapperFactory,
32
        LoggerUtilFactoryInterface $loggerUtilFactory
33
    ) {
34
        $this->logger = $loggerUtilFactory->getPirateLogger();
35
    }
36
37
    public function action(FleetWrapperInterface $fleet, PirateReactionInterface $pirateReaction): ?PirateBehaviourEnum
38
    {
39
        $leadWrapper = $fleet->getLeadWrapper();
40
        $leadShip = $leadWrapper->get();
41
42
        $supportFleet = $this->getSupportFleet($leadShip);
43
44
        $pirateReaction->react(
45
            $supportFleet,
46
            PirateReactionTriggerEnum::ON_SUPPORT_CALL,
47
            $leadShip
48
        );
49
50
        return null;
51
    }
52
53
    private function getSupportFleet(ShipInterface $leadShip): FleetInterface
54
    {
55
        $friends = $this->shipRepository->getPirateFriends($leadShip);
56
57
        usort(
58
            $friends,
59
            fn (ShipInterface $a, ShipInterface $b) =>
60
            $this->distanceCalculation->shipToShipDistance($leadShip, $a) - $this->distanceCalculation->shipToShipDistance($leadShip, $b)
61
        );
62
63
        $closestFriend = current($friends);
64
        if (!$closestFriend) {
65
            return $this->createSupportFleet($leadShip);
66
        }
67
68
        $supportFleet = $closestFriend->getFleet();
69
        if ($supportFleet === null) {
70
            throw new RuntimeException('pirate ships should always be in fleet');
71
        }
72
73
        $fleetWrapper = $this->shipWrapperFactory->wrapFleet($supportFleet);
74
75
        $this->reloadMinimalEps->reload($fleetWrapper, 75);
76
        if (!$this->pirateNavigation->navigateToTarget($fleetWrapper, $leadShip->getCurrentMapField())) {
77
            return $this->createSupportFleet($leadShip);
78
        }
79
80
        $this->logger->logf(
81
            '    already existing support fleet (%d) "%s" reached here %s',
82
            $supportFleet->getId(),
83
            $supportFleet->getName(),
84
            $supportFleet->getLeadShip()->getSectorString()
85
        );
86
87
        return $supportFleet;
88
    }
89
90
    private function createSupportFleet(ShipInterface $leadShip): FleetInterface
91
    {
92
        $supportFleet = $this->pirateCreation->createPirateFleet($leadShip);
93
        $this->logger->logf(
94
            '    created support fleet %d "%s" here %s',
95
            $supportFleet->getId(),
96
            $supportFleet->getName(),
97
            $supportFleet->getLeadShip()->getSectorString()
98
        );
99
100
        return $supportFleet;
101
    }
102
}
103