Completed
Branch v1.x-dev (ef54be)
by Benjamin
03:52
created

RulesExtension::translateAndOrderStarPlayers()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 23
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 17
c 1
b 0
f 0
dl 0
loc 23
ccs 0
cts 17
cp 0
rs 9.7
cc 4
nc 4
nop 2
crap 20
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\Entity\TeamVersion;
12
use Obblm\Core\Helper\CoreTranslation;
13
use Obblm\Core\Helper\PlayerHelper;
14
use Obblm\Core\Helper\Rule\Inducement\MultipleStarPlayer;
15
use Obblm\Core\Helper\Rule\Skill\Skill;
16
use Obblm\Core\Helper\RuleHelper;
17
use Symfony\Contracts\Translation\TranslatorInterface;
18
use Twig\Extension\AbstractExtension;
19
use Twig\TwigFilter;
20
use Twig\TwigFunction;
21
22
class RulesExtension extends AbstractExtension
23
{
24
    protected $ruleHelper;
25
    protected $translator;
26
27
    public function __construct(RuleHelper $ruleHelper, TranslatorInterface $translator)
28
    {
29
        $this->ruleHelper = $ruleHelper;
30
        $this->translator = $translator;
31
    }
32
33
    public function getFilters()
34
    {
35
        return [
36
            new TwigFilter('rule_name', [$this, 'getRuleName']),
37
        ];
38
    }
39
40
    public function getFunctions()
41
    {
42
        return [
43
            new TwigFunction('available_rosters', [$this, 'getAvailableRosters']),
44
            new TwigFunction('create_rule_team', [$this, 'createTeamFor']),
45
            new TwigFunction('max_position_type', [$this, 'getMaxPositionType']),
46
            new TwigFunction('get_star_player_rosters', [$this, 'getStarPlayerRosters']),
47
            new TwigFunction('get_star_players', [$this, 'getAvailableStarPlayers']),
48
            new TwigFunction('get_all_star_players', [$this, 'getAllStarPlayers']),
49
            new TwigFunction('get_all_skills', [$this, 'getAllSkills']),
50
            new TwigFunction('get_player_skills', [$this, 'getPlayerSkills']),
51
            new TwigFunction('get_skills_for_sheet', [$this, 'getSkillsForSheet']),
52
        ];
53
    }
54
55
    public function getRuleName(Rule $rule)
56
    {
57
        return CoreTranslation::getRuleTitle($rule->getRuleKey());
58
    }
59
60
    public function getAvailableRosters(Rule $rule)
61
    {
62
        return $this->ruleHelper->getHelper($rule)->getAvailableRosters();
0 ignored issues
show
Bug introduced by
The method getAvailableRosters() does not exist on Obblm\Core\Contracts\RuleHelperInterface. Did you maybe mean getAvailableSkills()? ( Ignorable by Annotation )

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

62
        return $this->ruleHelper->getHelper($rule)->/** @scrutinizer ignore-call */ getAvailableRosters();

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
63
    }
64
65
    public function createTeamFor(Rule $rule, $roster)
66
    {
67
        $helper = $this->ruleHelper->getHelper($rule);
68
        $team = (new Team())
69
            ->setRule($rule)
70
            ->setName(CoreTranslation::getRosterKey($rule->getRuleKey(), $roster))
71
            ->setRoster($roster);
72
        $types = $helper->getAvailablePlayerKeyTypes($roster);
73
        foreach ($types as $type) {
74
            $version = new PlayerVersion();
75
            $player = (new Player())
76
                ->setType(PlayerHelper::composePlayerKey($rule->getRuleKey(), $roster, $type))
77
                ->setName(CoreTranslation::getPlayerKeyType($rule->getRuleKey(), $roster, $type))
78
                ->addVersion($version);
79
            $helper->setPlayerDefaultValues(PlayerHelper::getLastVersion($player));
80
            $team->addPlayer($player);
81
        }
82
        return $team;
83
    }
84
85
    public function getMaxPositionType(Rule $rule, Player $player)
86
    {
87
        list($ruleKey, $roster, $type) = explode(CoreTranslation::TRANSLATION_GLUE, $player->getType());
88
        $helper = $this->ruleHelper->getHelper($rule);
89
        return $helper->getMaxPlayersByType($roster, $type);
90
    }
91
92
    public function getAvailableStarPlayers(Team $team)
93
    {
94
        $helper = $this->ruleHelper->getHelper($team->getRule());
95
        $sps = $helper->getAvailableStarPlayers($team);
96
        return $this->translateAndOrderStarPlayers($team->getRule(), $sps);
97
    }
98
99
    public function getStarPlayerRosters(Player $starPlayer)
0 ignored issues
show
Unused Code introduced by
The parameter $starPlayer is not used and could be removed. ( Ignorable by Annotation )

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

99
    public function getStarPlayerRosters(/** @scrutinizer ignore-unused */ Player $starPlayer)

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
100
    {
101
        //$inducement
102
    }
103
104
    public function getAllStarPlayers(Rule $rule)
105
    {
106
        $helper = $this->ruleHelper->getHelper($rule);
107
        $sps = $helper->getStarPlayers();
108
        return $this->translateAndOrderStarPlayers($rule, $sps->toArray());
109
    }
110
111
    private function translateAndOrderStarPlayers(Rule $rule, array $sps)
112
    {
113
        $helper = $this->ruleHelper->getHelper($rule);
114
        $starPlayers = new ArrayCollection();
115
        foreach ($sps as $sp) {
116
            if ($sp instanceof MultipleStarPlayer) {
117
                $players = [];
118
                foreach ($sp->getParts() as $starPart) {
119
                    $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

119
                    /** @scrutinizer ignore-call */ 
120
                    $players[] = $helper->createInducementAsPlayer($starPart);
Loading history...
120
                    $starPlayers->add($helper->createInducementAsPlayer($starPart));
121
                }
122
                $sp->setParts($players);
123
            } else {
124
                $starPlayers->add($helper->createInducementAsPlayer($sp));
125
            }
126
        }
127
        $translator = $this->translator;
128
        $closure = function (Player $starPlayer) use ($translator, $rule) {
129
            $starPlayer->setName($translator->trans($starPlayer->getName(), [], $rule->getRuleKey()));
130
            return $starPlayer;
131
        };
132
        $order = Criteria::create()->orderBy(['name' => 'ASC']);
133
        return $starPlayers->map($closure)->matching($order);
134
    }
135
136
    public function getAllSkills(Rule $rule)
137
    {
138
        $helper = $this->ruleHelper->getHelper($rule);
0 ignored issues
show
Unused Code introduced by
The assignment to $helper is dead and can be removed.
Loading history...
139
        /* Aplha ordering */
140
        return $this->translateAndOrderSkills($rule);
141
    }
142
143
    public function getPlayerSkills(Rule $rule, Player $player)
144
    {
145
        $version = PlayerHelper::getLastVersion($player);
146
        return $this->translateAndOrderSkills($rule, $version->getSkills());
147
    }
148
149
    /**
150
     * @param Rule $rule
151
     * @param ArrayCollection|Player[] $players
152
     * @return ArrayCollection
153
     */
154
    public function getSkillsForSheet(Rule $rule, TeamVersion $team)
155
    {
156
        $skills = [];
157
        foreach ($team->getAvailablePlayerVersions() as $player) {
158
            $skills = array_merge($skills, $player->getSkills());
159
            $skills = array_merge($skills, $player->getAdditionalSkills());
160
        }
161
        return $this->translateAndOrderSkills($rule, $skills);
162
    }
163
164
    private function translateAndOrderSkills(Rule $rule, array $skills = null)
165
    {
166
        $helper = $this->ruleHelper->getHelper($rule);
167
168
        $returnSkills = $helper->getSkills();
169
170
        if ($skills !== null) {
171
            $filter = Criteria::create()->where(Criteria::expr()->in('key', $skills));
172
            $returnSkills = $returnSkills->matching($filter);
0 ignored issues
show
Bug introduced by
The method matching() does not exist on Doctrine\Common\Collections\Collection. It seems like you code against a sub-type of said class. However, the method does not exist in Doctrine\Common\Collections\AbstractLazyCollection. Are you sure you never get one of those? ( Ignorable by Annotation )

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

172
            /** @scrutinizer ignore-call */ 
173
            $returnSkills = $returnSkills->matching($filter);
Loading history...
173
        }
174
        $order = Criteria::create()->orderBy(['name' => 'ASC']);
175
176
        $translator = $this->translator;
177
        $closure = function (Skill $skill) use ($translator, $rule) {
178
            $skill->setName($translator->trans($skill->getName(), [], $rule->getRuleKey()));
179
            return $skill;
180
        };
181
182
        return $returnSkills->map($closure)->matching($order);
183
    }
184
}
185