<?php
ini_set('display_errors', 1);

// Include necessary files
require_once '../../base_path_include.php';
require_once $base_path_to_learning_resources  . "includes/connect.php";
require_once $base_path_to_learning_resources . 'lib/function.php';
require_once $base_path_to_learning_resources . 'lib/validate_api_signature.php';
require_once $base_path_to_learning_resources . 'lib/validate_function.php';
require_once $base_path_to_learning . 'user_management/authenticate.php';
require_once $base_path_to_learning . 'admin_api/academic_session/functions/validate_faculty.php';
require_once $base_path_to_learning . 'admin_api/academic_session/functions/functions.php';
require_once $base_path_to_learning . 'functions/common_functions.php';
require_once $base_path_to_learning_resources . 'includes/specific_db_config.php';
require_once $base_path_to_learning . "vendor/autoload.php";
require_once $base_path_to_learning_resources . 'lib/bucket_functions/bucket_functions.php';
require_once $base_path_to_learning_resources . 'includes/aws_bucket_config.php';

$postdata = $_POST;

// Validate required fields
if (!isset($postdata['institution_id']) || !checkIfIssetAndNotEmpty($postdata['institution_id']) ||
    !isset($postdata['student_id']) || !checkIfIssetAndNotEmpty($postdata['student_id']) ||
    !isset($postdata['marksheet_id']) || !checkIfIssetAndNotEmpty($postdata['marksheet_id']) or
    !isset($postdata['api_signature']) or !checkIfIssetAndNotEmpty($postdata['api_signature']) or
    !isset($postdata['jwt_token']) or  !checkIfIssetAndNotEmpty($postdata['jwt_token'])) {
    errorreturn("All * fields are required.");
}

validateApiSignature($postdata['api_signature']);
$jwttoken = $postdata['jwt_token'];
$jwt_validate = authenticate_jwt($jwttoken);

$userid = $jwt_validate->data->id;
$workspace_id = $jwt_validate->data->workspace_id;
$username = $jwt_validate->data->username;
$role = $jwt_validate->data->role;

$specific_db_name = validateUserAccess($conn_rjllearning, $userid, $role, $workspace_id,["superadmin","admin","principal","teacher"], null);
if (!$specific_db_name) {
    errorreturn('Access denied.1');
} else {
    $conn_rjllearning_specific = dynamicDbConnection($specific_db_name);
}

$institution_id = $postdata['institution_id'];
$student_id = $postdata['student_id'];
$marksheet_id = $postdata['marksheet_id'];

// Check template exists
// $ExecuteSqlTemplate = $conn_rjllearning->prepare("SELECT id FROM template_info WHERE id = ?");
// $ExecuteSqlTemplate->execute([$marksheet_id]);
// $ResultTemplate = $ExecuteSqlTemplate->fetchAll();

// if (count($ResultTemplate) != 1) {
//     errorreturn("Marksheet Template does not exist.");
// }

// Fetch marksheet info
$ExecuteSqlMarksheet = $conn_rjllearning_specific->prepare("SELECT * FROM marksheet WHERE id = ?");
$ExecuteSqlMarksheet->execute([$marksheet_id]);
$rowmarksheet = $ExecuteSqlMarksheet->fetch(PDO::FETCH_ASSOC);

if (!$rowmarksheet) {
    errorreturn("Marksheet does not exist.");
} else {
    // If it exists, fetch the required data
    $examination = $rowmarksheet['examination_name'];
    $templateid = $rowmarksheet['template_id'];
    $academicsession = $rowmarksheet['academic_session'];
    $createdon = $rowmarksheet['time_created'];
    $createdon = $rowmarksheet['date_created']; // Ensure proper date formatting
    $createdby = $rowmarksheet['added_by'];
}

function getGrade($temp_marks, $total_marks)
{
	$temp = ($temp_marks / $total_marks) * 100;
	if ($temp >= 91 and $temp <= 100) {
		return 'A 1';
	} else if ($temp >= 81 and $temp <= 90) {
		return 'A 2';
	} else if ($temp >= 71 and $temp <= 80) {
		return 'B 1';
	} else if ($temp >= 61 and $temp <= 70) {
		return 'B 2';
	} else if ($temp >= 51 and $temp <= 60) {
		return 'C 1';
	} else if ($temp >= 41 and $temp <= 50) {
		return 'C 2';
	} else if ($temp >= 33 and $temp <= 40) {
		return 'D';
	} else if ($temp < 33) {
		return 'E';
	}
}

// Fetch template data
$ExecuteSqlTemplate = $conn_rjllearning->prepare("SELECT cols, template_name FROM template_info WHERE id = ?");
$ExecuteSqlTemplate->execute([$templateid]);
$ResultTemplate = $ExecuteSqlTemplate->fetch(PDO::FETCH_ASSOC);

if (!$ResultTemplate) {
    errorreturn("Marksheet Template does not exist.");
}

$cols = $ResultTemplate['cols'];

// Fetch student data
$ExecuteSqlStudent = $conn_rjllearning_specific->prepare("SELECT name, branch_id, class_id,academic_id,section_id FROM students WHERE id = ?");
$ExecuteSqlStudent->execute([$student_id]);
$rowstudent = $ExecuteSqlStudent->fetch(PDO::FETCH_ASSOC);

if (!$rowstudent) {
    errorreturn("Student does not exist.");
} else {
    // If the student exists, retrieve the desired fields
    $studentname = $rowstudent['name'];
    $branch = $rowstudent['branch_id'];
    $class = $rowstudent['class_id'];
    $academic_id = $rowstudent['academic_id'];
    $section_id = $rowstudent['section_id'];
}

// Delete pre-existing entries
$deleteExistingData = $conn_rjllearning_specific->prepare("
    DELETE FROM student_marksheet_data 
    WHERE student_id = ? AND marksheet_id = ?
");
$deleteSuccessful = $deleteExistingData->execute([$student_id, $marksheet_id]);
if (!$deleteSuccessful) {
    errorreturn("Failed to delete existing data.");
}

// Initialize and fill the array
$array = array_fill(1, $cols, '');
for ($i = 1; $i <= $cols; $i++) {
    if ($i == 6) {
        $total = 0;
        for ($j = 1; $j <= 5; $j++) {
            if (is_numeric($array[$j]) && $array[$j] !== '') {
                $total += (float)$array[$j];
            }
        }
        $array[6] = $total > 0 ? $total : '';
    } else {
        $value = strtoupper(trim(str_replace("'", "''", $_POST[$i] ?? '')));
        $array[$i] = $value;
    }
}

$json_encoded_array = json_encode($array);

// Insert into database and return ID
try {
    $conn_rjllearning_specific->beginTransaction();
    
    $insert = $conn_rjllearning_specific->prepare("
        INSERT INTO student_marksheet_data (
            institution_id, marksheet_id, student_id, data,
            branch_id, academic_id, class_id, section_id,
            created_by, date_created, time_created, status
        ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    ");
    
    $insert->execute([
        $institution_id, $marksheet_id, $student_id, $json_encoded_array,
        $branch, $academic_id, $class, $section_id,
        $username, date("Y-m-d"), date("H:i:s"), '1'
    ]);
    
    $insertId = $conn_rjllearning_specific->lastInsertId();
    
    // Calculate analytics
    $analytics = calculateMarksheetAnalytics($array);
    
    // Update with analytics
    $update = $conn_rjllearning_specific->prepare("
        UPDATE student_marksheet_data 
        SET analytics = ?
        WHERE id = ?
    ");
    $updateSuccessful = $update->execute([json_encode($analytics), $insertId]);
    
    $conn_rjllearning_specific->commit();
    
    if ($updateSuccessful) {
        successreturn("Data inserted successfully.");
    } else {
        errorreturn("Failed to insert data into marksheet_data.");
    }
    
} catch (PDOException $e) {
    $conn_rjllearning_specific->rollBack();
    errorreturn("Database error: " . $e->getMessage());
}

function calculateMarksheetAnalytics($marksData)
{
    // Subject mapping with their names
    $subjects = [
        1 => 'English',
        2 => 'Mathematics',
        3 => 'E.V.S',
        4 => 'Punjabi',
        5 => 'Hindi'
    ];

    $totalObtained = $marksData[6] ?? 0;
    $totalMax = 100; // Sum of all subject max marks (5 subjects × 20 marks)
    $percentage = round($totalObtained / $totalMax * 100, 2);

    // Calculate subject percentages, grades, and prepare rankings
    $subjectRankings = [];

    foreach ($subjects as $index => $subjectName) {
        $obtained = (float)($marksData[$index] ?? 0);
        $subjectMax = 20; // Each subject has max 20 marks
        $subjectPercentage = $obtained / $subjectMax * 100;

        $subjectRankings[] = [
            'subject' => $subjectName,
            'obtained' => $obtained,
            'max' => $subjectMax,
            'percentage' => round($subjectPercentage, 2),
            'grade' => getGrade($obtained, $subjectMax)
        ];
    }

    // Sort rankings by percentage (highest first)
    usort($subjectRankings, function ($a, $b) {
        return $b['percentage'] <=> $a['percentage'];
    });

    // Get subject names for highest and lowest
    $highestSubject = $subjectRankings[0]['subject'];
    $lowestSubject = end($subjectRankings)['subject'];

    // Calculate total grade
    $grade = getGrade($totalObtained, $totalMax);

    return [
        'total_obtained' => $totalObtained,
        'total_max' => $totalMax,
        'percentage' => $percentage,
        'grade' => $grade,
        'highest_marks_obtained_subject' => $highestSubject,
        'lowest_marks_obtained_subject' => $lowestSubject,
        'subject_rankings' => $subjectRankings
    ];
}




?>