1<?php
2/**
3 * Matomo - free/libre analytics platform
4 *
5 * @link https://matomo.org
6 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7 *
8 */
9namespace Piwik\Plugins\Tour\Engagement;
10
11use Piwik\API\Request;
12use Piwik\Piwik;
13
14class Levels
15{
16    /**
17     * @var array
18     */
19    private $challenges = array();
20
21    private function getChallenges()
22    {
23        if (empty($this->challenges)) {
24            $this->challenges = Request::processRequest('Tour.getChallenges', [], []);
25        }
26
27        return $this->challenges;
28    }
29
30    public function getNumChallengesCompleted()
31    {
32        $challenges = $this->getChallenges();
33
34        $completed = 0;
35        foreach ($challenges as $challenge) {
36            if ($challenge['isSkipped'] || $challenge['isCompleted']) {
37                $completed++;
38            }
39        }
40        return $completed;
41    }
42
43    public function getCurrentLevel()
44    {
45        $completed = $this->getNumChallengesCompleted();
46
47        $current = 0;
48        foreach ($this->getLevels() as $threshold => $level) {
49            if ($completed >= $threshold) {
50                $current++;
51            }
52        }
53        return $current;
54    }
55
56    public function getCurrentLevelName()
57    {
58        $completed = $this->getNumChallengesCompleted();
59
60        $current = '';
61        foreach ($this->getLevels() as $threshold => $level) {
62            if ($completed >= $threshold) {
63                $current = $level;
64            }
65        }
66        return $current;
67    }
68
69    public function getNextLevelName()
70    {
71        $completed = $this->getNumChallengesCompleted();
72
73        foreach ($this->getLevels() as $threshold => $level) {
74            if ($completed < $threshold) {
75               return $level;
76            }
77        }
78    }
79
80    public function getNumLevels()
81    {
82        $levels = $this->getLevels();
83        return count($levels);
84    }
85
86    public function getNumChallengesNeededToNextLevel()
87    {
88        $completed = $this->getNumChallengesCompleted();
89
90        foreach ($this->getLevels() as $threshold => $level) {
91            if ($completed < $threshold) {
92                return $threshold - $completed;
93            }
94        }
95    }
96
97    public function getCurrentDescription()
98    {
99        $login = Piwik::getCurrentUserLogin();
100        $numChallengesCompleted = $this->getNumChallengesCompleted();
101        $numChallengesTotal = $this->getNumChallengesTotal();
102
103        if ($numChallengesCompleted <= ($numChallengesTotal / 4)) {
104            return Piwik::translate('Tour_Part1Title', $login);
105        }
106
107        if ($numChallengesCompleted <= ($numChallengesTotal / 2)) {
108            return Piwik::translate('Tour_Part2Title', $login);
109        }
110
111        if ($numChallengesCompleted <= ($numChallengesTotal / 1.333)) {
112            return Piwik::translate('Tour_Part3Title', $login);
113        }
114
115        return Piwik::translate('Tour_Part4Title', $login);
116    }
117
118    private function getNumChallengesTotal()
119    {
120        $challenges = $this->getChallenges();
121        return count($challenges);
122    }
123
124    public function getLevels()
125    {
126        $numChallengesTotal = $this->getNumChallengesTotal();
127
128        $levels = array(
129            0 => Piwik::translate('Tour_MatomoBeginner'),
130            5 => Piwik::translate('Tour_MatomoIntermediate'),
131        );
132
133        if ($numChallengesTotal > 10) {
134            // the number of challenges varies from Matomo to Matomo depending on activated plugins and activated
135            // features. Therefore we may remove some levels if there aren't too many challenges available.
136            $levels[10] = Piwik::translate('Tour_MatomoTalent');
137        }
138
139        if ($numChallengesTotal > 15) {
140            $levels[15] = Piwik::translate('Tour_MatomoProfessional');
141        }
142
143        $levels[$numChallengesTotal] = Piwik::translate('Tour_MatomoExpert');
144
145        return $levels;
146    }
147
148
149}