Completed
Push — master ( c1ba47...3b776f )
by Benjamin
10:05 queued 04:46
created

RulesExtension   A

Complexity

Total Complexity 20

Size/Duplication

Total Lines 147
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 81
c 1
b 0
f 0
dl 0
loc 147
rs 10
wmc 20

12 Methods

Rating   Name   Duplication   Size   Complexity  
A getFilters() 0 4 1
A getSkillsForSheet() 0 14 2
A getAllStarPlayers() 0 18 4
A getMaxPositionType() 0 5 1
A getRuleName() 0 3 1
A createTeamFor() 0 18 2
A getAvailableStarPlayers() 0 18 4
A getAllSkills() 0 7 1
A getAvailableRosters() 0 3 1
A getPlayerSkills() 0 10 1
A getFunctions() 0 11 1
A __construct() 0 3 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\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 Twig\Extension\AbstractExtension;
18
use Twig\TwigFilter;
19
use Twig\TwigFunction;
20
21
class RulesExtension extends AbstractExtension
22
{
23
    protected $ruleHelper;
24
25
    public function __construct(RuleHelper $ruleHelper)
26
    {
27
        $this->ruleHelper = $ruleHelper;
28
    }
29
30
    public function getFilters()
31
    {
32
        return [
33
            new TwigFilter('rule_name', [$this, 'getRuleName']),
34
        ];
35
    }
36
37
    public function getFunctions()
38
    {
39
        return [
40
            new TwigFunction('available_rosters', [$this, 'getAvailableRosters']),
41
            new TwigFunction('create_rule_team', [$this, 'createTeamFor']),
42
            new TwigFunction('max_position_type', [$this, 'getMaxPositionType']),
43
            new TwigFunction('get_star_players', [$this, 'getAvailableStarPlayers']),
44
            new TwigFunction('get_all_star_players', [$this, 'getAllStarPlayers']),
45
            new TwigFunction('get_all_skills', [$this, 'getAllSkills']),
46
            new TwigFunction('get_player_skills', [$this, 'getPlayerSkills']),
47
            new TwigFunction('get_skills_for_sheet', [$this, 'getSkillsForSheet']),
48
        ];
49
    }
50
51
    public function getRuleName(Rule $rule)
52
    {
53
        return CoreTranslation::getRuleTitle($rule->getRuleKey());
54
    }
55
56
    public function getAvailableRosters(Rule $rule)
57
    {
58
        return $this->ruleHelper->getHelper($rule)->getAvailableRosters();
59
    }
60
61
    public function createTeamFor(Rule $rule, $roster)
62
    {
63
        $helper = $this->ruleHelper->getHelper($rule);
64
        $team = (new Team())
65
            ->setRule($rule)
66
            ->setName(CoreTranslation::getRosterKey($rule->getRuleKey(), $roster))
67
            ->setRoster($roster);
68
        $types = $helper->getAvailablePlayerKeyTypes($roster);
69
        foreach ($types as $type) {
70
            $version = new PlayerVersion();
71
            $player = (new Player())
72
                ->setType(PlayerHelper::composePlayerKey($rule->getRuleKey(), $roster, $type))
73
                ->setName(CoreTranslation::getPlayerKeyType($rule->getRuleKey(), $roster, $type))
74
                ->addVersion($version);
75
            $helper->setPlayerDefaultValues(PlayerHelper::getLastVersion($player));
76
            $team->addPlayer($player);
77
        }
78
        return $team;
79
    }
80
81
    public function getMaxPositionType(Rule $rule, Player $player)
82
    {
83
        list($ruleKey, $roster, $type) = explode(CoreTranslation::TRANSLATION_GLUE, $player->getType());
84
        $helper = $this->ruleHelper->getHelper($rule);
85
        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

85
        return $helper->/** @scrutinizer ignore-call */ getMaxPlayersByType($roster, $type);
Loading history...
86
    }
87
88
    public function getAvailableStarPlayers(Team $team)
89
    {
90
        $helper = $this->ruleHelper->getHelper($team->getRule());
91
        $sps = $helper->getAvailableStarPlayers($team);
92
        $starPlayers = new ArrayCollection();
93
        foreach ($sps as $sp) {
94
            if ($sp instanceof MultipleStarPlayer) {
95
                $players = [];
96
                foreach ($sp->getParts() as $starPart) {
97
                    $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

97
                    /** @scrutinizer ignore-call */ 
98
                    $players[] = $helper->createInducementAsPlayer($starPart);
Loading history...
98
                    $starPlayers->add($helper->createInducementAsPlayer($starPart));
99
                }
100
                $sp->setParts($players);
101
            } else {
102
                $starPlayers->add($helper->createInducementAsPlayer($sp));
103
            }
104
        }
105
        return $starPlayers;
106
    }
107
108
    public function getAllStarPlayers(Rule $rule)
109
    {
110
        $helper = $this->ruleHelper->getHelper($rule);
111
        $sps = $helper->getStarPlayers();
112
        $starPlayers = new ArrayCollection();
113
        foreach ($sps as $sp) {
114
            if ($sp instanceof MultipleStarPlayer) {
115
                $players = [];
116
                foreach ($sp->getParts() as $starPart) {
117
                    $players[] = $helper->createInducementAsPlayer($starPart);
118
                    $starPlayers->add($helper->createInducementAsPlayer($starPart));
119
                }
120
                $sp->setParts($players);
121
            } else {
122
                $starPlayers->add($helper->createInducementAsPlayer($sp));
123
            }
124
        }
125
        return $starPlayers;
126
    }
127
128
    public function getAllSkills(Rule $rule)
129
    {
130
        $helper = $this->ruleHelper->getHelper($rule);
131
        /* Aplha ordering */
132
        $alpha = Criteria::create()
133
            ->orderBy(['key' => 'ASC']);
134
        return $helper->getSkills()->matching($alpha);
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

134
        return $helper->getSkills()->/** @scrutinizer ignore-call */ matching($alpha);
Loading history...
135
    }
136
137
    public function getPlayerSkills(Rule $rule, Player $player)
138
    {
139
        $helper = $this->ruleHelper->getHelper($rule);
140
        $version = PlayerHelper::getLastVersion($player);
141
        $c = Criteria::create()
142
            ->where(
143
                Criteria::expr()->in('key', $version->getSkills())
144
            )
145
            ->orderBy(['key' => 'ASC']);
146
        return $helper->getSkills()->matching($c);
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
        $helper = $this->ruleHelper->getHelper($rule);
162
        $c = Criteria::create()
163
            ->where(
164
                Criteria::expr()->in('key', $skills)
165
            )
166
            ->orderBy(['key' => 'ASC']);
167
        return $helper->getSkills()->matching($c);
168
    }
169
}
170