<?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';
require_once $base_path_to_learning_resources . 'marksheet_template/template23/process.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)
// {
//     if ($total_marks <= 0) {
//         return 'Invalid total marks'; // Handle zero or negative total_marks
//     }

//     $temp = ($temp_marks / $total_marks) * 100;

//     // Logging the percentage for debugging
//     error_log("Percentage calculated: " . $temp);

//     if ($temp >= 91 && $temp <= 100) {
//         return 'A 1';
//     } elseif ($temp >= 81 && $temp < 91) {
//         return 'A 2';
//     } elseif ($temp >= 71 && $temp < 81) {
//         return 'B 1';
//     } elseif ($temp >= 61 && $temp < 71) {
//         return 'B 2';
//     } elseif ($temp >= 51 && $temp < 61) {
//         return 'C 1';
//     } elseif ($temp >= 41 && $temp < 51) {
//         return 'C 2';
//     } elseif ($temp >= 33 && $temp < 41) {
//         return 'D';
//     } else {
//         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'];
}
// //checking if student is valid for marksheet using branch and class
// $checkmarksheetinfo = $conn_rjllearning_specific("Select * from marksheet_info where id=$marksheetinfokey and branch='$branch' and class='$class'");
// if (!$checkmarksheetinfo) die(mysqli_error($connect));
// if (mysqli_num_rows($checkmarksheetinfo) == 0) {
// 	die("Marksheet Information not found.");
// }

//delete preexisting 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.");
}

// Initialize necessary variables
// Initialize the array and total marks
$array = array(); // Initialize your array

// Initialize all columns with default values
for ($i = 1; $i <= 70; $i++) {
    $array[$i] = 0; // Start with 0
}

// Assign specific indices to empty strings or other default values as needed
$array[7] = ""; 
$array[14] = ""; 
$array[21] = ""; 
$array[28] = ""; 
$array[35] = ""; 
$array[42] = ""; 
$array[49] = ""; // Marks ended

$array[52] = ""; // Overall percentage
$array[53] = ""; // Overall grade

for ($i = 54; $i <= 68; $i++) {
    $array[$i] = ""; // Initialize grade-related columns to empty
}

// Loop to process data from $postdata
for ($i = 1; $i <= 70; $i++) {
    // Check if the index exists in $postdata and is not empty
    if (isset($postdata[$i])) {
        // Assign the value from postdata, ensuring it's properly converted
        $array[$i] = (float)$postdata[$i]; // Store as float for accurate calculations
    }

    // Group sums and grades logic (only for indices up to 49)
    if ($i <= 49 ) {
            $array[6] = (float)$array[5] + (float)$array[1] + (float)$array[2] + (float)$array[3] + (float)$array[4];
           $group_sum = $array[6]; // Assign group sum directly to the next index
            $array[7] = getGrade($group_sum, 100); // Assign grade based on group sum
            
            $array[13] = (float)$array[8] + (float)$array[9] + (float)$array[10] + (float)$array[11] + (float)$array[12];
           $group_sum = $array[13]; // Assign group sum directly to the next index
            $array[14] = getGrade($group_sum, 100);
            
             $array[20] = (float)$array[15] + (float)$array[16] + (float)$array[17] + (float)$array[18] + (float)$array[19];
           $group_sum = $array[20]; // Assign group sum directly to the next index
            $array[21] = getGrade($group_sum, 100);
            
            $array[27] = (float)$array[22] + (float)$array[23] + (float)$array[24] + (float)$array[25] + (float)$array[26];
           $group_sum = $array[27]; // Assign group sum directly to the next index
            $array[28] = getGrade($group_sum, 100);
            
            $array[34] = (float)$array[29] + (float)$array[30] + (float)$array[31] + (float)$array[32] + (float)$array[33];
           $group_sum = $array[34]; // Assign group sum directly to the next index
            $array[35] = getGrade($group_sum, 100);
            
            
            $array[41] = (float)$array[36] + (float)$array[37] + (float)$array[38] + (float)$array[39] + (float)$array[40];
           $group_sum = $array[41]; // Assign group sum directly to the next index
            $array[42] = getGrade($group_sum, 100);
            
            $array[48] = (float)$array[43] + (float)$array[44] + (float)$array[45] + (float)$array[46] + (float)$array[47];
           $group_sum = $array[48]; // Assign group sum directly to the next index
            $array[49] = getGrade($group_sum, 100);
        
    }

    // Calculate total marks from specific columns
    if ($i == 51) {
        // Calculate total marks from specific indices, avoiding overwriting
        $total_marks = (float)$array[6] + (float)$array[13]+ (float)$array[20]+(float)$array[27]+ (float)$array[34]+ (float)$array[41]+ (float)$array[48]; // Adjust based on your specific needs
        $array[$i] = $total_marks; // Assign to array at index 51
    }

    // Calculate and assign percentage
    if ($i == 52) {
        if (isset($total_marks) && $total_marks > 0) {
            $array[$i] = number_format(($total_marks / 700) * 100, 2, '.', '') . '%'; // Assuming total marks possible is 700
        } else {
            $array[$i] = "0.00%"; // Default to 0% if total marks are zero
        }
    }

    // Assign overall grade based on total marks
    if ($i == 53) {
         $array[53] = getGrade($total_marks, 700); // Assuming max is 700
    }

    // Convert input to uppercase for specific columns
    if ($i >= 54 && $i <= 68) {
        $array[$i] = isset($postdata[$i]) ? strtoupper($postdata[$i]) : '';
    }

    // Handle participation and remarks fields
    if ($i == 69 || $i == 70) {
        if (isset($postdata[$i]) && trim($postdata[$i]) != '') {
            $array[$i] = ucwords(trim($postdata[$i]));
        } else {
            $array[$i] = ''; // Default to empty if no input
        }
    }
}

// JSON encode the array before storing it in the database
$json_encoded_array = json_encode($array);

// Optionally, you can print or return the JSON encoded array for further processing
// echo $json_encoded_array; // Uncomment to see the JSON output

// Debugging output


// You can now use $json_encoded_array to store it in the database


// Store the JSON-encoded array in the database
// Assuming you have a database connection, you can now insert this into the relevant field
// Example query:
// $stmt = $db->prepare("INSERT INTO your_table (json_field) VALUES (:json_encoded_array)");
// $stmt->execute(['json_encoded_array' => $json_encoded_array]);





// Insert into the database or perform further actions...

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_23($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());
}

