Completed
Branch develop (e10164)
by Benjamin
04:56
created

RulesExtension   A

Complexity

Total Complexity 17

Size/Duplication

Total Lines 120
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 17
eloc 69
c 1
b 0
f 0
dl 0
loc 120
rs 10

10 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A getFilters() 0 4 1
A getAllStarPlayers() 0 18 4
A getMaxPositionType() 0 5 1
A getRuleName() 0 3 1
A getAvailableStarPlayers() 0 18 4
A createTeamFor() 0 18 2
A getAllSkills() 0 15 1
A getAvailableRosters() 0 3 1
A getFunctions() 0 9 1
1
<?php
2
3
namespace Obblm\Core\Twig;
4
5
use Doctrine\Common\Collections\ArrayCollection;
6
use Doctrine\Common\Collections\Criteria;
7
use Obblm\Core\Entity\Player;
8
use Obblm\Core\Entity\PlayerVersion;
9
use Obblm\Core\Entity\Rule;
10
use Obblm\Core\Entity\Team;
11
use Obblm\Core\Helper\CoreTranslation;
12
use Obblm\Core\Helper\PlayerHelper;
13
use Obblm\Core\Helper\Rule\Inducement\MultipleStarPlayer;
14
use Obblm\Core\Helper\Rule\Skill\Skill;
15
use Obblm\Core\Helper\RuleHelper;
16
use Twig\Extension\AbstractExtension;
17
use Twig\TwigFilter;
18
use Twig\TwigFunction;
19
20
class RulesExtension extends AbstractExtension
21
{
22
    protected $ruleHelper;
23
24
    public function __construct(RuleHelper $ruleHelper)
25
    {
26
        $this->ruleHelper = $ruleHelper;
27
    }
28
29
    public function getFilters()
30
    {
31
        return [
32
            new TwigFilter('rule_name', [$this, 'getRuleName']),
33
        ];
34
    }
35
36
    public function getFunctions()
37
    {
38
        return [
39
            new TwigFunction('available_rosters', [$this, 'getAvailableRosters']),
40
            new TwigFunction('create_rule_team', [$this, 'createTeamFor']),
41
            new TwigFunction('max_position_type', [$this, 'getMaxPositionType']),
42
            new TwigFunction('get_star_players', [$this, 'getAvailableStarPlayers']),
43
            new TwigFunction('get_all_star_players', [$this, 'getAllStarPlayers']),
44
            new TwigFunction('get_all_skills', [$this, 'getAllSkills']),
45
        ];
46
    }
47
48
    public function getRuleName(Rule $rule)
49
    {
50
        return CoreTranslation::getRuleTitle($rule->getRuleKey());
51
    }
52
53
    public function getAvailableRosters(Rule $rule)
54
    {
55
        return $this->ruleHelper->getHelper($rule)->getAvailableRosters();
56
    }
57
58
    public function createTeamFor(Rule $rule, $roster)
59
    {
60
        $helper = $this->ruleHelper->getHelper($rule);
61
        $team = (new Team())
62
            ->setRule($rule)
63
            ->setName(CoreTranslation::getRosterKey($rule->getRuleKey(), $roster))
64
            ->setRoster($roster);
65
        $types = $helper->getAvailablePlayerKeyTypes($roster);
66
        foreach ($types as $type) {
67
            $version = new PlayerVersion();
68
            $player = (new Player())
69
                ->setType(PlayerHelper::composePlayerKey($rule->getRuleKey(), $roster, $type))
70
                ->setName(CoreTranslation::getPlayerKeyType($rule->getRuleKey(), $roster, $type))
71
                ->addVersion($version);
72
            $helper->setPlayerDefaultValues(PlayerHelper::getLastVersion($player));
73
            $team->addPlayer($player);
74
        }
75
        return $team;
76
    }
77
78
    public function getMaxPositionType(Rule $rule, Player $player)
79
    {
80
        list($ruleKey, $roster, $type) = explode(CoreTranslation::TRANSLATION_GLUE, $player->getType());
81
        $helper = $this->ruleHelper->getHelper($rule);
82
        return $helper->getMaxPlayersByType($roster, $type);
0 ignored issues
show
Bug introduced by
The method getMaxPlayersByType() does not exist on Obblm\Core\Contracts\RuleHelperInterface. Since it exists in all sub-types, consider adding an abstract or default implementation to Obblm\Core\Contracts\RuleHelperInterface. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

82
        return $helper->/** @scrutinizer ignore-call */ getMaxPlayersByType($roster, $type);
Loading history...
83
    }
84
85
    public function getAvailableStarPlayers(Team $team)
86
    {
87
        $helper = $this->ruleHelper->getHelper($team->getRule());
88
        $sps = $helper->getAvailableStarPlayers($team);
89
        $starPlayers = new ArrayCollection();
90
        foreach ($sps as $sp) {
91
            if ($sp instanceof MultipleStarPlayer) {
92
                $players = [];
93
                foreach ($sp->getParts() as $starPart) {
94
                    $players[] = $helper->createInducementAsPlayer($starPart);
0 ignored issues
show
Bug introduced by
The method createInducementAsPlayer() does not exist on Obblm\Core\Contracts\RuleHelperInterface. Since it exists in all sub-types, consider adding an abstract or default implementation to Obblm\Core\Contracts\RuleHelperInterface. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

94
                    /** @scrutinizer ignore-call */ 
95
                    $players[] = $helper->createInducementAsPlayer($starPart);
Loading history...
95
                    $starPlayers->add($helper->createInducementAsPlayer($starPart));
96
                }
97
                $sp->setParts($players);
98
            } else {
99
                $starPlayers->add($helper->createInducementAsPlayer($sp));
100
            }
101
        }
102
        return $starPlayers;
103
    }
104
105
    public function getAllStarPlayers(Rule $rule)
106
    {
107
        $helper = $this->ruleHelper->getHelper($rule);
108
        $sps = $helper->getStarPlayers();
109
        $starPlayers = new ArrayCollection();
110
        foreach ($sps as $sp) {
111
            if ($sp instanceof MultipleStarPlayer) {
112
                $players = [];
113
                foreach ($sp->getParts() as $starPart) {
114
                    $players[] = $helper->createInducementAsPlayer($starPart);
115
                    $starPlayers->add($helper->createInducementAsPlayer($starPart));
116
                }
117
                $sp->setParts($players);
118
            } else {
119
                $starPlayers->add($helper->createInducementAsPlayer($sp));
120
            }
121
        }
122
        return $starPlayers;
123
    }
124
125
    public function getAllSkills(Rule $rule)
126
    {
127
        $helper = $this->ruleHelper->getHelper($rule);
128
        /* Aplha ordering */
129
        $alpha = Criteria::create()
130
            ->orderBy(['key' => 'ASC']);
131
        $skills = $helper->getSkills()->matching($alpha);
0 ignored issues
show
Bug introduced by
The method getSkills() does not exist on Obblm\Core\Contracts\RuleHelperInterface. Since it exists in all sub-types, consider adding an abstract or default implementation to Obblm\Core\Contracts\RuleHelperInterface. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

131
        $skills = $helper->/** @scrutinizer ignore-call */ getSkills()->matching($alpha);
Loading history...
132
        return array_map(function (Skill $skill) use ($rule) {
133
            return [
134
                'name' => $skill->getTranslationKey(),
135
                'type' => $skill->getTypeTranslationKey(),
136
                'domain' => $skill->getTranslationDomain(),
137
                'description' => CoreTranslation::getSkillDescription($rule->getRuleKey(), $skill->getKey()),
138
            ];
139
        }, $skills->toArray());
140
    }
141
}
142