Completed
Branch develop (598d0f)
by Benjamin
03:23
created

RulesExtension   A

Complexity

Total Complexity 16

Size/Duplication

Total Lines 114
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 67
c 1
b 0
f 0
dl 0
loc 114
rs 10
wmc 16

9 Methods

Rating   Name   Duplication   Size   Complexity  
A getFilters() 0 3 1
A getAllStarPlayers() 0 18 4
A getMaxPositionType() 0 5 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
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\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
        ];
33
    }
34
35
    public function getFunctions()
36
    {
37
        return [
38
            new TwigFunction('available_rosters', [$this, 'getAvailableRosters']),
39
            new TwigFunction('create_rule_team', [$this, 'createTeamFor']),
40
            new TwigFunction('max_position_type', [$this, 'getMaxPositionType']),
41
            new TwigFunction('get_star_players', [$this, 'getAvailableStarPlayers']),
42
            new TwigFunction('get_all_star_players', [$this, 'getAllStarPlayers']),
43
            new TwigFunction('get_all_skills', [$this, 'getAllSkills']),
44
        ];
45
    }
46
47
    public function getAvailableRosters(Rule $rule)
48
    {
49
        return $this->ruleHelper->getHelper($rule)->getAvailableRosters();
50
    }
51
52
    public function createTeamFor(Rule $rule, $roster)
53
    {
54
        $helper = $this->ruleHelper->getHelper($rule);
55
        $team = (new Team())
56
            ->setRule($rule)
57
            ->setName(CoreTranslation::getRosterKey($rule->getRuleKey(), $roster))
58
            ->setRoster($roster);
59
        $types = $helper->getAvailablePlayerKeyTypes($roster);
60
        foreach ($types as $type) {
61
            $version = new PlayerVersion();
62
            $player = (new Player())
63
                ->setType(PlayerHelper::composePlayerKey($rule->getRuleKey(), $roster, $type))
64
                ->setName(CoreTranslation::getPlayerKeyType($rule->getRuleKey(), $roster, $type))
65
                ->addVersion($version);
66
            $helper->setPlayerDefaultValues(PlayerHelper::getLastVersion($player));
67
            $team->addPlayer($player);
68
        }
69
        return $team;
70
    }
71
72
    public function getMaxPositionType(Rule $rule, Player $player)
73
    {
74
        list($rule_key, $roster, $type) = explode(CoreTranslation::TRANSLATION_GLUE, $player->getType());
75
        $helper = $this->ruleHelper->getHelper($rule);
76
        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

76
        return $helper->/** @scrutinizer ignore-call */ getMaxPlayersByType($roster, $type);
Loading history...
77
    }
78
79
    public function getAvailableStarPlayers(Team $team)
80
    {
81
        $helper = $this->ruleHelper->getHelper($team->getRule());
82
        $sps = $helper->getAvailableStarPlayers($team);
83
        $star_players = new ArrayCollection();
84
        foreach ($sps as $sp) {
85
            if ($sp instanceof MultipleStarPlayer) {
86
                $players = [];
87
                foreach ($sp->getParts() as $star_part) {
88
                    $players[] = $helper->createInducementAsPlayer($star_part);
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

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

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