PlayerGroupRankingHandler   A
last analyzed

Complexity

Total Complexity 15

Size/Duplication

Total Lines 138
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 15
eloc 58
c 0
b 0
f 0
dl 0
loc 138
rs 10

1 Method

Rating   Name   Duplication   Size   Complexity  
F handle() 0 136 15
1
<?php
2
3
declare(strict_types=1);
4
5
namespace VideoGamesRecords\CoreBundle\Ranking\Command\Player;
6
7
use DateTime;
8
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
9
use Symfony\Component\Serializer\Serializer;
10
use VideoGamesRecords\CoreBundle\Entity\PlayerChartStatus;
11
use VideoGamesRecords\CoreBundle\Ranking\Command\AbstractRankingHandler;
12
use VideoGamesRecords\CoreBundle\Tools\Ranking;
13
14
class PlayerGroupRankingHandler extends AbstractRankingHandler
15
{
16
    public function handle($mixed): void
17
    {
18
        $group = $this->em->getRepository('VideoGamesRecords\CoreBundle\Entity\Group')->find($mixed);
19
        if (null === $group) {
20
            return;
21
        }
22
23
        //----- delete
24
        $query = $this->em->createQuery('DELETE VideoGamesRecords\CoreBundle\Entity\PlayerGroup pg WHERE pg.group = :group');
25
        $query->setParameter('group', $group);
26
        $query->execute();
27
28
        $data = [];
29
30
        //----- data rank0
31
        $query = $this->em->createQuery("
32
            SELECT
33
                 p.id,
34
                 COUNT(pc.id) as nb
35
            FROM VideoGamesRecords\CoreBundle\Entity\PlayerChart pc
36
            JOIN pc.player p
37
            JOIN pc.chart c
38
            WHERE c.group = :group
39
            AND pc.rank = 1
40
            AND c.nbPost > 1
41
            AND pc.nbEqual = 1
42
            GROUP BY p.id");
43
44
45
        $query->setParameter('group', $group);
46
        $result = $query->getResult();
47
        foreach ($result as $row) {
48
            $data['chartRank0'][$row['id']] = $row['nb'];
49
        }
50
51
        //----- data rank1 to rank5
52
        $query = $this->em->createQuery("
53
            SELECT
54
                 p.id,
55
                 COUNT(pc.id) as nb
56
            FROM VideoGamesRecords\CoreBundle\Entity\PlayerChart pc
57
            JOIN pc.player p
58
            JOIN pc.chart c
59
            WHERE c.group = :group
60
            AND pc.rank = :rank
61
            GROUP BY p.id");
62
        $query->setParameter('group', $group);
63
64
        for ($i = 1; $i <= 5; $i++) {
65
            $query->setParameter('rank', $i);
66
            $result = $query->getResult();
67
            foreach ($result as $row) {
68
                $data['chartRank' . $i][$row['id']] = $row['nb'];
69
            }
70
        }
71
72
        //----- data nbRecordProuve
73
        $query = $this->em->createQuery("
74
            SELECT
75
                 p.id,
76
                 COUNT(pc.id) as nb
77
            FROM VideoGamesRecords\CoreBundle\Entity\PlayerChart pc
78
            JOIN pc.player p
79
            JOIN pc.chart c
80
            WHERE c.group = :group
81
            AND pc.status = :status
82
            GROUP BY p.id");
83
84
        $query->setParameter('group', $group);
85
        $query->setParameter(
86
            'status',
87
            $this->em->getReference(
88
                PlayerChartStatus::class,
89
                PlayerChartStatus::ID_STATUS_PROOVED
90
            )
91
        );
92
93
        $result = $query->getResult();
94
        foreach ($result as $row) {
95
            $data['nbChartProven'][$row['id']] = $row['nb'];
96
        }
97
98
99
        //----- select and save result in array
100
        $query = $this->em->createQuery("
101
            SELECT
102
                p.id,
103
                '' as rankPoint,
104
                '' as rankMedal,
105
                SUM(pc.pointChart) as pointChart,
106
                COUNT(pc.id) as nbChart,
107
                MAX(pc.lastUpdate) as lastUpdate
108
            FROM VideoGamesRecords\CoreBundle\Entity\PlayerChart pc
109
            JOIN pc.player p
110
            JOIN pc.chart c
111
            WHERE c.group = :group
112
            GROUP BY p.id
113
            ORDER BY pointChart DESC");
114
115
116
        $query->setParameter('group', $group);
117
        $result = $query->getResult();
118
119
        $list = [];
120
        foreach ($result as $row) {
121
            $row['rankMedal'] = 0;
122
            $row['chartRank0'] = (isset($data['chartRank0'][$row['id']])) ? $data['chartRank0'][$row['id']] : 0;
123
            $row['chartRank1'] = (isset($data['chartRank1'][$row['id']])) ? $data['chartRank1'][$row['id']] : 0;
124
            $row['chartRank2'] = (isset($data['chartRank2'][$row['id']])) ? $data['chartRank2'][$row['id']] : 0;
125
            $row['chartRank3'] = (isset($data['chartRank3'][$row['id']])) ? $data['chartRank3'][$row['id']] : 0;
126
            $row['chartRank4'] = (isset($data['chartRank4'][$row['id']])) ? $data['chartRank4'][$row['id']] : 0;
127
            $row['chartRank5'] = (isset($data['chartRank5'][$row['id']])) ? $data['chartRank5'][$row['id']] : 0;
128
            $row['nbChartProven'] = (isset($data['nbChartProven'][$row['id']])) ? $data['nbChartProven'][$row['id']] : 0;
129
            $row['lastUpdate'] = new DateTime($row['lastUpdate']);
130
            $list[] = $row;
131
        }
132
133
        //----- add some data
134
        $list = Ranking::addRank($list, 'rankPointChart', ['pointChart']);
135
        $list = Ranking::order($list, ['chartRank0' => SORT_DESC, 'chartRank1' => SORT_DESC, 'chartRank2' => SORT_DESC, 'chartRank3' => SORT_DESC]);
136
        $list = Ranking::addRank($list, 'rankMedal', ['chartRank0', 'chartRank1', 'chartRank2', 'chartRank3', 'chartRank4', 'chartRank5']);
137
138
        $normalizer = new ObjectNormalizer();
139
        $serializer = new Serializer([$normalizer]);
140
141
        foreach ($list as $row) {
142
            $playerGroup = $serializer->denormalize(
143
                $row,
144
                'VideoGamesRecords\CoreBundle\Entity\PlayerGroup'
145
            );
146
            $playerGroup->setPlayer($this->em->getReference('VideoGamesRecords\CoreBundle\Entity\Player', $row['id']));
147
            $playerGroup->setGroup($group);
148
149
            $this->em->persist($playerGroup);
150
        }
151
        $this->em->flush();
152
    }
153
}
154