<?php
// Start session
session_start();
// Include database configuration
require_once '../../config/database.php';
// Check if user is logged in and has student role
if (!isset($_SESSION['user_id']) || $_SESSION['role'] !== 'student') {
header('Content-Type: application/json');
echo json_encode(['success' => false, 'message' => 'Unauthorized access']);
exit;
}
$user_id = $_SESSION['user_id'];
// Check if exam ID is provided
if (!isset($_GET['exam_id']) || empty($_GET['exam_id'])) {
header('Content-Type: application/json');
echo json_encode(['success' => false, 'message' => 'Exam ID is required']);
exit;
}
$exam_id = intval($_GET['exam_id']);
// Get exam details and student exam status
$exam_query = "SELECT es.*, c.title as course_title,
(SELECT COUNT(*) FROM exam_question_maps WHERE exam_id = es.id) as question_count,
se.id as student_exam_id, se.status as exam_status,
se.start_time, se.end_time, se.total_score, se.percentage
FROM exam_schedules es
JOIN courses c ON es.course_id = c.id
LEFT JOIN student_exams se ON es.id = se.exam_id AND se.user_id = ?
WHERE es.id = ?";
$stmt = $conn->prepare($exam_query);
$stmt->bind_param("ii", $user_id, $exam_id);
$stmt->execute();
$exam_result = $stmt->get_result();
if ($exam_result->num_rows === 0) {
header('Content-Type: application/json');
echo json_encode(['success' => false, 'message' => 'Exam not found']);
exit;
}
$exam = $exam_result->fetch_assoc();
// Check if there's a student exam record
$has_started = !empty($exam['student_exam_id']);
$is_completed = $has_started && in_array($exam['exam_status'], ['completed', 'graded', 'passed', 'failed']);
$is_in_progress = $has_started && $exam['exam_status'] === 'in_progress';
// Check if exam is currently active
$current_date = date('Y-m-d');
$current_time = date('H:i:s');
$is_active = false;
if ($exam['exam_date'] == $current_date) {
if ($current_time >= $exam['start_time'] && $current_time <= $exam['end_time']) {
$is_active = true;
}
}
// Calculate time remaining if in progress
$time_remaining = 0;
if ($is_in_progress && $exam['start_time']) {
$start_time = new DateTime($exam['start_time']);
$current_time = new DateTime();
$time_elapsed = $current_time->getTimestamp() - $start_time->getTimestamp();
$time_remaining = max(0, $exam['duration_minutes'] * 60 - $time_elapsed);
}
// Prepare response data
$response = [
'success' => true,
'exam_id' => $exam_id,
'exam_title' => $exam['title'],
'course_title' => $exam['course_title'],
'has_started' => $has_started,
'is_completed' => $is_completed,
'is_in_progress' => $is_in_progress,
'is_active' => $is_active,
'time_remaining' => $time_remaining,
'exam_date' => $exam['exam_date'],
'start_time' => $exam['start_time'],
'end_time' => $exam['end_time'],
'duration_minutes' => $exam['duration_minutes'],
'question_count' => $exam['question_count'],
'status' => $exam['exam_status'] ?? 'not_started',
];
// Add result data if completed
if ($is_completed) {
$response['total_score'] = $exam['total_score'];
$response['percentage'] = $exam['percentage'];
$response['passing_percentage'] = $exam['passing_percentage'];
$response['passed'] = $exam['percentage'] >= $exam['passing_percentage'];
// Check if certificate exists
$cert_query = "SELECT id FROM exam_certificates
WHERE student_exam_id = ?";
$stmt = $conn->prepare($cert_query);
$stmt->bind_param("i", $exam['student_exam_id']);
$stmt->execute();
$cert_result = $stmt->get_result();
$response['has_certificate'] = $cert_result->num_rows > 0;
if ($response['has_certificate']) {
$cert = $cert_result->fetch_assoc();
$response['certificate_id'] = $cert['id'];
}
}
// Return JSON response
header('Content-Type: application/json');
echo json_encode($response);
exit;