<?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';
// Decode JSON input data
// $postdata = json_decode(file_get_contents("php://input"), true);

// // Check if no data was received
// checkIfNoPhpContentsReceive();

$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']);
// // Authenticate JWT token
$jwttoken = $postdata['jwt_token'];
$jwt_validate = authenticate_jwt($jwttoken);

// Extract user details from JWT token
$userid = $jwt_validate->data->id;
$workspace_id = $jwt_validate->data->workspace_id;
$username = $jwt_validate->data->username;
$role = $jwt_validate->data->role;

// Validate user access and get specific database name
$specific_db_name = validateUserAccess($conn_rjllearning, $userid, $role, $workspace_id,["superadmin","admin","principal","teacher"], null);
if (!$specific_db_name) {
    errorreturn('Access denied.');
} else {
    $conn_rjllearning_specific = dynamicDbConnection($specific_db_name);
}
$institution_id = $postdata['institution_id'];
$student_id = $postdata['student_id'];
$marksheet_id = $postdata['marksheet_id'];
// $branch_id = $postdata['branch_id'];
// $academic_id = $postdata['academic_id'];
// $class_id = $postdata['class_id'];
// $section_id = $postdata['section_id'];

//checking marksheet existence in db

// Step 1: Check if the associated template exists
// $ExecuteSqlTemplate = $conn_rjllearning->prepare("SELECT id FROM template_info WHERE id = ?");
// $ExecuteSqlTemplate->execute([$marksheet_id]); // Use marksheet_id to check the template
// $ResultTemplate = $ExecuteSqlTemplate->fetchAll();

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

// Step 2: If the template exists, fetch data from marksheet_info
$ExecuteSqlMarksheet = $conn_rjllearning_specific->prepare("SELECT * FROM marksheet WHERE id = ?");
$ExecuteSqlMarksheet->execute([$marksheet_id]);

// Fetch the result
$rowmarksheet = $ExecuteSqlMarksheet->fetch(PDO::FETCH_ASSOC);

// Check if marksheet exists
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'];

    // Now you can use the fetched data as needed
}

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';
	}
}

$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.");
}

// If the template exists, extract the template name and other relevant data
$templateName = $ResultTemplate['template_name'];
$cols = $ResultTemplate['cols'];

//fetching 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]);

// Fetch the result
$rowstudent = $ExecuteSqlStudent->fetch(PDO::FETCH_ASSOC);

// Check if student exists
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'];
}

//deleting any pre entries
$deleteExistingData = $conn_rjllearning_specific->prepare("
    DELETE FROM student_marksheet_data 
    WHERE student_id = ? AND marksheet_id = ?
");

// Execute the query with the student ID and marksheet ID
$deleteSuccessful = $deleteExistingData->execute([$student_id, $marksheet_id]);
if (!$deleteSuccessful) {
    errorreturn("Failed to delete existing data.");
}

$array = array_fill(1, $cols, ''); 

for ($i = 1; $i <= 11; $i++) {
    $value = isset($postdata[$i]) ? strtoupper(trim(str_replace("'", "''", $postdata[$i]))) : '';
    $array[$i] = $value;
}

$total = 0;
for ($i = 5; $i <= 9; $i++) {
    $total += is_numeric($array[$i]) ? (int)$array[$i] : 0;
}
$array[12] = $total; 

$array[13] = isset($postdata['13']) ? strtoupper(trim(str_replace("'", "''", $postdata['13']))) : '';

$json_encoded_array = json_encode($array);

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 = marksheet_analytics_21($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 marksheet_analytics_21($marksData)
{
    // All subjects (7 total)
    $allSubjects = [
        5 => 'English',
        6 => 'Physical Education',
        7 => $marksData[1],
        8 => $marksData[2],  
        9 => $marksData[3],  
        10 => $marksData[4], 
        11 => 'Information Technology'
    ];

    
    $mainSubjects = array_slice($allSubjects, 0, 5, true);

    $totalObtained = $marksData[12] ?? 0;
    $totalMax = 200; 
    $percentage = round(($totalObtained / $totalMax) * 100, 2);

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

    foreach ($allSubjects as $index => $subjectName) {
        $obtained = (float)($marksData[$index] ?? 0);
        $subjectPercentage = ($obtained / 40) * 100; 
        
        $subjectRankings[] = [
            'subject' => $subjectName,
            'percentage' => round($subjectPercentage, 2)
        ];

        if (array_key_exists($index, $mainSubjects)) {
            $mainSubjectMarks[$subjectName] = $obtained;
        }
    }

    arsort($mainSubjectMarks);
    $mainSubjectNames = array_keys($mainSubjectMarks);
    $highestSubject = !empty($mainSubjectNames) ? $mainSubjectNames[0] : 'N/A';
    $lowestSubject = !empty($mainSubjectNames) ? end($mainSubjectNames) : 'N/A';

    usort($subjectRankings, function ($a, $b) {
        return $b['percentage'] <=> $a['percentage'];
    });

    $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
    ];
}

?>