* @copyright  2009 David Mudrak <*****@*****.**>
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
require_once dirname(dirname(dirname(__FILE__))) . '/config.php';
require_once dirname(__FILE__) . '/locallib.php';
$cmid = required_param('cmid', PARAM_INT);
// course module
$phase = required_param('phase', PARAM_INT);
// the code of the new phase
$confirm = optional_param('confirm', false, PARAM_BOOL);
// confirmation
$cm = get_coursemodule_from_id('workshopplus', $cmid, 0, false, MUST_EXIST);
$course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
$workshopplus = $DB->get_record('workshopplus', array('id' => $cm->instance), '*', MUST_EXIST);
$workshopplus = new workshopplus($workshopplus, $cm, $course);
$PAGE->set_url($workshopplus->switchphase_url($phase), array('cmid' => $cmid, 'phase' => $phase));
require_login($course, false, $cm);
require_capability('mod/workshopplus:switchphase', $PAGE->context);
if ($confirm) {
    if (!confirm_sesskey()) {
        throw new moodle_exception('confirmsesskeybad');
    }
    if (!$workshopplus->switch_phase($phase)) {
        print_error('errorswitchingphase', 'workshopplus', $workshopplus->view_url());
    }
    $workshopplus->log('update switch phase', $workshopplus->view_url(), $workshopplus->phase);
    redirect($workshopplus->view_url());
}
$PAGE->set_title($workshopplus->name);
$PAGE->set_heading($course->fullname);
$PAGE->navbar->add(get_string('switchingphase', 'workshopplus'));
 /**
  * Prepare an individual workshopplus plan for the given user.
  *
  * @param workshopplus $workshopplus instance
  * @param int $userid whom the plan is prepared for
  */
 public function __construct(workshopplus $workshopplus, $userid)
 {
     global $DB;
     $this->workshopplus = $workshopplus;
     $this->userid = $userid;
     //---------------------------------------------------------
     // * SETUP | submission | assessment | evaluation | closed
     //---------------------------------------------------------
     $phase = new stdclass();
     $phase->title = get_string('phasesetup', 'workshopplus');
     $phase->tasks = array();
     if (has_capability('moodle/course:manageactivities', $workshopplus->context, $userid)) {
         $task = new stdclass();
         $task->title = get_string('taskintro', 'workshopplus');
         $task->link = $workshopplus->updatemod_url();
         $task->completed = !(trim($workshopplus->intro) == '');
         $phase->tasks['intro'] = $task;
     }
     if (has_capability('moodle/course:manageactivities', $workshopplus->context, $userid)) {
         $task = new stdclass();
         $task->title = get_string('taskinstructauthors', 'workshopplus');
         $task->link = $workshopplus->updatemod_url();
         $task->completed = !(trim($workshopplus->instructauthors) == '');
         $phase->tasks['instructauthors'] = $task;
     }
     if (has_capability('mod/workshopplus:editdimensions', $workshopplus->context, $userid)) {
         $task = new stdclass();
         $task->title = get_string('editassessmentform', 'workshopplus');
         $task->link = $workshopplus->editform_url();
         if ($workshopplus->grading_strategy_instance()->form_ready()) {
             $task->completed = true;
         } elseif ($workshopplus->phase > workshopplus::PHASE_SETUP) {
             $task->completed = false;
         }
         $phase->tasks['editform'] = $task;
     }
     if ($workshopplus->useexamples and has_capability('mod/workshopplus:manageexamples', $workshopplus->context, $userid)) {
         $task = new stdclass();
         $task->title = get_string('prepareexamples', 'workshopplus');
         if ($DB->count_records('workshopplus_submissions', array('example' => 1, 'workshopplusid' => $workshopplus->id)) > 0) {
             $task->completed = true;
         } elseif ($workshopplus->phase > workshopplus::PHASE_SETUP) {
             $task->completed = false;
         }
         $phase->tasks['prepareexamples'] = $task;
     }
     if (empty($phase->tasks) and $workshopplus->phase == workshopplus::PHASE_SETUP) {
         // if we are in the setup phase and there is no task (typical for students), let us
         // display some explanation what is going on
         $task = new stdclass();
         $task->title = get_string('undersetup', 'workshopplus');
         $task->completed = 'info';
         $phase->tasks['setupinfo'] = $task;
     }
     $this->phases[workshopplus::PHASE_SETUP] = $phase;
     //---------------------------------------------------------
     // setup | * SUBMISSION | assessment | evaluation | closed
     //---------------------------------------------------------
     $phase = new stdclass();
     $phase->title = get_string('phasesubmission', 'workshopplus');
     $phase->tasks = array();
     if (has_capability('moodle/course:manageactivities', $workshopplus->context, $userid)) {
         $task = new stdclass();
         $task->title = get_string('taskinstructreviewers', 'workshopplus');
         $task->link = $workshopplus->updatemod_url();
         if (trim($workshopplus->instructreviewers)) {
             $task->completed = true;
         } elseif ($workshopplus->phase >= workshopplus::PHASE_ASSESSMENT) {
             $task->completed = false;
         }
         $phase->tasks['instructreviewers'] = $task;
     }
     if ($workshopplus->useexamples and $workshopplus->examplesmode == workshopplus::EXAMPLES_BEFORE_SUBMISSION and has_capability('mod/workshopplus:submit', $workshopplus->context, $userid, false) and !has_capability('mod/workshopplus:manageexamples', $workshopplus->context, $userid)) {
         $task = new stdclass();
         $task->title = get_string('exampleassesstask', 'workshopplus');
         $examples = $this->get_examples();
         $a = new stdclass();
         $a->expected = count($examples);
         $a->assessed = 0;
         foreach ($examples as $exampleid => $example) {
             if (!is_null($example->grade)) {
                 $a->assessed++;
             }
         }
         $task->details = get_string('exampleassesstaskdetails', 'workshopplus', $a);
         if ($a->assessed == $a->expected) {
             $task->completed = true;
         } elseif ($workshopplus->phase >= workshopplus::PHASE_ASSESSMENT) {
             $task->completed = false;
         }
         $phase->tasks['examples'] = $task;
     }
     if (has_capability('mod/workshopplus:submit', $workshopplus->context, $userid, false)) {
         $task = new stdclass();
         $task->title = get_string('tasksubmit', 'workshopplus');
         $task->link = $workshopplus->submission_url();
         if ($DB->record_exists('workshopplus_submissions', array('workshopplusid' => $workshopplus->id, 'example' => 0, 'authorid' => $userid))) {
             $task->completed = true;
         } elseif ($workshopplus->phase >= workshopplus::PHASE_ASSESSMENT) {
             $task->completed = false;
         } else {
             $task->completed = null;
             // still has a chance to submit
         }
         $phase->tasks['submit'] = $task;
     }
     if (has_capability('mod/workshopplus:allocate', $workshopplus->context, $userid)) {
         if ($workshopplus->phaseswitchassessment) {
             $task = new stdClass();
             $allocator = $DB->get_record('workshopplusallocation_scheduled', array('workshopplusid' => $workshopplus->id));
             if (empty($allocator)) {
                 $task->completed = false;
             } else {
                 if ($allocator->enabled and is_null($allocator->resultstatus)) {
                     $task->completed = true;
                 } else {
                     if ($workshopplus->submissionend > time()) {
                         $task->completed = null;
                     } else {
                         $task->completed = false;
                     }
                 }
             }
             $task->title = get_string('setup', 'workshopplusallocation_scheduled');
             $task->link = $workshopplus->allocation_url('scheduled');
             $phase->tasks['allocatescheduled'] = $task;
         }
         $task = new stdclass();
         $task->title = get_string('allocate', 'workshopplus');
         $task->link = $workshopplus->allocation_url();
         $numofauthors = $workshopplus->count_potential_authors(false);
         $numofsubmissions = $DB->count_records('workshopplus_submissions', array('workshopplusid' => $workshopplus->id, 'example' => 0));
         $sql = 'SELECT COUNT(s.id) AS nonallocated
                   FROM {workshopplus_submissions} s
              LEFT JOIN {workshopplus_assessments} a ON (a.submissionid=s.id)
                  WHERE s.workshopplusid = :workshopplusid AND s.example=0 AND a.submissionid IS NULL';
         $params['workshopplusid'] = $workshopplus->id;
         $numnonallocated = $DB->count_records_sql($sql, $params);
         if ($numofsubmissions == 0) {
             $task->completed = null;
         } elseif ($numnonallocated == 0) {
             $task->completed = true;
         } elseif ($workshopplus->phase > workshopplus::PHASE_SUBMISSION) {
             $task->completed = false;
         } else {
             $task->completed = null;
             // still has a chance to allocate
         }
         $a = new stdclass();
         $a->expected = $numofauthors;
         $a->submitted = $numofsubmissions;
         $a->allocate = $numnonallocated;
         $task->details = get_string('allocatedetails', 'workshopplus', $a);
         unset($a);
         $phase->tasks['allocate'] = $task;
         if ($numofsubmissions < $numofauthors and $workshopplus->phase >= workshopplus::PHASE_SUBMISSION) {
             $task = new stdclass();
             $task->title = get_string('someuserswosubmission', 'workshopplus');
             $task->completed = 'info';
             $phase->tasks['allocateinfo'] = $task;
         }
     }
     if ($workshopplus->submissionstart) {
         $task = new stdclass();
         $task->title = get_string('submissionstartdatetime', 'workshopplus', workshopplus::timestamp_formats($workshopplus->submissionstart));
         $task->completed = 'info';
         $phase->tasks['submissionstartdatetime'] = $task;
     }
     if ($workshopplus->submissionend) {
         $task = new stdclass();
         $task->title = get_string('submissionenddatetime', 'workshopplus', workshopplus::timestamp_formats($workshopplus->submissionend));
         $task->completed = 'info';
         $phase->tasks['submissionenddatetime'] = $task;
     }
     if ($workshopplus->submissionstart < time() and $workshopplus->latesubmissions) {
         $task = new stdclass();
         $task->title = get_string('latesubmissionsallowed', 'workshopplus');
         $task->completed = 'info';
         $phase->tasks['latesubmissionsallowed'] = $task;
     }
     if (isset($phase->tasks['submissionstartdatetime']) or isset($phase->tasks['submissionenddatetime'])) {
         if (has_capability('mod/workshopplus:ignoredeadlines', $workshopplus->context, $userid)) {
             $task = new stdclass();
             $task->title = get_string('deadlinesignored', 'workshopplus');
             $task->completed = 'info';
             $phase->tasks['deadlinesignored'] = $task;
         }
     }
     $this->phases[workshopplus::PHASE_SUBMISSION] = $phase;
     //---------------------------------------------------------
     // setup | submission | * ASSESSMENT | evaluation | closed
     //---------------------------------------------------------
     $phase = new stdclass();
     $phase->title = get_string('phaseassessment', 'workshopplus');
     $phase->tasks = array();
     $phase->isreviewer = has_capability('mod/workshopplus:peerassess', $workshopplus->context, $userid);
     if ($workshopplus->phase == workshopplus::PHASE_SUBMISSION and $workshopplus->phaseswitchassessment and has_capability('mod/workshopplus:switchphase', $workshopplus->context, $userid)) {
         $task = new stdClass();
         $task->title = get_string('switchphase30auto', 'mod_workshopplus', workshopplus::timestamp_formats($workshopplus->submissionend));
         $task->completed = 'info';
         $phase->tasks['autoswitchinfo'] = $task;
     }
     if ($workshopplus->useexamples and $workshopplus->examplesmode == workshopplus::EXAMPLES_BEFORE_ASSESSMENT and $phase->isreviewer and !has_capability('mod/workshopplus:manageexamples', $workshopplus->context, $userid)) {
         $task = new stdclass();
         $task->title = get_string('exampleassesstask', 'workshopplus');
         $examples = $workshopplus->get_examples_for_reviewer($userid);
         $a = new stdclass();
         $a->expected = count($examples);
         $a->assessed = 0;
         foreach ($examples as $exampleid => $example) {
             if (!is_null($example->grade)) {
                 $a->assessed++;
             }
         }
         $task->details = get_string('exampleassesstaskdetails', 'workshopplus', $a);
         if ($a->assessed == $a->expected) {
             $task->completed = true;
         } elseif ($workshopplus->phase > workshopplus::PHASE_ASSESSMENT) {
             $task->completed = false;
         }
         $phase->tasks['examples'] = $task;
     }
     if (empty($phase->tasks['examples']) or !empty($phase->tasks['examples']->completed)) {
         $phase->assessments = $workshopplus->get_assessments_by_reviewer($userid);
         $numofpeers = 0;
         // number of allocated peer-assessments
         $numofpeerstodo = 0;
         // number of peer-assessments to do
         $numofself = 0;
         // number of allocated self-assessments - should be 0 or 1
         $numofselftodo = 0;
         // number of self-assessments to do - should be 0 or 1
         foreach ($phase->assessments as $a) {
             if ($a->authorid == $userid) {
                 $numofself++;
                 if (is_null($a->grade)) {
                     $numofselftodo++;
                 }
             } else {
                 $numofpeers++;
                 if (is_null($a->grade)) {
                     $numofpeerstodo++;
                 }
             }
         }
         unset($a);
         if ($numofpeers) {
             $task = new stdclass();
             if ($numofpeerstodo == 0) {
                 $task->completed = true;
             } elseif ($workshopplus->phase > workshopplus::PHASE_ASSESSMENT) {
                 $task->completed = false;
             }
             $a = new stdclass();
             $a->total = $numofpeers;
             $a->todo = $numofpeerstodo;
             $task->title = get_string('taskassesspeers', 'workshopplus');
             $task->details = get_string('taskassesspeersdetails', 'workshopplus', $a);
             unset($a);
             $phase->tasks['assesspeers'] = $task;
         }
         if ($workshopplus->useselfassessment and $numofself) {
             $task = new stdclass();
             if ($numofselftodo == 0) {
                 $task->completed = true;
             } elseif ($workshopplus->phase > workshopplus::PHASE_ASSESSMENT) {
                 $task->completed = false;
             }
             $task->title = get_string('taskassessself', 'workshopplus');
             $phase->tasks['assessself'] = $task;
         }
     }
     if ($workshopplus->assessmentstart) {
         $task = new stdclass();
         $task->title = get_string('assessmentstartdatetime', 'workshopplus', workshopplus::timestamp_formats($workshopplus->assessmentstart));
         $task->completed = 'info';
         $phase->tasks['assessmentstartdatetime'] = $task;
     }
     if ($workshopplus->assessmentend) {
         $task = new stdclass();
         $task->title = get_string('assessmentenddatetime', 'workshopplus', workshopplus::timestamp_formats($workshopplus->assessmentend));
         $task->completed = 'info';
         $phase->tasks['assessmentenddatetime'] = $task;
     }
     if (isset($phase->tasks['assessmentstartdatetime']) or isset($phase->tasks['assessmentenddatetime'])) {
         if (has_capability('mod/workshopplus:ignoredeadlines', $workshopplus->context, $userid)) {
             $task = new stdclass();
             $task->title = get_string('deadlinesignored', 'workshopplus');
             $task->completed = 'info';
             $phase->tasks['deadlinesignored'] = $task;
         }
     }
     $this->phases[workshopplus::PHASE_ASSESSMENT] = $phase;
     //---------------------------------------------------------
     // setup | submission | assessment | * EVALUATION | closed
     //---------------------------------------------------------
     $phase = new stdclass();
     $phase->title = get_string('phaseevaluation', 'workshopplus');
     $phase->tasks = array();
     if (has_capability('mod/workshopplus:overridegrades', $workshopplus->context)) {
         $expected = $workshopplus->count_potential_authors(false);
         $calculated = $DB->count_records_select('workshopplus_submissions', 'workshopplusid = ? AND (grade IS NOT NULL OR gradeover IS NOT NULL)', array($workshopplus->id));
         $task = new stdclass();
         $task->title = get_string('calculatesubmissiongrades', 'workshopplus');
         $a = new stdclass();
         $a->expected = $expected;
         $a->calculated = $calculated;
         $task->details = get_string('calculatesubmissiongradesdetails', 'workshopplus', $a);
         if ($calculated >= $expected) {
             $task->completed = true;
         } elseif ($workshopplus->phase > workshopplus::PHASE_EVALUATION) {
             $task->completed = false;
         }
         $phase->tasks['calculatesubmissiongrade'] = $task;
         $expected = $workshopplus->count_potential_reviewers(false);
         $calculated = $DB->count_records_select('workshopplus_aggregations', 'workshopplusid = ? AND gradinggrade IS NOT NULL', array($workshopplus->id));
         $task = new stdclass();
         $task->title = get_string('calculategradinggrades', 'workshopplus');
         $a = new stdclass();
         $a->expected = $expected;
         $a->calculated = $calculated;
         $task->details = get_string('calculategradinggradesdetails', 'workshopplus', $a);
         if ($calculated >= $expected) {
             $task->completed = true;
         } elseif ($workshopplus->phase > workshopplus::PHASE_EVALUATION) {
             $task->completed = false;
         }
         $phase->tasks['calculategradinggrade'] = $task;
     } elseif ($workshopplus->phase == workshopplus::PHASE_EVALUATION) {
         $task = new stdclass();
         $task->title = get_string('evaluategradeswait', 'workshopplus');
         $task->completed = 'info';
         $phase->tasks['evaluateinfo'] = $task;
     }
     if (has_capability('moodle/course:manageactivities', $workshopplus->context, $userid)) {
         $task = new stdclass();
         $task->title = get_string('taskconclusion', 'workshopplus');
         $task->link = $workshopplus->updatemod_url();
         if (trim($workshopplus->conclusion)) {
             $task->completed = true;
         } elseif ($workshopplus->phase >= workshopplus::PHASE_EVALUATION) {
             $task->completed = false;
         }
         $phase->tasks['conclusion'] = $task;
     }
     $this->phases[workshopplus::PHASE_EVALUATION] = $phase;
     //---------------------------------------------------------
     // setup | submission | assessment | evaluation | * CLOSED
     //---------------------------------------------------------
     $phase = new stdclass();
     $phase->title = get_string('phaseclosed', 'workshopplus');
     $phase->tasks = array();
     $this->phases[workshopplus::PHASE_CLOSED] = $phase;
     // Polish data, set default values if not done explicitly
     foreach ($this->phases as $phasecode => $phase) {
         $phase->title = isset($phase->title) ? $phase->title : '';
         $phase->tasks = isset($phase->tasks) ? $phase->tasks : array();
         if ($phasecode == $workshopplus->phase) {
             $phase->active = true;
         } else {
             $phase->active = false;
         }
         if (!isset($phase->actions)) {
             $phase->actions = array();
         }
         foreach ($phase->tasks as $taskcode => $task) {
             $task->title = isset($task->title) ? $task->title : '';
             $task->link = isset($task->link) ? $task->link : null;
             $task->details = isset($task->details) ? $task->details : '';
             $task->completed = isset($task->completed) ? $task->completed : null;
         }
     }
     // Add phase switching actions
     if (has_capability('mod/workshopplus:switchphase', $workshopplus->context, $userid)) {
         foreach ($this->phases as $phasecode => $phase) {
             if (!$phase->active) {
                 $action = new stdclass();
                 $action->type = 'switchphase';
                 $action->url = $workshopplus->switchphase_url($phasecode);
                 $phase->actions[] = $action;
             }
         }
     }
 }