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

AbstractRuleHelper::getCheerleadersCost()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
c 0
b 0
f 0
nc 1
nop 1
dl 0
loc 3
rs 10
1
<?php
2
3
namespace Obblm\Core\Helper\Rule;
4
5
use Doctrine\Common\Collections\Criteria;
6
use Obblm\Core\Contracts\RuleHelperInterface;
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\Form\Player\ActionType;
12
use Obblm\Core\Form\Player\InjuryType;
13
use Obblm\Core\Helper\CoreTranslation;
14
use Obblm\Core\Contracts\InducementInterface;
15
use Obblm\Core\Helper\Rule\Inducement\StarPlayer;
16
use Obblm\Core\Helper\Rule\Traits\AbstractInducementRuleTrait;
17
use Obblm\Core\Helper\Rule\Traits\AbstractPlayerRuleTrait;
18
use Obblm\Core\Helper\Rule\Traits\AbstractTeamRuleTrait;
19
use Obblm\Core\Traits\ClassNameAsKeyTrait;
20
21
abstract class AbstractRuleHelper extends RuleConfigBuilder implements RuleHelperInterface
22
{
23
    use ClassNameAsKeyTrait;
24
25
    protected $attachedRule;
26
    protected $rule = [];
27
28
    /****************
29
     * COMPLIER PASS
30
     ****************/
31
    /**
32
     * @param Rule $rule
33
     * @return $this
34
     */
35
    public function attachRule(Rule $rule):RuleHelperInterface
36
    {
37
        $this->setAttachedRule($rule);
38
        $this->build($rule->getRuleKey(), $rule->getRule());
39
        return $this;
40
    }
41
42
    public function getAvailableStarPlayers(Team $team):array
43
    {
44
        $criteria = Criteria::create();
45
        $criteria->where(Criteria::expr()->andX(
46
            $this->getInducementExpression([
47
                'type' => 'star_players',
48
                'roster' => $team->getRoster()
49
            ])
50
        ));
51
        return $this->getInducementTable()->matching($criteria)->toArray();
52
    }
53
54
    public function getTransformedInducementsFor(string $roster)
55
    {
56
        $table = $this->getInducementTable();
57
        foreach ($table as $inducement) {
58
            if ($roster == 'halfling') {
59
                $inducement->setValue(10000);
60
            }
61
        }
62
63
        return $table;
64
    }
65
66
    /**********
67
     * CACHING
68
     *********/
69
70
    public function getAttachedRule():?Rule
71
    {
72
        return $this->attachedRule;
73
    }
74
75
    public function setAttachedRule(Rule $rule):RuleHelperInterface
76
    {
77
        $this->attachedRule = $rule;
78
        $this->rule = $rule->getRule();
79
        return $this;
80
    }
81
82
    /**********************
83
     * APPLICATION METHODS
84
     *********************/
85
86
    /**
87
     * @return string
88
     */
89
    public function getInjuriesFormClass():string
90
    {
91
        return InjuryType::class;
92
    }
93
94
    /**
95
     * @return string
96
     */
97
    public function getActionsFormClass():string
98
    {
99
        return ActionType::class;
100
    }
101
102
    /**
103
     * @return string
104
     */
105
    public function getTemplateKey():string
106
    {
107
        return $this->getKey();
108
    }
109
110
    use AbstractTeamRuleTrait;
111
112
    use AbstractPlayerRuleTrait;
113
114
    /***************
115
     * MISC METHODS
116
     **************/
117
    public function getWeatherChoices():array
118
    {
119
        $weather = [];
120
        $rule_key = $this->getAttachedRule()->getRuleKey();
121
        $fields = $this->rule['fields'];
122
        foreach ($fields as $field_key => $field) {
123
            $field_label = CoreTranslation::getFieldKey($rule_key, $field_key);
124
            $weather[$field_label] = [];
125
            foreach ($field['weather'] as $field_weather) {
126
                $label = CoreTranslation::getWeatherKey($rule_key, $field_key, $field_weather);
127
                $value = join(CoreTranslation::TRANSLATION_GLUE, [$rule_key, 'default', $field_weather]);
128
                $weather[$field_label][$label] = $value;
129
            }
130
        }
131
        return $weather;
132
    }
133
134
    public function createInducementAsPlayer(InducementInterface $inducement, $number = 0):?Player
135
    {
136
        if (!$inducement instanceof StarPlayer) {
137
            return null;
138
        }
139
        $version = (new PlayerVersion())
140
            ->setCharacteristics($inducement->getCharacteristics())
141
            ->setValue($inducement->getValue());
142
        if ($inducement->getSkills()) {
143
            $version->setSkills($inducement->getSkills());
144
        }
145
        $player = (new Player())
146
            ->setNumber($number)
147
            ->setType($inducement->getType()->getTranslationKey())
148
            ->setName($inducement->getTranslationKey())
149
            ->addVersion($version);
150
        return $player;
151
    }
152
153
    public function createStarPlayerAsPlayer(string $key, int $number):Player
154
    {
155
        $rule_key = $this->getAttachedRule()->getRuleKey();
156
157
        $star_player = $this->getStarPlayer($key);
158
        if (isset($star_player['multi_parts']) && $star_player['multi_parts']) {
159
            throw new \Exception('You cannot create a player with a multiple parts InducementInterface');
160
        }
161
        $version = (new PlayerVersion())
162
            ->setCharacteristics($star_player['characteristics'])
163
            ->setValue($star_player['cost']);
164
        if ($star_player['skills']) {
165
            $version->setSkills($star_player['skills']);
166
        }
167
        $player = (new Player())
168
            ->setNumber($number)
169
            ->setType(CoreTranslation::getStarPlayerTitle($rule_key))
170
            ->setName(CoreTranslation::getStarPlayerName($rule_key, $key))
171
            ->addVersion($version);
172
        return $player;
173
    }
174
175
    use AbstractInducementRuleTrait;
176
}
177