Passed
Pull Request — dev (#2038)
by Janko
10:55
created

RaiseExpertise::raiseExpertise()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 36
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 22
CRAP Score 3

Importance

Changes 0
Metric Value
cc 3
eloc 21
nc 4
nop 5
dl 0
loc 36
ccs 22
cts 22
cp 1
crap 3
rs 9.584
c 0
b 0
f 0
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