1<?php
2/* Copyright (c) 1998-2013 ILIAS open source, Extended GPL, see docs/LICENSE */
3
4require_once 'Modules/Test/classes/class.ilTestRandomQuestionCollectionSubsetApplication.php';
5
6/**
7 * @author        Björn Heyser <bheyser@databay.de>
8 * @version        $Id$
9 *
10 * @package        Modules/Test
11 */
12class ilTestRandomQuestionCollectionSubsetApplicationList implements Iterator
13{
14    /**
15     * @var ilTestRandomQuestionCollectionSubsetApplication[]
16     */
17    protected $collectionSubsetApplications = array();
18
19    /**
20     * @var ilTestRandomQuestionSetQuestionCollection
21     */
22    protected $reservedQuestionCollection;
23
24    /**
25     * ilTestRandomQuestionCollectionSubsetApplicantList constructor.
26     */
27    public function __construct()
28    {
29        $this->setReservedQuestionCollection(new ilTestRandomQuestionSetQuestionCollection());
30    }
31
32    /**
33     * @param integer $applicantId
34     * @return ilTestRandomQuestionCollectionSubsetApplication
35     */
36    public function getCollectionSubsetApplication($applicantId)
37    {
38        if (!isset($this->collectionSubsetApplications[$applicantId])) {
39            return null;
40        }
41
42        return $this->collectionSubsetApplications[$applicantId];
43    }
44
45    /**
46     * @return ilTestRandomQuestionCollectionSubsetApplication[]
47     */
48    public function getCollectionSubsetApplications()
49    {
50        return $this->collectionSubsetApplications;
51    }
52
53    /**
54     * @param ilTestRandomQuestionCollectionSubsetApplicant $collectionSubsetApplicant
55     */
56    public function addCollectionSubsetApplication(ilTestRandomQuestionCollectionSubsetApplication $collectionSubsetApplication)
57    {
58        $this->collectionSubsetApplications[$collectionSubsetApplication->getApplicantId()] = $collectionSubsetApplication;
59    }
60
61    /**
62     * @param ilTestRandomQuestionCollectionSubsetApplication[] $collectionSubsetApplications
63     */
64    public function setCollectionSubsetApplications($collectionSubsetApplications)
65    {
66        $this->collectionSubsetApplications = $collectionSubsetApplications;
67    }
68
69    /**
70     * resetter for collectionSubsetApplicants
71     */
72    public function resetCollectionSubsetApplicants()
73    {
74        $this->setCollectionSubsetApplications(array());
75    }
76
77    /**
78     * @return ilTestRandomQuestionSetQuestionCollection
79     */
80    public function getReservedQuestionCollection()
81    {
82        return $this->reservedQuestionCollection;
83    }
84
85    /**
86     * @param ilTestRandomQuestionSetQuestionCollection $reservedQuestionCollection
87     */
88    public function setReservedQuestionCollection($reservedQuestionCollection)
89    {
90        $this->reservedQuestionCollection = $reservedQuestionCollection;
91    }
92
93    /**
94     * @param ilTestRandomQuestionSetQuestion $question
95     */
96    public function addReservedQuestion(ilTestRandomQuestionSetQuestion $reservedQuestion)
97    {
98        $this->getReservedQuestionCollection()->addQuestion($reservedQuestion);
99    }
100
101    /* @return ilTestRandomQuestionCollectionSubsetApplication */
102    public function current()
103    {
104        return current($this->collectionSubsetApplications);
105    }
106    /* @return ilTestRandomQuestionCollectionSubsetApplication */
107    public function next()
108    {
109        return next($this->collectionSubsetApplications);
110    }
111    /* @return string */
112    public function key()
113    {
114        return key($this->collectionSubsetApplications);
115    }
116    /* @return bool */
117    public function valid()
118    {
119        return key($this->collectionSubsetApplications) !== null;
120    }
121    /* @return ilTestRandomQuestionCollectionSubsetApplication */
122    public function rewind()
123    {
124        return reset($this->collectionSubsetApplications);
125    }
126
127    /**
128     * @param ilTestRandomQuestionSetQuestion $question
129     */
130    public function handleQuestionRequest(ilTestRandomQuestionSetQuestion $question)
131    {
132        $questionReservationRequired = false;
133
134        foreach ($this as $collectionSubsetApplication) {
135            if (!$collectionSubsetApplication->hasQuestion($question->getQuestionId())) {
136                continue;
137            }
138
139            if ($collectionSubsetApplication->hasRequiredAmountLeft()) {
140                $questionReservationRequired = true;
141                $collectionSubsetApplication->decrementRequiredAmount();
142            }
143        }
144
145        if ($questionReservationRequired) {
146            $this->addReservedQuestion($question);
147        }
148    }
149
150    /**
151     * @return int
152     */
153    public function getNonReservedQuestionAmount()
154    {
155        $availableQuestionCollection = new ilTestRandomQuestionSetQuestionCollection();
156
157        foreach ($this as $collectionSubsetApplication) {
158            $applicationsNonReservedQstCollection = $collectionSubsetApplication->getRelativeComplementCollection(
159                $this->getReservedQuestionCollection()
160            );
161
162            $availableQuestionCollection->mergeQuestionCollection($applicationsNonReservedQstCollection);
163        }
164
165        $nonReservedQuestionCollection = $availableQuestionCollection->getUniqueQuestionCollection();
166
167        return $nonReservedQuestionCollection->getQuestionAmount();
168    }
169}
170