<?php
session_start();
if (!isset($_SESSION['admin_logged_in'])) { header('Location: ../index.php'); exit(); }
if (file_exists(__DIR__ . '/../../db.php')) {
    require_once __DIR__ . '/../../db.php';
} elseif (file_exists(__DIR__ . '/../db.php')) {
    require_once __DIR__ . '/../db.php';
}

if (file_exists(__DIR__ . '/../../result_db_setup.php')) {
    require_once __DIR__ . '/../../result_db_setup.php';
} elseif (file_exists(__DIR__ . '/../result_db_setup.php')) {
    require_once __DIR__ . '/../result_db_setup.php';
} elseif (file_exists(__DIR__ . '/result_db_setup.php')) {
    require_once __DIR__ . '/result_db_setup.php';
}
setupResultTables($conn);

$msg = ''; $err = '';

// ---- SAVE MARKS (AJAX POST) ----
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax_save'])) {
    header('Content-Type: application/json');
    $student_id = intval($_POST['student_id']);
    $exam_structure_id = intval($_POST['exam_structure_id']);
    $marks = trim($_POST['marks']);
    $status = 'present';

    if (strtoupper($marks) === 'AB') { $status='absent'; $marks_val=null; }
    elseif (strtoupper($marks) === 'ML') { $status='medical'; $marks_val=null; }
    elseif (strtoupper($marks) === 'EX') { $status='exempted'; $marks_val=null; }
    else { $marks_val = is_numeric($marks) ? floatval($marks) : null; }

    // Validate max marks
    $max = floatval($conn->query("SELECT max_marks FROM result_exam_structure WHERE id=$exam_structure_id")->fetch_assoc()['max_marks'] ?? 100);
    if ($marks_val !== null && $marks_val > $max) {
        echo json_encode(['success'=>false,'msg'=>"Marks cannot exceed $max"]);
        exit;
    }

    $entered_by = $_SESSION['admin_user'] ?? 'Admin';
    $conn->query("INSERT INTO result_marks (student_id,exam_structure_id,marks_obtained,status,entered_by) 
                  VALUES ($student_id,$exam_structure_id,".($marks_val!==null?$marks_val:'NULL').",'$status','$entered_by')
                  ON DUPLICATE KEY UPDATE marks_obtained=".($marks_val!==null?$marks_val:'NULL').",status='$status',entered_by='$entered_by',updated_at=NOW()");
    echo json_encode(['success'=>true,'msg'=>'Saved']);
    exit;
}

// Filters
$selected_class = intval($_GET['class_id'] ?? 0);
$selected_term  = intval($_GET['term_id'] ?? 0);

$classes = $conn->query("SELECT rc.*, rs.session_name FROM result_classes rc JOIN result_sessions rs ON rc.session_id=rs.id ORDER BY rs.is_active DESC, rc.numeric_level, rc.section");
$terms   = $conn->query("SELECT rt.*, rs.session_name FROM result_terms rt JOIN result_sessions rs ON rt.session_id=rs.id ORDER BY rs.is_active DESC, rt.display_order");

$students = [];
$exam_structures = [];
$subject_cols = [];

if ($selected_class && $selected_term) {
    // Get students
    $stu_res = $conn->query("SELECT id, first_name, last_name, admission_no, roll_no FROM result_students WHERE class_id=$selected_class AND is_active=1 ORDER BY roll_no, first_name");
    while($s = $stu_res->fetch_assoc()) $students[] = $s;

    // Get exam structures for this class + term
    $es_res = $conn->query("SELECT es.*, s.subject_name, s.grading_type, s.is_scholastic 
                             FROM result_exam_structure es 
                             JOIN result_subjects s ON es.subject_id=s.id
                             WHERE es.term_id=$selected_term AND es.class_id=$selected_class
                             ORDER BY s.subject_name, es.component_name");
    while($e = $es_res->fetch_assoc()) {
        $exam_structures[$e['id']] = $e;
        $key = $e['subject_name'].($e['component_name'] ? ' ('.$e['component_name'].')' : '');
        $subject_cols[$e['id']] = ['label'=>$key,'max'=>$e['max_marks'],'type'=>$e['grading_type']];
    }

    // Get existing marks
    if (!empty($students) && !empty($exam_structures)) {
        $es_ids = implode(',',array_keys($exam_structures));
        $s_ids  = implode(',',array_column($students,'id'));
        $marks_res = $conn->query("SELECT student_id,exam_structure_id,marks_obtained,status FROM result_marks WHERE student_id IN($s_ids) AND exam_structure_id IN($es_ids)");
        while($m = $marks_res->fetch_assoc()) {
            $marks_map[$m['student_id']][$m['exam_structure_id']] = $m;
        }
    }
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Marks Entry | Result System</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css">
    <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
    <style>
        :root { --primary:#0b3b60; --accent:#f5a623; --dark:#1e293b; --sidebar-w:260px; }
        body { background:#f0f4f8; font-family:'Inter',sans-serif; }
        .sidebar { position:fixed;top:0;left:0;height:100vh;width:var(--sidebar-w);background:linear-gradient(180deg,#0f172a,#1e293b);overflow-y:auto;z-index:1000; }
        .sidebar-brand { padding:22px 20px;border-bottom:1px solid rgba(255,255,255,0.08); }
        .sidebar-brand h5 { color:#fff;font-weight:700;margin:0;font-size:15px; }
        .sidebar-brand small { color:var(--accent);font-size:11px; }
        .sidebar-section { padding:8px 16px 4px;font-size:10px;color:rgba(255,255,255,0.35);text-transform:uppercase;letter-spacing:1.2px;font-weight:600;margin-top:8px; }
        .sidebar a { display:flex;align-items:center;gap:10px;color:rgba(255,255,255,0.65);text-decoration:none;padding:10px 20px;font-size:13.5px;transition:0.2s;border-left:3px solid transparent; }
        .sidebar a:hover,.sidebar a.active { color:#fff;background:rgba(255,255,255,0.07);border-left-color:var(--accent); }
        .sidebar a i { width:18px;text-align:center; }
        .main { margin-left:var(--sidebar-w);padding:30px;min-height:100vh; }
        .topbar { display:flex;justify-content:space-between;align-items:center;background:#fff;padding:14px 24px;border-radius:12px;box-shadow:0 2px 12px rgba(0,0,0,0.06);margin-bottom:24px; }
        .topbar h4 { margin:0;font-weight:700;color:var(--dark);font-size:18px; }
        .filter-card { background:#fff;border-radius:12px;padding:20px 24px;box-shadow:0 2px 12px rgba(0,0,0,0.05);margin-bottom:20px; }
        /* SPREADSHEET GRID */
        .marks-table-wrap { background:#fff;border-radius:12px;box-shadow:0 2px 12px rgba(0,0,0,0.05);overflow:auto; }
        .marks-table { border-collapse:collapse; min-width:100%; font-size:12.5px; }
        .marks-table th { background:var(--dark);color:#fff;padding:10px 12px;text-align:center;white-space:nowrap;font-size:11px;font-weight:600;position:sticky;top:0;z-index:5; }
        .marks-table th.subject-header { background:#0b3b60;font-size:10.5px; }
        .marks-table th.max-row { background:#374151;font-size:10px;color:#9ca3af; }
        .marks-table td { padding:3px 5px;border:1px solid #e2e8f0;text-align:center; }
        .marks-table td.sno { background:#f8fafc;font-size:12px;color:#64748b;font-weight:600;padding:8px;white-space:nowrap; }
        .marks-table td.student-name { background:#f8fafc;text-align:left;padding:8px 12px;min-width:160px;font-weight:500; }
        .marks-input {
            width:68px; border:1.5px solid transparent; border-radius:6px;
            padding:5px 4px; text-align:center; font-size:13px;
            background:#f0fdf4; outline:none; transition:0.2s;
        }
        .marks-input:focus { border-color:var(--primary);background:#fff;box-shadow:0 0 0 3px rgba(11,59,96,0.1); }
        .marks-input.saved { background:#dcfce7;border-color:#10b981; }
        .marks-input.error-mark { background:#fee2e2;border-color:#ef4444; }
        .marks-input.absent { background:#fef3c7;color:#92400e; }
        .total-cell { background:#eff6ff;font-weight:700;color:#1d4ed8; }
        .pct-cell { background:#f0fdf4;font-weight:600;color:#059669; }
        .grade-cell { font-weight:700; }
        .badge-ab { background:#fef3c7;color:#92400e;padding:3px 7px;border-radius:5px;font-size:10px; }
        .legend { font-size:11px;color:#64748b; }
        .saving-indicator { position:fixed;bottom:20px;right:20px;background:var(--primary);color:#fff;padding:8px 16px;border-radius:8px;font-size:12px;display:none;z-index:9999; }
    </style>
</head>
<body>
<div class="sidebar">
    <div class="sidebar-brand"><h5><i class="fas fa-graduation-cap me-2" style="color:var(--accent)"></i>Result System</h5><small>BS Public School</small></div>
    <div class="sidebar-section">Main</div>
    <a href="dashboard.php"><i class="fas fa-tachometer-alt"></i> Dashboard</a>
    <a href="../dashboard.php"><i class="fas fa-arrow-left"></i> Back to Admin</a>
    <div class="sidebar-section">Setup</div>
    <a href="sessions.php"><i class="fas fa-calendar-alt"></i> Sessions</a>
    <a href="classes.php"><i class="fas fa-chalkboard"></i> Classes</a>
    <a href="subjects.php"><i class="fas fa-book"></i> Subjects</a>
    <a href="class_subjects.php"><i class="fas fa-link"></i> Class-Subject Map</a>
    <a href="terms.php"><i class="fas fa-list-ol"></i> Exam Terms</a>
    <a href="exam_structure.php"><i class="fas fa-sitemap"></i> Exam Structure</a>
    <a href="grading.php"><i class="fas fa-star"></i> Grading Scale</a>
    <div class="sidebar-section">Students</div>
    <a href="students.php"><i class="fas fa-user-graduate"></i> Manage Students</a>
    <div class="sidebar-section">Marks</div>
    <a href="marks_entry.php" class="active"><i class="fas fa-pen-to-square"></i> Marks Entry</a>
    <a href="attendance.php"><i class="fas fa-calendar-check"></i> Attendance</a>
    <a href="coscholastic.php"><i class="fas fa-palette"></i> Co-Scholastic</a>
    <a href="remarks.php"><i class="fas fa-comment-dots"></i> Remarks</a>
    <div class="sidebar-section">Reports</div>
    <a href="report_card.php"><i class="fas fa-file-invoice"></i> Report Cards</a>
    <a href="analytics.php"><i class="fas fa-chart-bar"></i> Analytics</a>
    <div style="padding:16px 20px;margin-top:20px;"><a href="../logout.php" class="btn btn-outline-danger w-100 btn-sm"><i class="fas fa-sign-out-alt me-1"></i>Logout</a></div>
</div>

<div class="main">
    <div class="topbar">
        <h4><i class="fas fa-pen-to-square me-2" style="color:var(--primary)"></i>Marks Entry — Spreadsheet Mode</h4>
        <div class="d-flex gap-2">
            <span class="badge bg-success align-self-center" id="save-status">Auto-save ON</span>
        </div>
    </div>

    <!-- FILTER -->
    <div class="filter-card">
        <form method="GET" class="row g-3 align-items-end">
            <div class="col-md-4">
                <label class="form-label fw-600 mb-1" style="font-size:13px;font-weight:600">Select Class & Section</label>
                <select name="class_id" class="form-select form-select-sm" required>
                    <option value="">-- Choose Class --</option>
                    <?php while($c=$classes->fetch_assoc()): ?>
                    <option value="<?= $c['id'] ?>" <?= $selected_class==$c['id']?'selected':'' ?>><?= $c['class_name'].' Section '.$c['section'].' ['.$c['session_name'].']' ?></option>
                    <?php endwhile; ?>
                </select>
            </div>
            <div class="col-md-4">
                <label class="form-label fw-600 mb-1" style="font-size:13px;font-weight:600">Select Exam Term</label>
                <select name="term_id" class="form-select form-select-sm" required>
                    <option value="">-- Choose Term --</option>
                    <?php while($t=$terms->fetch_assoc()): ?>
                    <option value="<?= $t['id'] ?>" <?= $selected_term==$t['id']?'selected':'' ?>><?= $t['term_name'].' ['.$t['session_name'].']' ?></option>
                    <?php endwhile; ?>
                </select>
            </div>
            <div class="col-md-4">
                <button type="submit" class="btn btn-primary btn-sm w-100"><i class="fas fa-table me-1"></i> Load Marks Sheet</button>
            </div>
        </form>
        <div class="mt-2 legend">
            <span class="me-3">💡 <strong>Type marks</strong> directly. Auto-saved on Tab/Enter.</span>
            <span class="me-3">🔴 <strong>AB</strong> = Absent</span>
            <span class="me-3">🟡 <strong>ML</strong> = Medical Leave</span>
            <span>🔵 <strong>EX</strong> = Exempted</span>
        </div>
    </div>

    <?php if ($selected_class && $selected_term): ?>

    <?php if (empty($exam_structures)): ?>
    <div class="alert alert-warning">
        <i class="fas fa-exclamation-triangle me-2"></i>
        No exam structure defined for this class & term. 
        <a href="exam_structure.php?class_id=<?= $selected_class ?>&term_id=<?= $selected_term ?>" class="alert-link">Set up Exam Structure first →</a>
    </div>
    <?php elseif (empty($students)): ?>
    <div class="alert alert-info">
        <i class="fas fa-info-circle me-2"></i>
        No students found in this class. <a href="students.php" class="alert-link">Add students →</a>
    </div>
    <?php else: ?>

    <div class="marks-table-wrap">
        <div style="padding:12px 16px;border-bottom:1px solid #f1f5f9;display:flex;justify-content:space-between;align-items:center;">
            <span style="font-weight:700;font-size:14px;color:var(--dark)">
                <?= count($students) ?> Students &nbsp;|&nbsp; <?= count($subject_cols) ?> Exam Components
            </span>
            <div class="d-flex gap-2">
                <button onclick="fillAllAbsent()" class="btn btn-sm btn-outline-warning">Mark All Absent</button>
                <button onclick="window.print()" class="btn btn-sm btn-outline-secondary"><i class="fas fa-print me-1"></i>Print</button>
            </div>
        </div>
        <div style="overflow-x:auto">
        <table class="marks-table" id="marksGrid">
            <thead>
                <tr>
                    <th rowspan="2" style="min-width:40px">#</th>
                    <th rowspan="2" style="min-width:160px;text-align:left">Student Name</th>
                    <th rowspan="2" style="min-width:80px">Roll No</th>
                    <?php foreach($subject_cols as $eid=>$col): ?>
                    <th class="subject-header"><?= htmlspecialchars($col['label']) ?></th>
                    <?php endforeach; ?>
                    <th rowspan="2" style="background:#1d4ed8">Total</th>
                    <th rowspan="2" style="background:#059669">%</th>
                    <th rowspan="2" style="background:#7c3aed">Grade</th>
                </tr>
                <tr class="max-row">
                    <?php foreach($subject_cols as $eid=>$col): ?>
                    <th class="max-row">Max: <?= $col['max'] ?></th>
                    <?php endforeach; ?>
                </tr>
            </thead>
            <tbody>
                <?php $rowIdx=0; foreach($students as $s): $rowIdx++;
                    $totalObt=0; $totalMax=0; $allMarks=[];
                    foreach($subject_cols as $eid=>$col) {
                        $m = $marks_map[$s['id']][$eid] ?? null;
                        $allMarks[$eid] = $m;
                        if($m && $m['status']=='present' && $m['marks_obtained']!==null) {
                            $totalObt += floatval($m['marks_obtained']);
                            $totalMax += floatval($col['max']);
                        } elseif (!$m) {
                            $totalMax += floatval($col['max']);
                        }
                    }
                    $pct = $totalMax>0 ? round(($totalObt/$totalMax)*100,1) : 0;
                    $gradeInfo = getGrade($conn, $pct, 'PRIMARY');
                ?>
                <tr id="row_<?= $s['id'] ?>">
                    <td class="sno"><?= $rowIdx ?></td>
                    <td class="student-name">
                        <?= htmlspecialchars($s['first_name'].' '.$s['last_name']) ?>
                        <div style="font-size:10px;color:#94a3b8"><?= $s['admission_no'] ?></div>
                    </td>
                    <td class="sno"><?= $s['roll_no'] ?></td>
                    <?php foreach($subject_cols as $eid=>$col):
                        $m = $allMarks[$eid];
                        $val = '';
                        $extraClass = '';
                        if ($m) {
                            if ($m['status']=='absent') { $val='AB'; $extraClass='absent'; }
                            elseif ($m['status']=='medical') { $val='ML'; $extraClass='absent'; }
                            elseif ($m['status']=='exempted') { $val='EX'; $extraClass='absent'; }
                            elseif ($m['marks_obtained']!==null) { $val=$m['marks_obtained']+0; $extraClass='saved'; }
                        }
                    ?>
                    <td>
                        <input type="text"
                            class="marks-input <?= $extraClass ?>"
                            value="<?= htmlspecialchars($val) ?>"
                            data-student="<?= $s['id'] ?>"
                            data-esid="<?= $eid ?>"
                            data-max="<?= $col['max'] ?>"
                            onchange="saveMark(this)"
                            onkeydown="navGrid(event,this)"
                            placeholder="--">
                    </td>
                    <?php endforeach; ?>
                    <td class="total-cell" id="tot_<?= $s['id'] ?>"><?= $totalObt ?></td>
                    <td class="pct-cell" id="pct_<?= $s['id'] ?>"><?= $pct ?>%</td>
                    <td class="grade-cell" id="grade_<?= $s['id'] ?>" style="color:#7c3aed"><?= $gradeInfo['grade_letter'] ?></td>
                </tr>
                <?php endforeach; ?>
            </tbody>
        </table>
        </div>
    </div>

    <?php endif; ?>
    <?php else: ?>
    <div class="text-center py-5">
        <div style="font-size:5rem;margin-bottom:20px">📊</div>
        <h5 style="color:#374151;font-weight:700">Select Class & Term to Load Marks Sheet</h5>
        <p class="text-muted">Choose a class and exam term above to start entering marks in spreadsheet mode.</p>
        <div class="d-flex gap-2 justify-content-center mt-3">
            <a href="exam_structure.php" class="btn btn-outline-primary btn-sm">Setup Exam Structure First</a>
            <a href="students.php" class="btn btn-outline-success btn-sm">Manage Students</a>
        </div>
    </div>
    <?php endif; ?>
</div>

<div class="saving-indicator" id="savingInd"><i class="fas fa-spinner fa-spin me-1"></i> Saving...</div>

<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
<script>
function saveMark(input) {
    const val = input.value.trim().toUpperCase();
    const max = parseFloat(input.dataset.max);
    const sid = input.dataset.student;
    const esid = input.dataset.esid;

    // Validate
    if (!['AB','ML','EX',''].includes(val) && val !== '') {
        const num = parseFloat(val);
        if (isNaN(num) || num < 0 || num > max) {
            input.classList.add('error-mark');
            input.classList.remove('saved');
            showStatus('❌ Invalid: max is ' + max, 'danger');
            return;
        }
    }
    input.classList.remove('error-mark');
    document.getElementById('savingInd').style.display = 'block';

    fetch('marks_entry.php', {
        method: 'POST',
        headers: {'Content-Type': 'application/x-www-form-urlencoded'},
        body: `ajax_save=1&student_id=${sid}&exam_structure_id=${esid}&marks=${encodeURIComponent(input.value.trim())}`
    })
    .then(r => r.json())
    .then(data => {
        document.getElementById('savingInd').style.display = 'none';
        if (data.success) {
            input.classList.add('saved');
            if (['AB','ML','EX'].includes(val)) input.classList.add('absent');
            else input.classList.remove('absent');
            updateRowTotals(sid);
            showStatus('✅ Saved', 'success');
        } else {
            input.classList.add('error-mark');
            showStatus('❌ ' + data.msg, 'danger');
        }
    })
    .catch(() => {
        document.getElementById('savingInd').style.display = 'none';
        showStatus('⚠️ Network error', 'warning');
    });
}

function updateRowTotals(sid) {
    const inputs = document.querySelectorAll(`input[data-student="${sid}"]`);
    let tot=0, maxTot=0;
    inputs.forEach(inp => {
        const max = parseFloat(inp.dataset.max);
        const val = inp.value.trim().toUpperCase();
        if (!['AB','ML','EX',''].includes(val) && !isNaN(parseFloat(val))) {
            tot += parseFloat(val);
            maxTot += max;
        } else if (val === '') {
            maxTot += max;
        }
    });
    const pct = maxTot > 0 ? (tot/maxTot*100).toFixed(1) : 0;
    const totEl = document.getElementById('tot_'+sid);
    const pctEl = document.getElementById('pct_'+sid);
    if (totEl) totEl.textContent = tot;
    if (pctEl) pctEl.textContent = pct + '%';
}

function navGrid(event, input) {
    const table = document.getElementById('marksGrid');
    const inputs = [...table.querySelectorAll('.marks-input')];
    const idx = inputs.indexOf(input);
    if (event.key === 'Tab' || event.key === 'Enter') {
        event.preventDefault();
        saveMark(input);
        if (inputs[idx+1]) inputs[idx+1].focus();
    } else if (event.key === 'ArrowDown') {
        event.preventDefault();
        const cols = document.querySelectorAll(`input[data-esid="${input.dataset.esid}"]`);
        const ci = [...cols].indexOf(input);
        if (cols[ci+1]) cols[ci+1].focus();
    } else if (event.key === 'ArrowUp') {
        event.preventDefault();
        const cols = document.querySelectorAll(`input[data-esid="${input.dataset.esid}"]`);
        const ci = [...cols].indexOf(input);
        if (cols[ci-1]) cols[ci-1].focus();
    }
}

let statusTimeout;
function showStatus(msg, type) {
    const el = document.getElementById('save-status');
    if (!el) return;
    el.textContent = msg;
    el.className = `badge bg-${type} align-self-center`;
    clearTimeout(statusTimeout);
    statusTimeout = setTimeout(() => { el.textContent='Auto-save ON'; el.className='badge bg-success align-self-center'; }, 2500);
}

function fillAllAbsent() {
    if (!confirm('Mark ALL students as Absent for all subjects?')) return;
    document.querySelectorAll('.marks-input').forEach(inp => {
        inp.value = 'AB';
        saveMark(inp);
    });
}
</script>
</body></html>
