Completed
Branch develop (defee6)
by Benjamin
06:13
created

RulesExtension::getPlayerSkills()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 7
c 0
b 0
f 0
nc 1
nop 2
dl 0
loc 10
rs 10
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
            new TwigFunction('get_player_skills', [$this, 'getPlayerSkills']),
46
        ];
47
    }
48
49
    public function getRuleName(Rule $rule)
50
    {
51
        return CoreTranslation::getRuleTitle($rule->getRuleKey());
52
    }
53
54
    public function getAvailableRosters(Rule $rule)
55
    {
56
        return $this->ruleHelper->getHelper($rule)->getAvailableRosters();
57
    }
58
59
    public function createTeamFor(Rule $rule, $roster)
60
    {
61
        $helper = $this->ruleHelper->getHelper($rule);
62
        $team = (new Team())
63
            ->setRule($rule)
64
            ->setName(CoreTranslation::getRosterKey($rule->getRuleKey(), $roster))
65
            ->setRoster($roster);
66
        $types = $helper->getAvailablePlayerKeyTypes($roster);
67
        foreach ($types as $type) {
68
            $version = new PlayerVersion();
69
            $player = (new Player())
70
                ->setType(PlayerHelper::composePlayerKey($rule->getRuleKey(), $roster, $type))
71
                ->setName(CoreTranslation::getPlayerKeyType($rule->getRuleKey(), $roster, $type))
72
                ->addVersion($version);
73
            $helper->setPlayerDefaultValues(PlayerHelper::getLastVersion($player));
74
            $team->addPlayer($player);
75
        }
76
        return $team;
77
    }
78
79
    public function getMaxPositionType(Rule $rule, Player $player)
80
    {
81
        list($ruleKey, $roster, $type) = explode(CoreTranslation::TRANSLATION_GLUE, $player->getType());
82
        $helper = $this->ruleHelper->getHelper($rule);
83
        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

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

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

132
        return $helper->getSkills()->/** @scrutinizer ignore-call */ matching($alpha);
Loading history...
133
    }
134
135
    public function getPlayerSkills(Rule $rule, Player $player)
136
    {
137
        $helper = $this->ruleHelper->getHelper($rule);
138
        $version = PlayerHelper::getLastVersion($player);
139
        $c = Criteria::create()
140
            ->where(
141
                Criteria::expr()->in('key', $version->getSkills())
142
            )
143
            ->orderBy(['key' => 'ASC']);
144
        return $helper->getSkills()->matching($c);
145
    }
146
}
147