<?php
// manage_results.php
// Single-file Results manager (students -> add result modal + view results modal)
// Requirements: config.php defines $conn (mysqli). photos/ folder and image/default.png exist.

session_start();
require_once "auth/auth_check.php";
require_once "auth/config.php";

/* ======== SUPERADMIN FLAG ======== */
// auth_check.php stores the logged-in user as $_SESSION['teacher_id'].
// We look up is_superadmin from the teachers table using that id.
$current_user_id  = $_SESSION['teacher_id'] ?? 0;
$superadmin_row   = $conn->query("SELECT is_super_admin FROM teachers WHERE id = " . intval($current_user_id) . " LIMIT 1")->fetch_assoc();
$is_superadmin    = (int)($superadmin_row['is_super_admin'] ?? 0) === 1;

// JSON helper
function json_resp($arr) {
    header('Content-Type: application/json');
    echo json_encode($arr);
    exit;
}

// Compute letter grade from a total score
function compute_grade($total) {
    return ($total >= 70) ? 'A' : (($total >= 60) ? 'B' : (($total >= 50) ? 'C' : (($total >= 40) ? 'D' : 'F')));
}

// A score of -1 is used as a "not yet entered" sentinel so that a real
// score of 0 can still be saved and distinguished from "not entered".
// This treats -1 as 0 for the purpose of total calculations.
function norm_score($v) {
    $v = (int)$v;
    return ($v === -1) ? 0 : $v;
}

/* ======== FETCH ACTIVE TERM & SESSION FROM DB ======== */
$active_term_row    = $conn->query("SELECT name FROM terms    WHERE is_active = 1 LIMIT 1")->fetch_assoc();
$active_session_row = $conn->query("SELECT name FROM sessions WHERE is_active = 1 LIMIT 1")->fetch_assoc();
$active_term    = $active_term_row    ? $active_term_row['name']    : '';
$active_session = $active_session_row ? $active_session_row['name'] : '';

/* ======== FETCH ALL TERMS & SESSIONS FOR DROPDOWNS ======== */
$all_terms_result    = $conn->query("SELECT name FROM terms    ORDER BY id ASC");
$all_sessions_result = $conn->query("SELECT name FROM sessions ORDER BY id ASC");
$all_terms    = [];
$all_sessions = [];
while ($r = $all_terms_result->fetch_assoc())    $all_terms[]    = $r['name'];
while ($r = $all_sessions_result->fetch_assoc()) $all_sessions[] = $r['name'];

/* ======== FETCH ALL CLASSES & SUBJECTS FROM DB ======== */
$all_classes_result  = $conn->query("SELECT class_name FROM classes ORDER BY id ASC");
$all_subjects_result = $conn->query("SELECT subject_name FROM subjects ORDER BY id ASC");
$all_classes  = [];
$all_subjects = [];
while ($r = $all_classes_result->fetch_assoc())  $all_classes[]  = $r['class_name'];
while ($r = $all_subjects_result->fetch_assoc()) $all_subjects[] = $r['subject_name'];

/* ---------------- AJAX HANDLERS ---------------- */
if (isset($_GET['action'])) {
    $action = $_GET['action'];

    // GET STUDENTS by class, page (50/page)
    if ($action === 'get_students') {
        $class  = $_GET['class'] ?? '';
        $page   = max(1, intval($_GET['page'] ?? 1));
        $limit  = 50;
        $offset = ($page - 1) * $limit;

        $stmt = $conn->prepare("
            SELECT SQL_CALC_FOUND_ROWS id, admission_number, first_name, sur_name, last_name, photo, class
            FROM students
            WHERE class = ?
            ORDER BY last_name, sur_name, first_name
            LIMIT ? OFFSET ?
        ");
        $stmt->bind_param("sii", $class, $limit, $offset);
        $stmt->execute();
        $res = stmt_get_result($stmt);
        $students = [];
        while ($r = $res->fetch_assoc()) {
            $photo    = !empty($r['photo']) ? 'photos/' . $r['photo'] : 'image/default.png';
            $fullname = trim($r['first_name'] . ' ' . $r['sur_name'] . ' ' . $r['last_name']);
            $students[] = [
                'id'               => $r['id'],
                'admission_number' => $r['admission_number'],
                'full_name'        => $fullname,
                'class'            => $r['class'],
                'photo'            => $photo
            ];
        }
        $total = $conn->query("SELECT FOUND_ROWS() AS cnt")->fetch_assoc()['cnt'];
        json_resp(['success' => true, 'students' => $students, 'total' => intval($total), 'limit' => $limit]);
    }

    // GET single result record
    if ($action === 'get_result') {
        $ad      = $_GET['admission'] ?? '';
        $sub     = $_GET['subject']   ?? '';
        $term    = $_GET['term']      ?? '';
        $session = $_GET['session']   ?? '';

        $stmt = $conn->prepare("SELECT * FROM results WHERE admission_number=? AND subject=? AND term=? AND session=? LIMIT 1");
        $stmt->bind_param("ssss", $ad, $sub, $term, $session);
        $stmt->execute();
        $res = stmt_get_result($stmt);
        if ($row = $res->fetch_assoc()) {
            json_resp(['success' => true, 'exists' => true, 'result' => $row]);
        } else {
            json_resp(['success' => true, 'exists' => false]);
        }
    }

    // VIEW results for student filtered by term & session
    if ($action === 'view_results') {
        $ad      = $_GET['admission'] ?? '';
        $term    = $_GET['term']      ?? '';
        $session = $_GET['session']   ?? '';

        $sql    = "SELECT id, subject, first_ca, second_ca, exam, total, grade FROM results WHERE admission_number = ?";
        $types  = "s";
        $params = [$ad];
        if ($term    !== '') { $sql .= " AND term = ?";    $types .= "s"; $params[] = $term; }
        if ($session !== '') { $sql .= " AND session = ?"; $types .= "s"; $params[] = $session; }
        $sql .= " ORDER BY subject ASC";

        $stmt = $conn->prepare($sql);
        $stmt->bind_param($types, ...$params);
        $stmt->execute();
        $res  = stmt_get_result($stmt);
        $rows = [];
        while ($r = $res->fetch_assoc()) $rows[] = $r;
        json_resp(['success' => true, 'results' => $rows]);
    }

    // SAVE PARTS: first_ca | second_ca | exam | comment | finalize
    if ($action === 'save_part' && $_SERVER['REQUEST_METHOD'] === 'POST') {
        $student_id = $_POST['student_id'] ?? '';
        $ad         = $_POST['admission']  ?? '';
        $sub        = $_POST['subject']    ?? '';
        $term       = $_POST['term']       ?? '';
        $session    = $_POST['session']    ?? '';
        $part       = $_POST['part']       ?? '';
        $value      = $_POST['value']      ?? '';

        if (!$student_id || !$ad || !$sub || !$term || !$session || !$part) {
            json_resp(['success' => false, 'msg' => 'Missing data']);
        }

        // fetch existing record
        $stmt = $conn->prepare("SELECT * FROM results WHERE admission_number=? AND subject=? AND term=? AND session=? LIMIT 1");
        $stmt->bind_param("ssss", $ad, $sub, $term, $session);
        $stmt->execute();
        $res = stmt_get_result($stmt);

        if ($res->num_rows > 0) {
            $row = $res->fetch_assoc();

            if ($part === 'first_ca') {
                $v = (int)$value;
                if ($v < 0 || $v > 20) json_resp(['success' => false, 'msg' => '1st Test must be 0-20']);
                $total = $v + norm_score($row['second_ca']) + norm_score($row['exam']);
                $grade = compute_grade($total);
                $upd   = $conn->prepare("UPDATE results SET first_ca=?, total=?, grade=? WHERE id=?");
                $upd->bind_param("iisi", $v, $total, $grade, $row['id']);
                $upd->execute();
                json_resp(['success' => true, 'msg' => 'First test saved', 'total' => $total, 'grade' => $grade]);
            }

            if ($part === 'second_ca') {
                $v = (int)$value;
                if ($v < 0 || $v > 20) json_resp(['success' => false, 'msg' => '2nd Test must be 0-20']);
                $total = norm_score($row['first_ca']) + $v + norm_score($row['exam']);
                $grade = compute_grade($total);
                $upd   = $conn->prepare("UPDATE results SET second_ca=?, total=?, grade=? WHERE id=?");
                $upd->bind_param("iisi", $v, $total, $grade, $row['id']);
                $upd->execute();
                json_resp(['success' => true, 'msg' => 'Second test saved', 'total' => $total, 'grade' => $grade]);
            }

            if ($part === 'exam') {
                $v = (int)$value;
                if ($v < 0 || $v > 60) json_resp(['success' => false, 'msg' => 'Exam must be 0-60']);
                if ((int)$row['second_ca'] === -1) json_resp(['success' => false, 'msg' => 'Enter 2nd test first']);
                $total = norm_score($row['first_ca']) + norm_score($row['second_ca']) + $v;
                $grade = compute_grade($total);
                $upd   = $conn->prepare("UPDATE results SET exam=?, total=?, grade=?, date_uploaded=NOW() WHERE id=?");
                $upd->bind_param("iisi", $v, $total, $grade, $row['id']);
                $upd->execute();
                json_resp(['success' => true, 'msg' => 'Exam saved', 'total' => $total, 'grade' => $grade]);
            }

            if ($part === 'finalize') {
                if ((int)$row['exam'] === -1) json_resp(['success' => false, 'msg' => 'Enter exam first']);
                $total = norm_score($row['first_ca']) + norm_score($row['second_ca']) + norm_score($row['exam']);
                $grade = compute_grade($total);
                $upd   = $conn->prepare("UPDATE results SET total=?, grade=?, date_uploaded=NOW() WHERE id=?");
                $upd->bind_param("isi", $total, $grade, $row['id']);
                $upd->execute();
                json_resp(['success' => true, 'msg' => 'Result finalized and uploaded', 'total' => $total, 'grade' => $grade]);
            }

            json_resp(['success' => false, 'msg' => 'Invalid part']);

        } else {
            // No existing record — only first_ca can create one
            if ($part === 'first_ca') {
                $v     = (int)$value;
                if ($v < 0 || $v > 20) json_resp(['success' => false, 'msg' => '1st Test must be 0-20']);
                $total  = $v;
                $grade  = compute_grade($total);
                $now    = date('Y-m-d H:i:s');
                $not_entered = -1;
                $emptyc = '';
                $ins    = $conn->prepare("INSERT INTO results (student_id, admission_number, subject, first_ca, second_ca, exam, total, grade, term, session, teacher_comment, date_uploaded) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)");
                $ins->bind_param("issiiiisssss", $student_id, $ad, $sub, $v, $not_entered, $not_entered, $total, $grade, $term, $session, $emptyc, $now);
                $ins->execute();
                json_resp(['success' => true, 'msg' => 'First test saved', 'total' => $total, 'grade' => $grade]);
            }

            json_resp(['success' => false, 'msg' => 'Record not found: save 1st test first']);
        }
    }

    // SUPERADMIN OVERRIDE: update any individual score field regardless of stage
    if ($action === 'superadmin_update' && $_SERVER['REQUEST_METHOD'] === 'POST') {
        // Only superadmins may call this action
        if (!$is_superadmin) {
            json_resp(['success' => false, 'msg' => 'Access denied: superadmin only']);
        }

        $ad      = $_POST['admission']  ?? '';
        $sub     = $_POST['subject']    ?? '';
        $term    = $_POST['term']       ?? '';
        $session = $_POST['session']    ?? '';
        $part    = $_POST['part']       ?? ''; // first_ca | second_ca | exam
        $value   = $_POST['value']      ?? '';

        if (!$ad || !$sub || !$term || !$session || !$part) {
            json_resp(['success' => false, 'msg' => 'Missing data']);
        }

        // Validate range per part
        $v = (int)$value;
        if ($part === 'first_ca'  && ($v < 0 || $v > 20)) json_resp(['success' => false, 'msg' => '1st Test must be 0–20']);
        if ($part === 'second_ca' && ($v < 0 || $v > 20)) json_resp(['success' => false, 'msg' => '2nd Test must be 0–20']);
        if ($part === 'exam'      && ($v < 0 || $v > 60)) json_resp(['success' => false, 'msg' => 'Exam must be 0–60']);
        if (!in_array($part, ['first_ca','second_ca','exam'])) json_resp(['success' => false, 'msg' => 'Invalid part']);

        // Fetch existing record
        $stmt = $conn->prepare("SELECT * FROM results WHERE admission_number=? AND subject=? AND term=? AND session=? LIMIT 1");
        $stmt->bind_param("ssss", $ad, $sub, $term, $session);
        $stmt->execute();
        $res = stmt_get_result($stmt);

        if ($res->num_rows === 0) {
            json_resp(['success' => false, 'msg' => 'No result record found to update']);
        }

        $row = $res->fetch_assoc();

        // Determine current values; treat -1 as 0 for total calc
        $first_ca  = ($part === 'first_ca')  ? $v : norm_score($row['first_ca']);
        $second_ca = ($part === 'second_ca') ? $v : norm_score($row['second_ca']);
        $exam      = ($part === 'exam')      ? $v : norm_score($row['exam']);

        // Preserve sentinel -1 for fields not yet entered (only override the edited field)
        $db_first  = ($part === 'first_ca')  ? $v : (int)$row['first_ca'];
        $db_second = ($part === 'second_ca') ? $v : (int)$row['second_ca'];
        $db_exam   = ($part === 'exam')      ? $v : (int)$row['exam'];

        $total = norm_score($db_first) + norm_score($db_second) + norm_score($db_exam);
        $grade = compute_grade($total);

        $upd = $conn->prepare("UPDATE results SET first_ca=?, second_ca=?, exam=?, total=?, grade=?, date_uploaded=NOW() WHERE id=?");
        $upd->bind_param("iiiisi", $db_first, $db_second, $db_exam, $total, $grade, $row['id']);
        $upd->execute();

        json_resp(['success' => true, 'msg' => 'Score updated by superadmin', 'total' => $total, 'grade' => $grade,
                   'first_ca' => $db_first, 'second_ca' => $db_second, 'exam' => $db_exam]);
    }

    json_resp(['success' => false, 'msg' => 'Unknown action']);
}
/* ---------------- END AJAX ---------------- */
?>
<?php include 'header.php'; ?>
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <title>Manage Results - Albayan Academy</title>
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
  <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css" rel="stylesheet">
  <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
  <style>
    :root { --primary: #1aa260; --primary-dark: #128a4f; --light: #6fe3a4; --lighter: #e6fbf0; --bg: #f3fdf8; }
    body { font-family: "Segoe UI", Roboto, system-ui, Arial; background: var(--bg); color: #224433; }
    .page-content  { padding-top: 24px; padding-bottom: 80px; margin-top: 20px; min-height: calc(100vh - 220px); }
    .container-wide { width: 99%; max-width: 99%; margin: 0 auto; }
    .card          { margin-bottom: 5px; }
    .brand-header  { color: var(--primary-dark); font-weight: 700; }
    .card-custom   { border-top: 4px solid var(--primary); border-radius: 12px; box-shadow: 0 6px 18px rgba(26,162,96,0.08); background: #fff; }
    .btn-purple    { background: var(--primary); border-color: var(--primary); color: #fff; }
    .btn-purple:hover, .btn-purple:focus { background: var(--primary-dark); border-color: var(--primary-dark); color: #fff; }
    .table-avatar img { width: 48px; height: 48px; object-fit: cover; border-radius: 8px; }
    .small-muted   { font-size: 0.85rem; color: #5a7a6a; }
    .note          { font-size: 0.9rem; color: #5a7a6a; }
    .modal .card-custom { border-top: 0; box-shadow: none; }
    .table-light th { background: var(--lighter) !important; color: var(--primary-dark); }
    .form-select:focus, .form-control:focus { border-color: var(--primary); box-shadow: 0 0 0 0.2rem rgba(26,162,96,0.15); }

    /* Active term/session badge */
    .active-badge { display: inline-block; background: var(--primary); color: #fff; border-radius: 20px; padding: 3px 14px; font-size: 0.82rem; font-weight: 600; letter-spacing: 0.5px; }

    /* Slider */
    .results-slider { width: 100%; background: linear-gradient(135deg, var(--primary), var(--primary-dark)); border-radius: 8px; padding: 8px; color: #fff; margin-bottom: 15px; }
    .slide { display: none; text-align: center; }
    .slide.active { display: block; }
    .slide h4 { font-size: 15px; margin: 4px 0; }
    .slide p  { font-size: 12px; opacity: 0.85; }
    .dots { text-align: center; margin-top: 4px; }
    .dot  { height: 6px; width: 6px; margin: 0 3px; background: rgba(255,255,255,0.5); border-radius: 50%; display: inline-block; cursor: pointer; }
    .dot.active { background: #fff; }

    @media (max-width: 576px) { .controls-row .col-auto { width: 100%; } }

    /* Superadmin override styling */
    #superadminPanel .btn-warning { background: #f0ad4e; border-color: #e09b2e; color: #333; font-size: 0.78rem; }
    #superadminPanel .btn-warning:hover { background: #e09b2e; color: #222; }
    .modal .alert-warning { border-left: 4px solid #f0ad4e; }
  </style>
</head>
<body>
<div class="page-content">
  <div class="container-wide my-4">

    <!-- Slider -->
    <div class="results-slider">
      <div class="slide active"><h4>📊 Upload Results</h4><p>Ensure all scores are entered correctly</p></div>
      <div class="slide"><h4>📈 Monitor Student Performance</h4><p>Track academic progress easily</p></div>
      <div class="slide"><h4>📝 Manage Classes Efficiently</h4><p>Select class and upload results faster</p></div>
      <div class="slide"><h4>✅ Accurate Result Entry</h4><p>Avoid mistakes while uploading scores</p></div>
      <div class="dots">
        <span class="dot active" onclick="showSlide(0)"></span>
        <span class="dot" onclick="showSlide(1)"></span>
        <span class="dot" onclick="showSlide(2)"></span>
        <span class="dot" onclick="showSlide(3)"></span>
      </div>
    </div>

    <!-- Controls card -->
    <div class="card card-custom p-3 mb-4">
      <div class="row g-2 align-items-center controls-row">
        <div class="col-md-3 col-sm-6 col-12">
          <label class="form-label small-muted mb-1">Class</label>
          <select id="classSelect" class="form-select form-select-sm">
            <option value="">-- Select Class --</option>
            <?php foreach ($all_classes as $c): ?>
              <option value="<?php echo htmlspecialchars($c); ?>"><?php echo htmlspecialchars($c); ?></option>
            <?php endforeach; ?>
          </select>
        </div>
        <div class="col-md-3 col-sm-6 col-12">
          <label class="form-label small-muted mb-1">Search (name or admission)</label>
          <input id="searchBox" class="form-control form-control-sm" placeholder="Search name or admission no">
        </div>
        <div class="col-md-2 col-sm-6 col-12">
          <label class="form-label small-muted mb-1">Page</label>
          <select id="pageSelect" class="form-select form-select-sm"></select>
        </div>
        <div class="col-md-2 col-sm-6 col-12 d-flex align-items-end">
          <button id="loadBtn" class="btn btn-purple btn-sm w-100"><i class="fa fa-list"></i> Load Students</button>
        </div>
        <div class="col-md-2 col-sm-12 col-12 d-flex align-items-end justify-content-end">
          <div class="text-end small-muted"><div>50 students per page</div></div>
        </div>
      </div>
    </div>

    <!-- Students table -->
    <div id="studentsArea" class="card card-custom p-2">
      <div id="studentsNote" class="p-3">
        <p class="note mb-0">Select a class and click <strong>Load Students</strong> to fetch students.</p>
      </div>
      <div id="studentsTableWrap" class="table-responsive" style="display:none;">
        <table id="studentsTable" class="table table-hover align-middle mb-0">
          <thead class="table-light">
            <tr>
              <th class="text-center">#</th><th>Photo</th><th>Admission No</th>
              <th>Full Name</th><th>Class</th><th class="text-center">Actions</th>
            </tr>
          </thead>
          <tbody></tbody>
        </table>
      </div>
      <div id="pagination" class="mt-3 d-flex justify-content-center"></div>
    </div>
  </div>

  <!-- ===================== ADD RESULT MODAL ===================== -->
  <div class="modal fade" id="addModal" tabindex="-1" aria-hidden="true">
    <div class="modal-dialog modal-dialog-centered modal-lg">
      <div class="modal-content card-custom">
        <div class="modal-header">
          <h5 class="modal-title brand-header">Add / Edit Result
            <?php if ($is_superadmin): ?>
              <span class="badge ms-2" style="background:#f0ad4e;color:#333;font-size:0.7rem;vertical-align:middle;"><i class="fa fa-shield-alt"></i> Headmaster</span>
            <?php endif; ?>
          </h5>
          <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
        </div>
        <div class="modal-body">
          <!-- Student info -->
          <div class="d-flex gap-3 mb-3 align-items-center">
            <img id="addPhoto" src="image/default.png" alt="photo" style="width:70px;height:70px;object-fit:cover;border-radius:8px;">
            <div>
              <div id="addName"  class="fw-bold"></div>
              <div id="addAdm"   class="small-muted"></div>
              <div id="addClass" class="small-muted"></div>
            </div>
          </div>

          <!-- Session / Term — fetched automatically from the database (active record), no manual selection needed -->
          <input type="hidden" id="addSession" value="<?php echo htmlspecialchars($active_session); ?>">
          <input type="hidden" id="addTerm"    value="<?php echo htmlspecialchars($active_term); ?>">

          <div class="row gy-2 mb-3 align-items-end">
            <div class="col-md-8">
              <div class="small-muted mb-1">Current Session &amp; Term</div>
              <span class="active-badge">📅 <?php echo htmlspecialchars($active_session ?: 'No active session'); ?></span>
              <span class="active-badge ms-2">📋 <?php echo htmlspecialchars($active_term ?: 'No active term'); ?></span>
            </div>
            <div class="col-md-4">
              <label class="form-label small-muted">Subject</label>
              <select id="addSubject" class="form-select form-select-sm">
                <option value="">-- Select Subject --</option>
                <?php foreach ($all_subjects as $s): ?>
                  <option value="<?php echo htmlspecialchars($s); ?>"><?php echo htmlspecialchars($s); ?></option>
                <?php endforeach; ?>
              </select>
            </div>
          </div>

          <!-- Spinner / existing info -->
          <div id="spinner" class="text-center text-muted my-2" style="display:none;"><i class="fa fa-spinner fa-spin"></i> Checking existing result...</div>
          <div id="existingBox" class="mb-2"></div>

          <!-- Score inputs -->
          <div class="d-flex gap-2 align-items-center mb-3">
            <input id="firstInput"  type="number" min="0" max="20" class="form-control form-control-sm" placeholder="1st Test (20)" disabled>
            <input id="secondInput" type="number" min="0" max="20" class="form-control form-control-sm" placeholder="2nd Test (20)" disabled>
            <input id="examInput"   type="number" min="0" max="60" class="form-control form-control-sm" placeholder="Exam (60)"     disabled>
          </div>
        </div><!-- /.modal-body -->

        <div class="modal-footer">
          <div class="me-auto small-muted" id="addMsg"></div>
          <button id="save1Btn"     class="btn btn-purple btn-sm">Save 1st</button>
          <button id="save2Btn"     class="btn btn-purple btn-sm">Save 2nd</button>
          <button id="saveExamBtn"  class="btn btn-purple btn-sm">Save Exam</button>
        </div>
      </div>
    </div>
  </div>

  <!-- ===================== VIEW RESULTS MODAL ===================== -->
  <div class="modal fade" id="viewModal" tabindex="-1" aria-hidden="true">
    <div class="modal-dialog modal-dialog-centered modal-lg">
      <div class="modal-content card-custom">
        <div class="modal-header" style="border-bottom:0;">
          <h5 class="modal-title brand-header">View Uploaded Results</h5>
          <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
        </div>
        <div class="modal-body">
          <div class="d-flex gap-3 mb-3 align-items-center">
            <img id="viewPhoto" src="image/default.png" alt="photo" style="width:70px;height:70px;object-fit:cover;border-radius:8px;">
            <div>
              <div id="viewName" class="fw-bold"></div>
              <div id="viewAdm"  class="small-muted"></div>
            </div>
          </div>

          <!-- Session / Term — populated from DB, active values pre-selected -->
          <div class="row gy-2 align-items-end">
            <div class="col-md-4">
              <label class="form-label small-muted">Session</label>
              <select id="viewSession" class="form-select form-select-sm">
                <?php foreach ($all_sessions as $s): ?>
                  <option value="<?php echo htmlspecialchars($s); ?>"
                    <?php echo ($s === $active_session) ? 'selected' : ''; ?>>
                    <?php echo htmlspecialchars($s); ?>
                  </option>
                <?php endforeach; ?>
              </select>
            </div>
            <div class="col-md-4">
              <label class="form-label small-muted">Term</label>
              <select id="viewTerm" class="form-select form-select-sm">
                <?php foreach ($all_terms as $t): ?>
                  <option value="<?php echo htmlspecialchars($t); ?>"
                    <?php echo ($t === $active_term) ? 'selected' : ''; ?>>
                    <?php echo htmlspecialchars($t); ?>
                  </option>
                <?php endforeach; ?>
              </select>
            </div>
            <div class="col-md-4 text-end">
              <button id="viewLoadBtn" class="btn btn-purple btn-sm">Load Results</button>
            </div>
          </div>

          <div id="viewResultsArea" class="mt-3" style="max-height:420px; overflow:auto;"></div>

          <div class="mt-3">
            <div id="sumTotals" class="small-muted mb-2"></div>
          </div>
        </div>
      </div>
    </div>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
  <script>
  /* ===== Superadmin flag (set by PHP) ===== */
  const IS_SUPERADMIN = <?php echo $is_superadmin ? 'true' : 'false'; ?>;
  /* ===== Slider ===== */
  let currentSlide = 0;
  const slides = document.querySelectorAll('.slide');
  const dots   = document.querySelectorAll('.dot');
  function showSlide(index) {
    slides.forEach((s, i) => { s.classList.remove('active'); dots[i].classList.remove('active'); });
    slides[index].classList.add('active');
    dots[index].classList.add('active');
    currentSlide = index;
  }
  setInterval(() => { currentSlide = (currentSlide + 1) % slides.length; showSlide(currentSlide); }, 4000);

  /* ===== DOM refs ===== */
  const studentsTableBody = document.querySelector('#studentsTable tbody');
  const studentsTableWrap = document.getElementById('studentsTableWrap');
  const studentsNote      = document.getElementById('studentsNote');
  const classSelect       = document.getElementById('classSelect');
  const pageSelect        = document.getElementById('pageSelect');
  const searchBox         = document.getElementById('searchBox');
  const loadBtn           = document.getElementById('loadBtn');
  const paginationDiv     = document.getElementById('pagination');

  let currentClass  = '';
  let currentPage   = 1;
  let totalStudents = 0;
  let perPage       = 50;
  let studentsCache = [];

  const bsAddModal  = new bootstrap.Modal(document.getElementById('addModal'));
  const bsViewModal = new bootstrap.Modal(document.getElementById('viewModal'));

  /* Add modal refs */
  const addPhoto    = document.getElementById('addPhoto');
  const addName     = document.getElementById('addName');
  const addAdm      = document.getElementById('addAdm');
  const addClass    = document.getElementById('addClass');
  const addSession  = document.getElementById('addSession');
  const addTerm     = document.getElementById('addTerm');
  const addSubject  = document.getElementById('addSubject');
  const firstInput  = document.getElementById('firstInput');
  const secondInput = document.getElementById('secondInput');
  const examInput   = document.getElementById('examInput');
  const spinner     = document.getElementById('spinner');
  const existingBox = document.getElementById('existingBox');
  const addMsg      = document.getElementById('addMsg');
  const save1Btn    = document.getElementById('save1Btn');
  const save2Btn    = document.getElementById('save2Btn');
  const saveExamBtn = document.getElementById('saveExamBtn');

  /* View modal refs */
  const viewPhoto          = document.getElementById('viewPhoto');
  const viewName           = document.getElementById('viewName');
  const viewAdm            = document.getElementById('viewAdm');
  const viewSession        = document.getElementById('viewSession');
  const viewTerm           = document.getElementById('viewTerm');
  const viewResultsArea    = document.getElementById('viewResultsArea');
  const viewLoadBtn        = document.getElementById('viewLoadBtn');
  const sumTotals          = document.getElementById('sumTotals');

  let activeStudent = null;

  /* ===== Load students ===== */
  async function loadStudents(cls = '', page = 1) {
    if (!cls) {
      studentsTableWrap.style.display = 'none';
      studentsNote.style.display = 'block';
      studentsNote.innerHTML = '<p class="note mb-0">Select a class and click <strong>Load Students</strong>.</p>';
      return;
    }
    studentsNote.style.display = 'none';
    studentsTableWrap.style.display = 'block';
    studentsTableBody.innerHTML = '<tr><td colspan="6" class="text-center">Loading...</td></tr>';
    try {
      const res = await fetch(`?action=get_students&class=${encodeURIComponent(cls)}&page=${page}`);
      const j   = await res.json();
      if (!j.success) {
        studentsTableBody.innerHTML = `<tr><td colspan="6" class="text-center text-danger">${j.msg || 'Failed'}</td></tr>`;
        return;
      }
      studentsCache = j.students;
      totalStudents = j.total;
      perPage       = j.limit;
      renderStudentsTable();
      renderPagination();
    } catch (e) {
      studentsTableBody.innerHTML = '<tr><td colspan="6" class="text-center text-danger">Error fetching students</td></tr>';
      console.error(e);
    }
  }

  function renderStudentsTable() {
    const q = searchBox.value.trim().toLowerCase();
    const rows = studentsCache.filter(s => !q
      || (s.full_name && s.full_name.toLowerCase().includes(q))
      || (s.admission_number && s.admission_number.toLowerCase().includes(q)));
    if (!rows.length) {
      studentsTableBody.innerHTML = '<tr><td colspan="6" class="text-center">No students found</td></tr>';
      return;
    }
    studentsTableBody.innerHTML = '';
    rows.forEach((s, idx) => {
      const tr = document.createElement('tr');
      tr.innerHTML = `
        <td class="text-center">${idx + 1}</td>
        <td class="table-avatar"><img src="${escapeHtml(s.photo)}" alt="photo"></td>
        <td>${escapeHtml(s.admission_number)}</td>
        <td>${escapeHtml(s.full_name)}</td>
        <td>${escapeHtml(s.class)}</td>
        <td class="text-center">
          <button class="btn btn-sm btn-outline-primary me-1 btn-view"
            data-ad="${escapeHtml(s.admission_number)}"><i class="fa fa-eye"></i></button>
          <button class="btn btn-sm btn-outline-success btn-add"
            data-id="${escapeHtml(s.id)}"
            data-ad="${escapeHtml(s.admission_number)}"
            data-name="${escapeHtml(s.full_name)}"
            data-photo="${escapeHtml(s.photo)}"
            data-class="${escapeHtml(s.class)}"><i class="fa fa-plus"></i></button>
        </td>`;
      studentsTableBody.appendChild(tr);
    });
    document.querySelectorAll('.btn-add').forEach(b => {
      b.addEventListener('click', () => openAddModal({
        id: b.getAttribute('data-id'),
        admission_number: b.getAttribute('data-ad'),
        full_name:  b.getAttribute('data-name'),
        photo:      b.getAttribute('data-photo'),
        class:      b.getAttribute('data-class')
      }));
    });
    document.querySelectorAll('.btn-view').forEach(b => {
      b.addEventListener('click', () => {
        const ad = b.getAttribute('data-ad');
        openViewModal(studentsCache.find(x => x.admission_number === ad));
      });
    });
  }

  /* ===== Pagination ===== */
  function renderPagination() {
    const pages = Math.max(1, Math.ceil(totalStudents / perPage));
    pageSelect.innerHTML = '';
    for (let p = 1; p <= pages; p++) {
      const opt = document.createElement('option');
      opt.value = p; opt.text = p;
      if (p === currentPage) opt.selected = true;
      pageSelect.appendChild(opt);
    }
    paginationDiv.innerHTML = `
      <div class="btn-group btn-group-sm">
        <button id="prevPage" class="btn btn-light ${currentPage <= 1 ? 'disabled' : ''}"><i class="fa fa-chevron-left"></i></button>
        <button id="nextPage" class="btn btn-light ${currentPage >= pages ? 'disabled' : ''}"><i class="fa fa-chevron-right"></i></button>
      </div>
      <div class="ms-2 align-self-center small-muted">Page ${currentPage} of ${pages} — ${totalStudents} students</div>`;
    document.getElementById('prevPage').addEventListener('click', () => {
      if (currentPage > 1) { currentPage--; loadStudents(currentClass, currentPage); }
    });
    document.getElementById('nextPage').addEventListener('click', () => {
      if (currentPage < pages) { currentPage++; loadStudents(currentClass, currentPage); }
    });
  }

  /* ===== Events ===== */
  loadBtn.addEventListener('click', () => {
    currentClass = classSelect.value.trim();
    currentPage  = parseInt(pageSelect.value) || 1;
    loadStudents(currentClass, currentPage);
  });
  pageSelect.addEventListener('change', () => { currentPage = parseInt(pageSelect.value) || 1; loadStudents(currentClass, currentPage); });
  searchBox.addEventListener('input', renderStudentsTable);

  /* ===== Add Modal ===== */
  function openAddModal(student) {
    activeStudent         = student;
    addPhoto.src          = student.photo || 'image/default.png';
    addName.textContent   = student.full_name || '';
    addAdm.textContent    = student.admission_number || '';
    addClass.textContent  = student.class || '';
    addMsg.textContent    = '';
    existingBox.innerHTML = '';
    firstInput.value = ''; secondInput.value = ''; examInput.value = '';
    firstInput.disabled = true; secondInput.disabled = true; examInput.disabled = true;
    addSubject.value = '';
    bsAddModal.show();
  }

  addSubject.addEventListener('change', checkExistingResult);

  /* Apply the current stage of data entry: only the next un-saved score
     input is enabled at any time. -1 in second_ca/exam means "not yet
     entered", which lets a real score of 0 be saved and recognised.
     SUPERADMIN: all fields are unlocked regardless of stage, and a
     dedicated "Override" save button is shown for each field. */
  function applyStage(result) {
    // Remove any previous superadmin override panel
    const prevPanel = document.getElementById('superadminPanel');
    if (prevPanel) prevPanel.remove();

    if (!result) {
      // Stage 1: no record yet — only the 1st test can be entered
      firstInput.value = ''; secondInput.value = ''; examInput.value = '';
      firstInput.disabled = false; secondInput.disabled = true; examInput.disabled = true;
      existingBox.innerHTML = '<div class="small-muted">No existing result. Enter and save the 1st test to begin.</div>';

      // Superadmin: no override panel until a record exists
      if (IS_SUPERADMIN) {
        existingBox.innerHTML += '<div class="alert alert-warning p-2 mt-2 small-muted"><i class="fa fa-shield-alt"></i> <strong>Headmaster:</strong> Save the 1st test to create a record, then the override controls will appear.</div>';
      }
      return;
    }

    const firstVal  = parseInt(result.first_ca);
    const secondVal = parseInt(result.second_ca);
    const examVal   = parseInt(result.exam);

    firstInput.value = firstVal;

    if (IS_SUPERADMIN) {
      // ── SUPERADMIN MODE: unlock all fields, show override buttons ──
      secondInput.value = (secondVal === -1) ? '' : secondVal;
      examInput.value   = (examVal   === -1) ? '' : examVal;

      firstInput.disabled  = false;
      secondInput.disabled = false;
      examInput.disabled   = false;

      const completedParts = [];
      if (firstVal  >= 0)            completedParts.push(`1st CA: <strong>${firstVal}</strong>`);
      if (secondVal !== -1)          completedParts.push(`2nd CA: <strong>${secondVal}</strong>`);
      if (examVal   !== -1)          completedParts.push(`Exam: <strong>${examVal}</strong>`);
      if (result.total !== undefined) completedParts.push(`Total: <strong>${result.total}</strong>`, `Grade: <strong>${result.grade}</strong>`);

      existingBox.innerHTML = `
        <div class="alert alert-warning p-2 mb-2 small-muted">
          <i class="fa fa-shield-alt"></i> <strong>Superadmin Override Mode</strong>
          — all score fields are editable. ${completedParts.length ? 'Current: ' + completedParts.join(', ') + '.' : ''}
        </div>`;

      // Build per-field override save buttons
      const panel = document.createElement('div');
      panel.id = 'superadminPanel';
      panel.className = 'd-flex gap-2 align-items-center mt-2';
      panel.innerHTML = `
        <button id="saOverride1"   class="btn btn-warning btn-sm"><i class="fa fa-pen"></i> Override 1st</button>
        <button id="saOverride2"   class="btn btn-warning btn-sm"><i class="fa fa-pen"></i> Override 2nd</button>
        <button id="saOverrideExam" class="btn btn-warning btn-sm"><i class="fa fa-pen"></i> Override Exam</button>
        <span id="saMsg" class="small-muted ms-2"></span>`;
      existingBox.appendChild(panel);

      async function doOverride(part, inputEl) {
        const v = inputEl.value;
        if (v === '' || isNaN(v)) { toast(`Enter a value for ${part}`, 'warning'); return; }
        document.getElementById('saMsg').textContent = 'Saving…';
        const data = new FormData();
        data.append('admission', activeStudent.admission_number);
        data.append('subject',   addSubject.value);
        data.append('term',      addTerm.value);
        data.append('session',   addSession.value);
        data.append('part',      part);
        data.append('value',     v);
        try {
          const j = await (await fetch('?action=superadmin_update', { method: 'POST', body: data })).json();
          document.getElementById('saMsg').textContent = '';
          if (j.success) { toast(j.msg || 'Override saved', 'success'); checkExistingResult(); }
          else            { toast(j.msg || 'Error',          'error'); }
        } catch (e) { console.error(e); toast('Network error', 'error'); }
      }

      document.getElementById('saOverride1').addEventListener('click',   () => doOverride('first_ca',  firstInput));
      document.getElementById('saOverride2').addEventListener('click',   () => doOverride('second_ca', secondInput));
      document.getElementById('saOverrideExam').addEventListener('click',() => doOverride('exam',      examInput));

    } else {
      // ── NORMAL MODE: sequential stage gating ──
      if (secondVal === -1) {
        // Stage 2: 1st test saved — only the 2nd test can be entered
        secondInput.value = ''; examInput.value = '';
        firstInput.disabled = true; secondInput.disabled = false; examInput.disabled = true;
        existingBox.innerHTML = `<div class="alert alert-info p-2 mb-2 small-muted">1st Test saved: ${firstVal}. Now enter the 2nd test.</div>`;
      } else if (examVal === -1) {
        // Stage 3: 1st & 2nd test saved — only the exam can be entered
        secondInput.value = secondVal; examInput.value = '';
        firstInput.disabled = true; secondInput.disabled = true; examInput.disabled = false;
        existingBox.innerHTML = `<div class="alert alert-info p-2 mb-2 small-muted">1st Test: ${firstVal}, 2nd Test: ${secondVal}. Now enter the exam score.</div>`;
      } else {
        // Stage 4: everything saved — record complete
        secondInput.value = secondVal; examInput.value = examVal;
        firstInput.disabled = true; secondInput.disabled = true; examInput.disabled = true;
        existingBox.innerHTML = `<div class="alert alert-success p-2 mb-2 small-muted">Completed — 1st CA: ${firstVal}, 2nd CA: ${secondVal}, Exam: ${examVal}, Total: ${result.total}, Grade: ${result.grade}</div>`;
      }
    }
  }

  async function checkExistingResult() {
    const sub     = addSubject.value;
    const term    = addTerm.value;
    const session = addSession.value;
    if (!sub || !activeStudent) {
      existingBox.innerHTML = '';
      firstInput.disabled = true; secondInput.disabled = true; examInput.disabled = true;
      return;
    }
    spinner.style.display = 'block';
    existingBox.innerHTML = '';
    try {
      const url = `?action=get_result&admission=${encodeURIComponent(activeStudent.admission_number)}&subject=${encodeURIComponent(sub)}&term=${encodeURIComponent(term)}&session=${encodeURIComponent(session)}`;
      const j   = await (await fetch(url)).json();
      spinner.style.display = 'none';
      applyStage(j.success && j.exists ? j.result : null);
    } catch (e) {
      spinner.style.display = 'none';
      existingBox.innerHTML = '<div class="text-danger small">Error checking existing result.</div>';
      console.error(e);
    }
  }

  /* Post save_part — student_id is now included */
  async function postSavePart(part, value) {
    if (!activeStudent) return;
    const data = new FormData();
    data.append('student_id', activeStudent.id);           // FIXED: was missing in original
    data.append('admission',  activeStudent.admission_number);
    data.append('subject',    addSubject.value);
    data.append('term',       addTerm.value);
    data.append('session',    addSession.value);
    data.append('part',       part);
    data.append('value',      value);
    try {
      return await (await fetch('?action=save_part', { method: 'POST', body: data })).json();
    } catch (e) { console.error(e); return { success: false, msg: 'Network error' }; }
  }

  function showMsg(text, color) { addMsg.textContent = text; addMsg.style.color = color; }

  function toast(message, icon = 'success') {
    Swal.fire({
      toast: true,
      position: 'top-end',
      icon: icon,
      title: message,
      showConfirmButton: false,
      timer: 2200,
      timerProgressBar: true
    });
  }

  save1Btn.addEventListener('click', async () => {
    const v = firstInput.value;
    if (v === '' || isNaN(v)) { toast('Enter 1st test value', 'warning'); return; }
    showMsg('Saving...', 'var(--primary)');
    const j = await postSavePart('first_ca', v);
    if (j.success) { showMsg(j.msg || 'Saved', 'green'); toast(j.msg || 'Saved', 'success'); checkExistingResult(); }
    else { showMsg(j.msg || 'Error', 'red'); toast(j.msg || 'Error', 'error'); }
  });

  save2Btn.addEventListener('click', async () => {
    const v = secondInput.value;
    if (v === '' || isNaN(v)) { toast('Enter 2nd test value', 'warning'); return; }
    showMsg('Saving...', 'var(--primary)');
    const j = await postSavePart('second_ca', v);
    if (j.success) { showMsg(j.msg || 'Saved', 'green'); toast(j.msg || 'Saved', 'success'); checkExistingResult(); }
    else { showMsg(j.msg || 'Error', 'red'); toast(j.msg || 'Error', 'error'); }
  });

  saveExamBtn.addEventListener('click', async () => {
    const v = examInput.value;
    if (v === '' || isNaN(v)) { toast('Enter exam value', 'warning'); return; }
    showMsg('Saving...', 'var(--primary)');
    const j = await postSavePart('exam', v);
    if (j.success) { showMsg(j.msg || 'Saved', 'green'); toast('Result completed and saved', 'success'); checkExistingResult(); }
    else { showMsg(j.msg || 'Error', 'red'); toast(j.msg || 'Error', 'error'); }
  });

  /* ===== View Modal ===== */
  function openViewModal(student) {
    activeStudent            = student;
    viewPhoto.src            = student.photo || 'image/default.png';
    viewName.textContent     = student.full_name || '';
    viewAdm.textContent      = student.admission_number || '';
    viewResultsArea.innerHTML = '';
    sumTotals.textContent    = '';
    bsViewModal.show();
  }

  viewLoadBtn.addEventListener('click', async () => {
    if (!activeStudent) return;
    viewResultsArea.innerHTML = '<div class="text-center small-muted">Loading results...</div>';
    const url = `?action=view_results&admission=${encodeURIComponent(activeStudent.admission_number)}&term=${encodeURIComponent(viewTerm.value)}&session=${encodeURIComponent(viewSession.value)}`;
    try {
      const j = await (await fetch(url)).json();
      if (!j.success) { viewResultsArea.innerHTML = `<div class="text-danger">${j.msg || 'Failed'}</div>`; return; }
      renderViewResults(j.results || []);
    } catch (e) { viewResultsArea.innerHTML = '<div class="text-danger">Error fetching results</div>'; console.error(e); }
  });

  function renderViewResults(rows) {
    if (!rows.length) { viewResultsArea.innerHTML = '<div class="small-muted">No results found.</div>'; sumTotals.textContent = ''; return; }
    let html = `<div class="table-responsive"><table class="table table-sm table-bordered">
      <thead class="table-light"><tr><th>Subject</th><th>1st CA</th><th>2nd CA</th><th>Exam</th><th>Total</th><th>Grade</th></tr></thead><tbody>`;
    let tot = 0;
    rows.forEach(r => {
      const sca = (parseInt(r.second_ca) === -1) ? '—' : escapeHtml(r.second_ca);
      const exa = (parseInt(r.exam) === -1) ? '—' : escapeHtml(r.exam);
      html += `<tr>
        <td>${escapeHtml(r.subject)}</td><td>${escapeHtml(r.first_ca)}</td>
        <td>${sca}</td><td>${exa}</td>
        <td>${escapeHtml(r.total)}</td><td>${escapeHtml(r.grade)}</td></tr>`;
      tot += parseInt(r.total || 0);
    });
    html += '</tbody></table></div>';
    viewResultsArea.innerHTML = html;
    sumTotals.textContent = `Sum of displayed subject totals: ${tot}`;
  }

  /* ===== Utility ===== */
  function escapeHtml(str) {
    if (str == null) return '';
    return String(str).replace(/[&<>"']/g, m => ({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[m]));
  }
  </script>
</div>
<?php include 'footer.php'; ?>
</body>
</html>
