<?php
/* For licensing terms, see /license.txt */
/**
 * Responses to AJAX calls
 */

require_once '../../exercice/exercise.class.php';
require_once '../../exercice/question.class.php';
require_once '../../exercice/answer.class.php';
require_once '../global.inc.php';
require_once '../../exercice/exercise.lib.php';

api_protect_course_script(true);

$action = $_REQUEST['a'];
$course_id = api_get_course_int_id();

switch ($action) {
    case 'get_live_stats':
        if (!api_is_allowed_to_edit(null, true)) {
            break;
        }    
        
        // 1. Setting variables needed by jqgrid 
        $action = $_GET['a'];
        $exercise_id = intval($_GET['exercise_id']);
        $page  = intval($_REQUEST['page']); //page
        $limit = intval($_REQUEST['rows']); //quantity of rows
        $sidx  = $_REQUEST['sidx'];         //index to filter         
        $sord  = $_REQUEST['sord'];         //asc or desc
        if (!in_array($sord, array('asc','desc'))) {
            $sord = 'desc'; 
        }
        // get index row - i.e. user click to sort $sord = $_GET['sord']; 
        // get the direction 
        if (!$sidx) $sidx = 1;
        
        $track_exercise        = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
        $user_table            = Database::get_main_table(TABLE_MAIN_USER);
        $track_attempt         = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
        
        $minutes = intval($_REQUEST['minutes']);        
        $now    = time() - 60*$minutes; //1 hour
        $now    = api_get_utc_datetime($now);
        
        $where_condition = " orig_lp_id = 0 AND exe_exo_id = $exercise_id AND start_date > '$now' ";
        $sql    = "SELECT COUNT(DISTINCT exe_id) FROM $track_exercise WHERE $where_condition ";
        $result = Database::query($sql);
        
        $count  = Database::fetch_row($result);
        $count  = $count[0];  
        
        //3. Calculating first, end, etc
                
        $total_pages = 0;
        if ($count > 0) { 
            if (!empty($limit)) {
                $total_pages = ceil($count/$limit);
            }
        }
        if ($page > $total_pages) { 
            $page = $total_pages;
        }     
        
        $start = $limit * $page - $limit;
        if ($start < 0 ) {
            $start = 0;
        }        
        
        $sql = "SELECT count_questions, exe_user_id, firstname, lastname, aa.status, start_date, exe_result, exe_weighting, exe_result/exe_weighting as score, exe_duration, questions_to_check, orig_lp_id
                FROM $user_table u INNER JOIN (
                    SELECT  t.exe_user_id, count(question_id) as count_questions, status,
                    start_date, exe_result, exe_weighting, exe_result/exe_weighting as score, exe_duration, questions_to_check, orig_lp_id
                    FROM  $track_exercise  t LEFT JOIN   $track_attempt a ON (a.exe_id = t.exe_id AND  t.exe_user_id = a.user_id ) 
                    WHERE t.status = 'incomplete' AND
                          $where_condition  
                GROUP BY exe_user_id                    
                ) as aa
                ON aa.exe_user_id = user_id                    
                ORDER BY $sidx $sord LIMIT $start, $limit";
                //echo $sql;
        $result = Database::query($sql);
        $results = array();
        
        while ($row = Database::fetch_array($result,'ASSOC')){
            $results[] = $row;
        }        
        
        $response = new stdClass();           
        $response->page     = $page; 
        $response->total    = $total_pages; 
        $response->records  = $count; 
        $i=0;
        
        if (!empty($results)) {
            foreach($results as $row) {
                //$user_info = api_get_user_info($row['exe_user_id']);
                //print_r($row);
                $response->rows[$i]['id'] = $row['exe_id'];                 
                $array = array( $row['firstname'], 
                                $row['lastname'], 
                                api_format_date($row['start_date'], DATE_TIME_FORMAT_LONG),
                                $row['count_questions'],                                
                                round($row['score']*100).'%'
                               );
                $response->rows[$i]['cell'] = $array;
                $i++; 
            }
        } 
        echo json_encode($response);
        break;            
    case 'update_question_order':
        if (api_is_allowed_to_edit(null, true)) {    
            $new_question_list     = $_POST['question_id_list'];
            $TBL_QUESTIONS = Database::get_course_table(TABLE_QUIZ_TEST_QUESTION);        
            $counter = 1;
            foreach ($new_question_list as $new_order_id) {            
                Database::update($TBL_QUESTIONS, array('question_order'=>$counter), array('question_id = ? AND c_id = ? '=>array(intval($new_order_id), $course_id)));
                $counter++;
            }
            Display::display_confirmation_message(get_lang('Saved'));
        }
        break;
    case 'add_question_to_reminder':    	    	
    	$objExercise             = $_SESSION['objExercise'];    	
    	if (empty($objExercise)) {
    		echo 0;
    		exit;
    	} else {
    		$objExercise->edit_question_to_remind($_REQUEST['exe_id'], $_REQUEST['question_id'], $_REQUEST['action']); 
    	}
    	break;
    case 'save_exercise_by_now':
        //Use have permissions?
        if (api_is_allowed_to_session_edit()) {
        	            
            //"all" or "simple" strings means that there's one or all questions           
            $type                    = $_REQUEST['type'];            
            
            //Normal questions choices
            $choice                  = $_REQUEST['choice'];
            
            //All Hotspot coordinates from all questions 
            $hot_spot_coordinates    = $_REQUEST['hotspot'];
            
            
            //There is a reminder?
            $remind_list             = isset($_REQUEST['remind_list']) && !empty($_REQUEST['remind_list'])? array_keys($_REQUEST['remind_list']) : null;
               
            $exe_id = $_REQUEST['exe_id'];
            
            //Exercise information            
            $question_id             = intval($_REQUEST['question_id']);            
            $question_list           = $_SESSION['questionList'];
            $objExercise             = $_SESSION['objExercise'];
            
            if (empty($question_list) || empty($objExercise)) {
                echo 0;
                exit;
            }            
            //Getting information of the current exercise    
            $exercise_stat_info = $objExercise->get_stat_track_exercise_info_by_exe_id($exe_id);           
            
            $attempt_list = array();
              
            //First time here we create an attempt (getting the exe_id)
            if (empty($exercise_stat_info)) {           
            	/* 
                //$exe_id = create_event_exercice($objExercise->selectId());                
                $current_expired_time_key = get_time_control_key($objExercise->id);
                if (isset($_SESSION['expired_time'][$current_expired_time_key])) { //Only for exercice of type "One page"
                	$expired_date = $_SESSION['expired_time'][$current_expired_time_key];
                } else {
                	$expired_date = '0000-00-00 00:00:00';
                }
                $exe_id = $objExercise->save_stat_track_exercise_info($expired_date, $safe_lp_id, $safe_lp_item_id, $safe_lp_item_view_id, $question_list, 0); //total weight 0 by now                
                $total_score = $total_weight = 0;
                */
            } else {               
                //We know the user we get the exe_id
                $exe_id        = $exercise_stat_info['exe_id'];
                $total_score   = $exercise_stat_info['exe_result'];
                
                //Getting the list of attempts
                $attempt_list  = get_all_exercise_event_by_exe_id($exe_id);
            }
            
            
            //Updating Reminder algorythm
            if ($objExercise->type == ONE_PER_PAGE) {
            	$bd_reminder_list = explode(',', $exercise_stat_info['questions_to_check']);
            
            	if (empty($remind_list)) {
            		$remind_list = $bd_reminder_list;
            
            		$new_list = array();
            		foreach($bd_reminder_list as $item) {
            			if ($item != $question_id) {
            				$new_list[] = $item;
            			}
            		}
            		$remind_list = $new_list;
            	} else {
            		if (isset($remind_list[0])) {
            			if (!in_array($remind_list[0], $bd_reminder_list)) {
            				array_push($bd_reminder_list, $remind_list[0]);
            			}
            			$remind_list = $bd_reminder_list;
            		}
            	}
            }
            
            
            //No exe id? Can't save answer
            if (empty($exe_id)) {
                //Fires an error 
                echo 'error';
                exit;
            } else {
                $_SESSION['exe_id'] = $exe_id;
            }
            
            // Getting the total weight if the request is simple
            $total_weight = 0;
            if ($type == 'simple') {                
                foreach($question_list as $my_question_id) {
                    $objQuestionTmp  = Question :: read($my_question_id);
                    $total_weight   += $objQuestionTmp->selectWeighting();
                }
            }
            
           unset($objQuestionTmp);
            
            //Looping the question list
            
            foreach($question_list as $my_question_id) {                
                if ($type == 'simple' && $question_id != $my_question_id) {
                    continue;
                }             
                 
                $my_choice = $choice[$my_question_id];
                                
               // creates a temporary Question object
            	$objQuestionTmp        = Question::read($my_question_id);
            	
            	//Getting free choice data
            	if ($objQuestionTmp->type  == FREE_ANSWER && $type == 'all') {
            	    $my_choice = isset($_REQUEST['free_choice'][$my_question_id]) && !empty($_REQUEST['free_choice'][$my_question_id])? $_REQUEST['free_choice'][$my_question_id]: null;            	                	    
            	}  
            	
                if ($type == 'all') {  
                    $total_weight += $objQuestionTmp->selectWeighting();
                }      
            	
            	//this variable commes from exercise_submit_modal.php
            	$hotspot_delineation_result = $_SESSION['hotspot_delineation_result'][$objExercise->selectId()][$my_question_id];
            	
            	// Deleting old attempt
                if (isset($attempt_list) && !empty($attempt_list[$my_question_id])) {                    
                    delete_attempt($exe_id, api_get_user_id() , api_get_course_id(), api_get_session_id(), $my_question_id);
                    if ($objQuestionTmp->type  == HOT_SPOT) {            	        
            	        delete_attempt_hotspot($exe_id, api_get_user_id() , api_get_course_id(), $my_question_id);
                    }
            	    $total_score  -= $attempt_list[$my_question_id]['marks'];            	    
            	}
            	
            	// We're inside *one* question. Go through each possible answer for this question
            	$result = $objExercise->manage_answer($exe_id, $my_question_id, $my_choice,'exercise_result', $hot_spot_coordinates, true, false, $show_results, $objExercise->selectPropagateNeg(), $hotspot_delineation_result, true);
            	  	
                $total_score     += $result['score'];    
              	
                update_event_exercice($exe_id, $objExercise->selectId(), $total_score, $total_weight, api_get_session_id(), $exercise_stat_info['orig_lp_id'], $exercise_stat_info['orig_lp_item_id'], $exercise_stat_info['orig_lp_item_view_id'], $exercise_stat_info['exe_duration'], $question_list, 'incomplete', $remind_list);
                
                 // Destruction of the Question object
            	unset($objQuestionTmp); 
            }            
        }
        
        if ($objExercise->type == ONE_PER_PAGE) {
            echo 'one_per_page';
            exit;
        }
        echo 'ok';
        break;
    default:
        echo '';
}
exit;