Passed
Pull Request — dev (#2038)
by Janko
09:06
created

RaiseExpertise   A

Complexity

Total Complexity 4

Size/Duplication

Total Lines 44
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
eloc 22
dl 0
loc 44
ccs 24
cts 24
cp 1
rs 10
c 0
b 0
f 0
wmc 4

2 Methods

Rating   Name   Duplication   Size   Complexity  
A raiseExpertise() 0 36 3
A __construct() 0 5 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Stu\Component\Crew\Skill;
6
7
use Stu\Component\Crew\CrewPositionEnum;
8
use Stu\Orm\Entity\CrewInterface;
9
use Stu\Orm\Entity\CrewSkillInterface;
10
use Stu\Orm\Entity\SkillEnhancementInterface;
11
use Stu\Orm\Entity\SpacecraftInterface;
12
use Stu\Orm\Repository\CrewRepositoryInterface;
13
use Stu\Orm\Repository\CrewSkillRepositoryInterface;
14
15
class RaiseExpertise
16
{
17 3
    public function __construct(
18
        private CrewSkillRepositoryInterface $crewSkillRepository,
19
        private CrewRepositoryInterface $crewRepository,
20
        private CreateEnhancementLog $createEnhancementLog
21 3
    ) {}
22
23 2
    public function raiseExpertise(
24
        CrewInterface $crew,
25
        SpacecraftInterface $spacecraft,
26
        CrewPositionEnum $position,
27
        SkillEnhancementInterface $enhancement,
28
        int $percentage
29
    ): void {
30 2
        $skills = $crew->getSkills();
31
32
        /** @var null|CrewSkillInterface */
33 2
        $skill = $skills->get($position->value);
34 2
        if ($skill === null) {
35 1
            $skill = $this->crewSkillRepository
36 1
                ->prototype()
37 1
                ->setCrew($crew)
38 1
                ->setPosition($position);
39
40 1
            $skills->set($position->value, $skill);
41
        }
42
43 2
        $oldRank = $skill->getRank();
44 2
        $amount = (int)ceil($enhancement->getExpertise() * $percentage / 100);
45 2
        $skill->increaseExpertise($amount);
46 2
        $this->crewSkillRepository->save($skill);
47
48 2
        if ($skill->getRank()->getNeededExpertise() > $oldRank->getNeededExpertise()) {
49 1
            $crew->setRank($skill->getRank());
50 1
            $this->crewRepository->save($crew);
51
        }
52
53 2
        $this->createEnhancementLog->createEnhancementLog(
54 2
            $skill,
55 2
            $spacecraft->getName(),
56 2
            $enhancement,
57 2
            $amount,
58 2
            $oldRank
59 2
        );
60
    }
61
}
62