Passed
Push — dev ( a37614...5d6f44 )
by Nico
05:36
created

AllianceProvider   A

Complexity

Total Complexity 24

Size/Duplication

Total Lines 176
Duplicated Lines 0 %

Test Coverage

Coverage 75.61%

Importance

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