Failed Conditions
Push — dev ( d443d2...a37614 )
by Janko
34:32 queued 29:02
created

AllianceProvider   A

Complexity

Total Complexity 24

Size/Duplication

Total Lines 205
Duplicated Lines 0 %

Test Coverage

Coverage 79.19%

Importance

Changes 0
Metric Value
eloc 127
dl 0
loc 205
ccs 118
cts 149
cp 0.7919
rs 10
c 0
b 0
f 0
wmc 24

4 Methods

Rating   Name   Duplication   Size   Complexity  
A setTemplateVariablesForAllianceList() 0 20 1
A setTemplateVariables() 0 23 5
A __construct() 0 9 1
D setTemplateVariablesForAlliance() 0 145 17
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Stu\Module\Game\Lib\View\Provider;
6
7
use request;
8
use Stu\Component\Alliance\AllianceDescriptionRendererInterface;
9
use Stu\Component\Alliance\AllianceUserApplicationCheckerInterface;
10
use Stu\Component\Alliance\Enum\AllianceJobPermissionEnum;
11
use Stu\Component\Game\ModuleEnum;
12
use Stu\Component\Alliance\AllianceSettingsEnum;
13
use Stu\Component\Game\JavascriptExecutionTypeEnum;
14
use Stu\Module\Alliance\Lib\AllianceActionManagerInterface;
15
use Stu\Module\Alliance\Lib\AllianceJobManagerInterface;
16
use Stu\Module\Alliance\Lib\AllianceListItem;
17
use Stu\Module\Alliance\Lib\AllianceMemberWrapper;
18
use Stu\Module\Alliance\Lib\AllianceUiFactoryInterface;
19
use Stu\Module\Control\GameControllerInterface;
20
use Stu\Orm\Entity\Alliance;
21
use Stu\Orm\Entity\AllianceSettings;
22
use Stu\Orm\Entity\User;
23
use Stu\Orm\Repository\AllianceRelationRepositoryInterface;
24
use Stu\Orm\Repository\AllianceRepositoryInterface;
25
26
final class AllianceProvider implements ViewComponentProviderInterface
27
{
28 1
    public function __construct(
29
        private AllianceRelationRepositoryInterface $allianceRelationRepository,
30
        private AllianceActionManagerInterface $allianceActionManager,
31
        private AllianceRepositoryInterface $allianceRepository,
32
        private AllianceUserApplicationCheckerInterface $allianceUserApplicationChecker,
33
        private AllianceDescriptionRendererInterface $allianceDescriptionRenderer,
34
        private AllianceUiFactoryInterface $allianceUiFactory,
35
        private AllianceJobManagerInterface $allianceJobManager
36 1
    ) {}
37
38 1
    #[\Override]
39
    public function setTemplateVariables(GameControllerInterface $game): void
40
    {
41 1
        $user = $game->getUser();
42
43 1
        $alliance = null;
44 1
        if (request::has('id')) {
45
            $alliance = $this->allianceRepository->find(request::indInt('id'));
46
        }
47
48 1
        if ($alliance === null) {
49 1
            $alliance = $user->getAlliance();
50
        }
51
52 1
        $game->setTemplateVar('ALLIANCE', $alliance);
53
54 1
        if ($alliance === null || request::has('showlist')) {
55
            $this->setTemplateVariablesForAllianceList($game);
56
        } else {
57 1
            $this->setTemplateVariablesForAlliance($alliance, $game);
58
        }
59
60 1
        $game->addExecuteJS("initTranslations();", JavascriptExecutionTypeEnum::AFTER_RENDER);
61
    }
62
63 1
    private function setTemplateVariablesForAlliance(Alliance $alliance, GameControllerInterface $game): void
64
    {
65 1
        $user = $game->getUser();
66 1
        $allianceId = $alliance->getId();
67
68 1
        $result = $this->allianceRelationRepository->getActiveByAlliance($allianceId);
69 1
        $userIsFounder = $this->allianceJobManager->hasUserFounderPermission($user, $alliance);
70 1
        $isInAlliance = $alliance->getId() === $game->getUser()->getAlliance()?->getId();
71 1
        $settings = $alliance->getSettings();
72
73 1
        $game->appendNavigationPart(sprintf(
74 1
            '%s?id=%d',
75 1
            ModuleEnum::ALLIANCE->getPhpPage(),
76 1
            $alliance->getId()
77 1
        ), _('Allianz anzeigen'));
78
79 1
        $relations = [];
80 1
        foreach ($result as $key => $relation) {
81
            $relations[$key] = $this->allianceUiFactory->createAllianceRelationWrapper($alliance, $relation);
82
        }
83
84 1
        $game->setTemplateVar('SHOW_ALLIANCE', $alliance);
85
86 1
        $game->setTemplateVar(
87 1
            'ALLIANCE_RELATIONS',
88 1
            $relations !== []
89
                ? $relations
90 1
                : null
91 1
        );
92 1
        $game->setTemplateVar(
93 1
            'DESCRIPTION',
94 1
            $this->allianceDescriptionRenderer->render($alliance)
95 1
        );
96 1
        $game->setTemplateVar('IS_IN_ALLIANCE', $isInAlliance);
97 1
        $game->setTemplateVar('CAN_LEAVE_ALLIANCE', $isInAlliance && !$userIsFounder);
98 1
        $game->setTemplateVar(
99 1
            'CAN_EDIT',
100 1
            $this->allianceActionManager->mayEdit($alliance, $user)
101 1
        );
102 1
        $game->setTemplateVar(
103 1
            'CAN_MANAGE_FOREIGN_RELATIONS',
104 1
            $this->allianceActionManager->mayManageForeignRelations($alliance, $user)
105 1
        );
106 1
        $game->setTemplateVar(
107 1
            'CAN_MANAGE_APPLICATIONS',
108 1
            $this->allianceActionManager->mayManageApplications($alliance, $user)
109 1
        );
110 1
        $game->setTemplateVar(
111 1
            'CAN_VIEW_ALLIANCE_STORAGE',
112 1
            $this->allianceActionManager->mayViewAllianceStorage($alliance, $user)
113 1
        );
114 1
        $game->setTemplateVar(
115 1
            'CAN_VIEW_ALLIANCE_HISTORY',
116 1
            $this->allianceActionManager->mayViewAllianceHistory($alliance, $user)
117 1
        );
118 1
        $game->setTemplateVar(
119 1
            'CAN_SIGNUP',
120 1
            $this->allianceUserApplicationChecker->mayApply($user, $alliance)
121 1
        );
122 1
        $game->setTemplateVar(
123 1
            'CAN_MANAGE_ALLIANCE',
124 1
            $this->allianceActionManager->mayManageAlliance($alliance, $user)
125 1
        );
126
127 1
        $membersWithJobs = $alliance->getMembers()->map(
128 1
            function (User $user) use ($alliance): array {
129 1
                $wrapper = $this->allianceUiFactory->createAllianceMemberWrapper($user, $alliance);
130
131 1
                $userJobs = [];
132 1
                foreach ($alliance->getJobs() as $job) {
133 1
                    if ($job->hasUser($user) && $job->getTitle() !== null) {
134 1
                        $userJobs[] = $job->getTitle();
135
                    }
136
                }
137
138 1
                return [
139 1
                    'wrapper' => $wrapper,
140 1
                    'jobs' => $userJobs
141 1
                ];
142 1
            }
143 1
        );
144
145 1
        $game->setTemplateVar('MEMBERS', $membersWithJobs);
146
147
148 1
        $founderJobs = [];
149 1
        $successorJobs = [];
150 1
        $diplomaticJobs = [];
151 1
        $otherJobs = [];
152
153 1
        foreach ($alliance->getJobs() as $job) {
154 1
            if (count($job->getUsers()) === 0 || $job->getSort() === null) {
155 1
                continue;
156
            }
157
158 1
            if ($job->hasPermission(AllianceJobPermissionEnum::FOUNDER->value)) {
159 1
                $founderJobs[] = $job;
160
            } elseif ($job->hasPermission(AllianceJobPermissionEnum::SUCCESSOR->value)) {
161
                $successorJobs[] = $job;
162
            } elseif ($job->hasPermission(AllianceJobPermissionEnum::DIPLOMATIC->value)) {
163
                $diplomaticJobs[] = $job;
164
            } elseif ($job->hasPermission(AllianceJobPermissionEnum::ALLIANCE_LEADERSHIP->value)) {
165
                $otherJobs[] = $job;
166
            }
167
        }
168
169 1
        usort($successorJobs, fn($a, $b) => $a->getSort() <=> $b->getSort());
170 1
        usort($diplomaticJobs, fn($a, $b) => $a->getSort() <=> $b->getSort());
171 1
        usort($otherJobs, fn($a, $b) => $a->getSort() <=> $b->getSort());
172
173 1
        $leadershipJobs = array_merge($founderJobs, $successorJobs, $diplomaticJobs, $otherJobs);
174
175 1
        $game->setTemplateVar('ALLIANCE_LEADERSHIP_JOBS', $leadershipJobs);
176
177 1
        $founderDescription = $settings->filter(
178 1
            function (AllianceSettings $setting): bool {
179
                return $setting->getSetting() === AllianceSettingsEnum::ALLIANCE_FOUNDER_DESCRIPTION;
180 1
            }
181 1
        )->first();
182
183 1
        $successorDescription = $settings->filter(
184 1
            function (AllianceSettings $setting): bool {
185
                return $setting->getSetting() === AllianceSettingsEnum::ALLIANCE_SUCCESSOR_DESCRIPTION;
186 1
            }
187 1
        )->first();
188
189 1
        $diplomatDescription = $settings->filter(
190 1
            function (AllianceSettings $setting): bool {
191
                return $setting->getSetting() === AllianceSettingsEnum::ALLIANCE_DIPLOMATIC_DESCRIPTION;
192 1
            }
193 1
        )->first();
194
195 1
        $game->setTemplateVar(
196 1
            'FOUNDER_DESCRIPTION',
197 1
            $founderDescription !== false ? $founderDescription->getValue() : 'Präsident'
198 1
        );
199
200 1
        $game->setTemplateVar(
201 1
            'SUCCESSOR_DESCRIPTION',
202 1
            $successorDescription !== false ? $successorDescription->getValue() : 'Vize-Präsident'
203 1
        );
204
205 1
        $game->setTemplateVar(
206 1
            'DIPLOMATIC_DESCRIPTION',
207 1
            $diplomatDescription !== false ? $diplomatDescription->getValue() : 'Außenminister'
208 1
        );
209
    }
210
211
    private function setTemplateVariablesForAllianceList(GameControllerInterface $game): void
212
    {
213
        $game->appendNavigationPart(sprintf(
214
            '%s?showlist=1',
215
            ModuleEnum::ALLIANCE->getPhpPage()
216
        ), _('Allianzliste'));
217
218
        $game->setTemplateVar('SHOW_ALLIANCE_LIST', true);
219
        $game->setTemplateVar(
220
            'ALLIANCE_LIST_OPEN',
221
            array_map(
222
                fn(Alliance $alliance): AllianceListItem => $this->allianceUiFactory->createAllianceListItem($alliance),
223
                $this->allianceRepository->findByApplicationState(true)
224
            )
225
        );
226
        $game->setTemplateVar(
227
            'ALLIANCE_LIST_CLOSED',
228
            array_map(
229
                fn(Alliance $alliance): AllianceListItem => $this->allianceUiFactory->createAllianceListItem($alliance),
230
                $this->allianceRepository->findByApplicationState(false)
231
            )
232
        );
233
    }
234
}
235