<?php
require_once __DIR__ . '/../../config/config.php';
header('Content-Type: application/json');
ob_start();
try {
    $academic_year = isset($_POST['academic_year']) ? trim($_POST['academic_year']) : '';
    $course_id = isset($_POST['course_id']) ? (int)$_POST['course_id'] : 0;
    $exam_type_id = isset($_POST['exam_type_id']) ? (int)$_POST['exam_type_id'] : 0;
    $register_number = isset($_POST['register_number']) ? trim($_POST['register_number']) : '';
    
    if(!$academic_year || !$course_id || !$exam_type_id || !$register_number){ 
        echo json_encode(['status'=>'error','message'=>'Missing required fields']); 
        exit; 
    }
    global $pdo;

    // Process academic year format (same as report API)
    $ay_term = (preg_match('/\b(Odd|Even)\b$/', $academic_year)) ? $academic_year : ($academic_year . ' Even');
    $ay_term = preg_replace('/\s+(Odd|Even)\s+\1$/', ' $1', $ay_term);

    // Find student by register number
    $stmt = $pdo->prepare("SELECT s.student_id, s.university_rollno, s.first_name, s.last_name, s.course_id, c.course_name, c.course_code
                           FROM students s 
                           LEFT JOIN courses c ON s.course_id = c.course_id
                           WHERE s.university_rollno = ? AND s.course_id = ?");
    $stmt->execute([$register_number, $course_id]);
    $student = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if (!$student) {
        echo json_encode(['status'=>'error','message'=>'Student not found with this register number']);
        exit;
    }

    // Get subjects for the course and academic year
    $stmt = $pdo->prepare("SELECT DISTINCT s.subject_id, s.subject_code, s.subject_name, s.credits, s.semester
                           FROM subjects s
                           INNER JOIN exam_subjects es ON s.subject_id = es.subject_id
                           INNER JOIN exams e ON es.exam_id = e.exam_id
                           WHERE s.course_id = ? AND e.academic_year = ? AND e.exam_type_id = ?
                           ORDER BY s.semester, s.subject_code");
    $stmt->execute([$course_id, $ay_term, $exam_type_id]);
    $subjects = $stmt->fetchAll(PDO::FETCH_ASSOC);

    if (empty($subjects)) {
        echo json_encode(['status'=>'error','message'=>'No subjects found for this course and academic year']);
        exit;
    }

    // Get CI settings for calculation method
    $stmt = $pdo->prepare("SELECT calculation_method FROM ci_assessment_settings WHERE course_id=? AND exam_type='Internal' ORDER BY setting_id DESC LIMIT 1");
    $stmt->execute([$course_id]);
    $ciSettings = $stmt->fetch(PDO::FETCH_ASSOC);
    $calculationMethod = $ciSettings['calculation_method'] ?? 'best2_avg';

    // Get internal marks based on calculation method from CI1, CI2, CI3
    $internalMarks = [];
    $subIds = implode(',', array_map('intval', array_column($subjects, 'subject_id')));
    $stmt = $pdo->prepare("SELECT 
                            im.student_id, 
                            ie.subject_id,
                            ie.exam_type_id,
                            im.marks_obtained
                          FROM internal_marks im
                          JOIN internal_exams ie ON im.internal_exam_id = ie.internal_exam_id
                          WHERE im.student_id = ? 
                            AND ie.subject_id IN ($subIds)
                            AND ie.academic_year = ?");
    $stmt->execute([$student['student_id'], $ay_term]);
    $internalData = [];
    while($r = $stmt->fetch(PDO::FETCH_ASSOC)){
        $key = (int)$r['subject_id'];
        if(!isset($internalData[$key])) $internalData[$key] = [];
        $internalData[$key][(int)$r['exam_type_id']] = (float)$r['marks_obtained'];
    }
    
    // Compute internal marks based on calculation method for each subject
    foreach($internalData as $subId => $marks){
        $ciMarks = array_values($marks);
        
        if(count($ciMarks) >= 1){
            $internalMark = 0;
            
            if($calculationMethod === 'best1'){
              // Best of 1
              $internalMark = max($ciMarks);
            } else if($calculationMethod === 'avg3' && count($ciMarks) >= 3){
              // Average of 3
              $internalMark = array_sum($ciMarks) / count($ciMarks);
            } else if($calculationMethod === 'best2_avg' && count($ciMarks) >= 2){
              // Best 2 average (default behavior)
              rsort($ciMarks);
              $best2 = array_slice($ciMarks, 0, 2);
              $internalMark = array_sum($best2) / count($best2);
            } else if(count($ciMarks) >= 2){
              // Fallback to best 2 average if not enough marks for selected method
              rsort($ciMarks);
              $best2 = array_slice($ciMarks, 0, 2);
              $internalMark = array_sum($best2) / count($best2);
            } else {
              // Just use the single mark if only one exists
              $internalMark = $ciMarks[0];
            }
            
            $internalMarks[$subId] = round($internalMark, 2);
        }
    }

    // Get external marks from subject_results - same as report
    $externalMarks = [];
    $stmt = $pdo->prepare("SELECT sr.subject_id, sr.external_marks, sr.internal_marks, sr.result 
                           FROM subject_results sr 
                           JOIN exams e ON sr.exam_id = e.exam_id 
                           WHERE sr.student_id = ? AND sr.subject_id IN ($subIds) AND e.academic_year = ?");
    $stmt->execute([$student['student_id'], $ay_term]);
    while($r = $stmt->fetch(PDO::FETCH_ASSOC)){
        $externalMarks[(int)$r['subject_id']] = [
            'external_marks' => (float)$r['external_marks'],
            'internal_marks' => (float)$r['internal_marks'],
            'result' => $r['result']
        ];
    }

    // Get grading system for the course
    $grading = [];
    $gsStmt = $pdo->prepare("SELECT grading_system_id FROM grading_systems WHERE course_id=? AND is_active=1 ORDER BY grading_system_id DESC LIMIT 1");
    $gsStmt->execute([$course_id]);
    $gs = $gsStmt->fetch(PDO::FETCH_ASSOC);
    if($gs){
        $gStmt = $pdo->prepare("SELECT grade_name, min_marks, max_marks, grade_point, is_pass FROM grades WHERE grading_system_id=? ORDER BY min_marks ASC");
        $gStmt->execute([$gs['grading_system_id']]);
        $grading = $gStmt->fetchAll(PDO::FETCH_ASSOC) ?: [];
    }

    $computeGrade = function(float $external) use ($grading){
        if(empty($grading)) return ['grade_name'=>null,'grade_point'=>null,'is_pass'=>null];
        foreach($grading as $g){
            if($external >= (float)$g['min_marks'] && $external <= (float)$g['max_marks']){
                return ['grade_name'=>$g['grade_name'],'grade_point'=>(float)$g['grade_point'],'is_pass'=>(int)$g['is_pass']===1];
            }
        }
        return ['grade_name'=>null,'grade_point'=>null,'is_pass'=>null];
    };

    // Combine data
    $results = [];
    foreach($subjects as $sub) {
        $subId = (int)$sub['subject_id'];
        $ext = $externalMarks[$subId] ?? ['external_marks' => 0, 'internal_marks' => 0, 'result' => null];
        
        $int = (float)($internalMarks[$subId] ?? $ext['internal_marks']);
        $ext_marks = (float)$ext['external_marks'];
        $total = $int + $ext_marks;

        // Normalize result
        $resRaw = $ext['result'];
        $gradeInfo = $computeGrade($ext_marks);
        $resultText = 'RA';
        if($resRaw){
            $resultText = (strtolower($resRaw)==='pass') ? 'PASS' : ((strtolower($resRaw)==='absent' || strtolower($resRaw)==='abs') ? 'ABS' : 'RA');
        } else {
            if($int==0 && $ext_marks==0){ $resultText = 'ABS'; }
            else if($gradeInfo && $gradeInfo['is_pass']===true){ $resultText = 'PASS'; }
            else { $resultText = 'RA'; }
        }

        $results[] = [
            'subject_id' => $subId,
            'subject_code' => $sub['subject_code'],
            'subject_name' => $sub['subject_name'],
            'credits' => (int)$sub['credits'],
            'internal_marks' => $int,
            'external_marks' => $ext_marks,
            'total_marks' => $total,
            'grade' => $gradeInfo['grade_name'],
            'grade_point' => $gradeInfo['grade_point'],
            'result' => $resultText
        ];
    }

    $result_data = [
        'student' => [
            'student_id' => $student['student_id'],
            'university_rollno' => $student['university_rollno'],
            'name' => trim(($student['first_name']??'').' '.($student['last_name']??''))
        ],
        'course' => [
            'course_id' => $course_id,
            'course_name' => $student['course_name'],
            'course_code' => $student['course_code']
        ],
        'academic_year' => $academic_year,
        'exam_type_id' => $exam_type_id,
        'results' => $results
    ];

    echo json_encode(['status'=>'success','result_data'=>$result_data]);

} catch (Exception $e) {
    http_response_code(500);
    echo json_encode(['status'=>'error','message'=>$e->getMessage()]);
}
ob_end_clean();
?>
