<?php
session_start();
include 'db.php';

if (!isset($_SESSION['admin_id'])) {
    header("Location: admin_login.php");
    exit();
}

// ✅ جلب بيانات الأدمن من الجلسة
$admin_username = isset($_SESSION['admin_username']) ? $_SESSION['admin_username'] : '';
$admin_role     = isset($_SESSION['admin_role']) ? $_SESSION['admin_role'] : null;

// ✅ لو ماكو role (جلسة قديمة مثلاً) نحدده من اسم المستخدم
if ($admin_role === null) {
    switch ($admin_username) {
        case 'alawael0':
            // فقط كارت أسئلة المدرسين
            $admin_role = 'questions_only';
            break;

        case 'alawael1':
            // عرض الواجبات + المادة الداخلة بالامتحان + إحصائية الواجبات
            $admin_role = 'homework_exam_stats';
            break;

        case 'alawael2':
            // تقييمات الطلبة + الإحصائيات + درجات الطلبة للمواد + الواجبات + إحصائية الواجبات
            $admin_role = 'eval_stats_grades';
            break;

        case 'awael':   // اليوزر القديم
        case 'alawael': // اليوزر الكامل
        default:
            // كامل الصلاحيات
            $admin_role = 'super';
            break;
    }
    $_SESSION['admin_role'] = $admin_role;
}

// ✅ السماح فقط لمن له كامل الصلاحيات (super) بالدخول لهذه الصفحة
if ($admin_role !== 'super') {
    header("Location: admin_dashboard.php");
    exit();
}

mysqli_set_charset($conn, "utf8mb4");

// ✅ تأكد من وجود عمود درجة الامتحان النهائي في قاعدة البيانات
// ملاحظة: يفضّل تنفيذ أمر SQL الموجود أسفل الرد مرة واحدة من phpMyAdmin أيضاً.
$final_exam_col = mysqli_query($conn, "SHOW COLUMNS FROM grades LIKE 'final_exam'");
if ($final_exam_col && mysqli_num_rows($final_exam_col) == 0) {
    mysqli_query($conn, "ALTER TABLE grades ADD COLUMN final_exam DECIMAL(5,2) DEFAULT NULL AFTER annual_average");
}

function esc($s){ return htmlspecialchars($s, ENT_QUOTES, 'UTF-8'); }

// ✅ دالة تنسيق العرض: 63.00 → 63 ، 24.67 تبقى 24.67
function fmt_num($v) {
    if ($v === '' || $v === null) return '';
    $v = (float)$v;
    if (fmod($v, 1) == 0.0) {
        return (string)(int)$v;
    }
    return rtrim(rtrim(number_format($v, 2, '.', ''), '0'), '.');
}

// ✅ دالة تقريب نصف فأعلى
function round_half_up_int($v) {
    $v = (float)$v;
    $i = floor($v);
    return ($v - $i >= 0.5) ? $i + 1 : $i;
}

// ✅ حساب النتيجة النهائية = (درجة الامتحان النهائي + المعدل السنوي) ÷ 2
// إذا تُركت درجة الامتحان النهائي فارغة تبقى النتيجة فارغة.
function calc_final_result_from_exam($annual_average, $final_exam_raw) {
    if ($final_exam_raw === '' || $final_exam_raw === null) return null;
    return round_half_up_int(((float)$annual_average + (float)$final_exam_raw) / 2);
}

// ✅ دالة توحيد اسم المرحلة
function norm_stage($s){
    $s = trim($s);
    // ✅ توحيد الهمزات (حتى 'أول' تصير 'اول')
    $s = str_replace(array('أ','إ','آ'), 'ا', $s);
    // ✅ إزالة (ال) والمسافات
    $s = str_replace(array('الأ','ال',' '), array('ا','', ''), $s);
    return $s;
}

// ✅ دالة لأخذ أعلى 3 درجات (نخليها ديسمل هنا، ونقرّب بعدين)
function top3_avg_admin($arr) {
    $clean = array();
    foreach ($arr as $v) {
        $clean[] = floatval($v);
    }
    rsort($clean);
    $top3 = array_slice($clean, 0, 3);
    $sum = array_sum($top3);
    $count = count($top3) > 0 ? count($top3) : 1;
    return round($sum / $count, 2);
}

// ✅ (إضافة) إذا كانت هناك درجتان فقط (قيم > 0) داخل الفصل => نجمع ونقسم على 2 (قبل التقريب)
function avg_if_two_only($arr) {
    $real = array();
    foreach ($arr as $v) {
        $v = (float)$v;
        if ($v > 0) $real[] = $v;
    }
    if (count($real) == 2) {
        return round(array_sum($real) / 2, 2);
    }
    return null;
}

// ✅ إذا كانت هناك درجة واحدة فقط (قيم > 0) داخل الفصل => نقسمها على 2 (قبل التقريب)
function avg_if_one_only($arr) {
    $real = array();
    foreach ($arr as $v) {
        $v = (float)$v;
        if ($v > 0) $real[] = $v;
    }
    if (count($real) == 1) {
        return round($real[0] / 2, 2);
    }
    return null;
}


// ✅ دالة توحيد اسم المادة (للمقارنات)
function norm_subject($s){
    $s = trim($s);
    $s = str_replace(array('أ','إ','آ'), 'ا', $s);
    $s = str_replace(array('ى'), 'ي', $s);
    $s = str_replace(array('ة'), 'ه', $s);
    $s = str_replace(array('ـ'), '', $s);
    // إزالة الحركات إن وُجدت
    $s = str_replace(array('َ','ً','ُ','ٌ','ِ','ٍ','ْ','ّ'), '', $s);
    // إزالة "ال" والمسافات
    $s = str_replace(array('ال',' '), array('',''), $s);
    // إنكليزي: خليه lowercase
    $s = strtolower($s);
    return $s;
}

/*
    ✅✅✅ التعديل المطلوب هنا فقط:
    - إضافة "سادس علمي" للقاعدة
    - ولكن للسادس العلمي: المواد (إسلامية/عربي/إنكليزي/فرنسي) فقط
    - وباقي الصفوف المحددة: نفس المواد + الكردي كما كان
*/

// ✅ تفعيل منطق الفصل الأول الخاص (فقط للمواد/الصفوف المحددة)
function use_special_sem1_rule($stage, $subject){

    $ns  = norm_stage($stage);
    $sub = norm_subject($subject);

    // ✅ الصفوف: أول متوسط، ثاني متوسط، رابع علمي، خامس علمي، سادس علمي
    $allowedStages = array('اولمتوسط','ثانيمتوسط','رابععلمي','خامسعلمي','سادسعلمي');

    // ✅ المواد المشتركة (للسادس العلمي أيضاً): الإسلامية + العربية + الإنكليزية + الفرنسية
    $allowedSubjectsCommon = array(
        // التربية الإسلامية
        'تربيهاسلاميه',

        // اللغة الإنكليزية
        'لغهانكليزيه',

        // اللغة العربية
        'لغهعربيه',
        'لغعربيه',

        // اللغة الفرنسية
        'لغهفرنسيه',
        'لغفرنسيه'
    );

    // ✅ للصفوف (أول/ثاني/رابع/خامس): نفس المواد + الكردي كما كان
    $allowedSubjectsWithKurdish = array_merge($allowedSubjectsCommon, array(
        'لغهكرديه',
        'لغكرديه'
    ));

    if (!in_array($ns, $allowedStages)) return false;

    // ✅ السادس العلمي: بدون الكردي
    if ($ns === 'سادسعلمي') {
        return in_array($sub, $allowedSubjectsCommon);
    }

    // ✅ باقي الصفوف المحددة: تشمل الكردي
    return in_array($sub, $allowedSubjectsWithKurdish);
}

// ✅ حساب فصل1 الخاص: إذا كان اليومي1 = 0 أو فارغ => نحذف أقل درجة من (ش1/ش2/ش3) ثم نجمع الباقي ÷ 2
//    ترجع: [avg2, min_key] حيث min_key واحد من: month1/month2/month3
function sem1_best2_months($m1, $m2, $m3){
    $vals = array(
        'month1' => (float)$m1,
        'month2' => (float)$m2,
        'month3' => (float)$m3
    );
    $min_key = null;
    $min_val = null;
    foreach ($vals as $k => $v) {
        if ($min_val === null || $v < $min_val) {
            $min_val = $v;
            $min_key = $k;
        }
    }
    $sum2 = ((float)$m1 + (float)$m2 + (float)$m3) - (float)$min_val;
    $avg2 = round($sum2 / 2, 2);
    return array($avg2, $min_key);
}

// ✅ تحديد طريقة احتساب الفصل الثاني حسب المرحلة والمادة
function sem2_rule_mode($stage, $subject){
    $ns  = norm_stage($stage);
    $sub = norm_subject($subject);

    // ✅ للمراحل: أول متوسط، ثاني متوسط، رابع علمي، خامس علمي
    // الفصل الثاني = أعلى درجة بين ش1 (ف2) و ش2 (ف2) فقط
    if (in_array($ns, array('اولمتوسط','ثانيمتوسط','رابععلمي','خامسعلمي'))) {
        return 'max_m4_m5';
    }

    // ✅ السادس العلمي:
    // - العربي / الإنكليزي / الفرنسي / الإسلامية => أعلى درجة بين ش1 (ف2) و ش2 (ف2)
    // - باقي المواد => أعلى درجة بين ش1 (ف2) و ش2 (ف2) و اليومي ف2
    if ($ns === 'سادسعلمي') {
        $twoMonthsSubjects = array(
            'تربيهاسلاميه',
            'لغهانكليزيه',
            'لغهعربيه',
            'لغعربيه',
            'لغهفرنسيه',
            'لغفرنسيه'
        );

        if (in_array($sub, $twoMonthsSubjects)) {
            return 'max_m4_m5';
        }

        return 'max_m4_m5_d2';
    }

    return 'default';
}

// ✅ احتساب الفصل الثاني حسب القاعدة الخاصة، وإذا لم تنطبق يرجع null
function special_sem2_calc($stage, $subject, $m4, $m5, $m6, $d2){
    $mode = sem2_rule_mode($stage, $subject);

    if ($mode === 'max_m4_m5') {
        return max((float)$m4, (float)$m5);
    }

    if ($mode === 'max_m4_m5_d2') {
        return max((float)$m4, (float)$m5, (float)$d2);
    }

    return null;
}


/* =========================
   1) جلب المراحل
   ========================= */
$stages_rs = mysqli_query($conn, "SELECT DISTINCT stage FROM students ORDER BY FIELD(stage,
'أول متوسط','ثاني متوسط','ثالث متوسط','رابع علمي','خامس علمي','سادس علمي'), stage");
$stages = [];
while($r = mysqli_fetch_assoc($stages_rs)) $stages[] = $r['stage'];

$stage   = isset($_GET['stage']) ? trim($_GET['stage']) : '';
$subject = isset($_GET['subject']) ? trim($_GET['subject']) : '';

/* =========================
   2) تصدير كل الدرجات
   ========================= */
if (isset($_GET['export_all'])) {
    header("Content-Type: application/vnd.ms-excel; charset=utf-8");
    header("Content-Disposition: attachment; filename=all_grades_export.xls");
    header("Pragma: no-cache");
    header("Expires: 0");

    echo "<table border='1'>";
    echo "<tr>
        <th>اسم الطالب</th><th>الشعبة</th><th>درجة الامتحان النهائي</th><th>المرحلة</th><th>المادة</th>
        <th>ش1</th><th>ش2</th><th>ش3</th><th>اليومي ف1</th><th>فصل1</th>
        <th>نصف السنة</th><th>ش1 (ف2)</th><th>ش2 (ف2)</th><th>ش3 (ف2)</th>
        <th>اليومي ف2</th><th>فصل2</th><th>معدل سنوي</th><th>النتيجة النهائية</th><th>تاريخ الحفظ</th>
    </tr>";

    $q = mysqli_query($conn, "
        SELECT s.name, s.stage, s.class, g.*
        FROM grades g
        JOIN students s ON s.id = g.student_id
        ORDER BY s.stage, s.class ASC, s.name ASC
    ");
    while($r = mysqli_fetch_assoc($q)) {

        // ✅ قيم رقمية للحساب (الفارغ/NULL يعتبر 0 للحساب فقط)
        $m1  = ($r['month1'] === null || $r['month1'] === '' ? 0 : (float)$r['month1']);
        $m2  = ($r['month2'] === null || $r['month2'] === '' ? 0 : (float)$r['month2']);
        $m3  = ($r['month3'] === null || $r['month3'] === '' ? 0 : (float)$r['month3']);
        $d1  = ($r['daily1'] === null || $r['daily1'] === '' ? 0 : (float)$r['daily1']);

        $mid = ($r['midterm'] === null || $r['midterm'] === '' ? 0 : (float)$r['midterm']);

        $m4  = ($r['month4'] === null || $r['month4'] === '' ? 0 : (float)$r['month4']);
        $m5  = ($r['month5'] === null || $r['month5'] === '' ? 0 : (float)$r['month5']);
        $m6  = ($r['month6'] === null || $r['month6'] === '' ? 0 : (float)$r['month6']);
        $d2  = ($r['daily2'] === null || $r['daily2'] === '' ? 0 : (float)$r['daily2']);

        // =======================
        // 🔹 فصل أول (نفس منطق النظام + منطق خاص لبعض المواد/الصفوف عند غياب اليومي1)
        // =======================
        $min_key1 = null;

        $use_special_sem1 = use_special_sem1_rule($r['stage'], $r['subject']);

        // ✅ منطق خاص: إذا كان اليومي1 = 0 أو فارغ، نحذف أقل شهر من (ش1/ش2/ش3) ثم (الباقي ÷ 2)
        if ($use_special_sem1 && $d1 <= 0) {
            $tmp = sem1_best2_months($m1, $m2, $m3);
            $sem1_calc = $tmp[0];
            $min_candidate = $tmp[1];

            // ✅ الشطب فقط إذا كانت أشهر الفصل الأول الثلاثة موجودة فعلياً (حتى لو كانت 0)
            $presentM = 0;
            foreach (array('month1','month2','month3') as $kk) {
                if (!($r[$kk] === null || $r[$kk] === '')) $presentM++;
            }
            $min_key1 = ($presentM == 3 ? $min_candidate : null);

        } else {

            $twoOnly1 = avg_if_two_only(array($m1, $m2, $m3, $d1));
            if ($twoOnly1 !== null) {
                $sem1_calc = $twoOnly1;
            } else {
                if ($d1 > 0) {
                    $sem1_calc = top3_avg_admin(array($m1, $m2, $m3, $d1));

                    // ✅ الشطب فقط إذا كانت الأربع درجات موجودة فعلياً (حتى لو كانت 0)
                    $firstRaw = array(
                        'month1' => $r['month1'],
                        'month2' => $r['month2'],
                        'month3' => $r['month3'],
                        'daily1' => $r['daily1']
                    );

                    $present1 = 0;
                    foreach ($firstRaw as $raw) {
                        if (!($raw === null || $raw === '')) $present1++;
                    }

                    if ($present1 == 4) {
                        $min_val1 = null;
                        foreach ($firstRaw as $k => $raw) {
                            $v = (float)$raw; // يشمل 0
                            if ($min_val1 === null || $v < $min_val1) {
                                $min_val1 = $v;
                                $min_key1 = $k;
                            }
                        }
                    } else {
                        $min_key1 = null;
                    }

                } else {
                    $sem1_calc = round(($m1 + $m2 + $m3) / 3, 2);
                }
            }
        }
        $sem1_calc = round_half_up_int($sem1_calc);

        // =======================
        // 🔹 فصل ثاني (حسب القاعدة الجديدة المطلوبة)
        // =======================
        $min_key2 = null;

        $special_sem2 = special_sem2_calc($r['stage'], $r['subject'], $m4, $m5, $m6, $d2);
        if ($special_sem2 !== null) {
            $sem2_calc = $special_sem2;
        } else {
            $twoOnly2 = avg_if_two_only(array($m4, $m5, $m6, $d2));
            $oneOnly2 = avg_if_one_only(array($m4, $m5, $m6, $d2));
            if ($twoOnly2 !== null) {
                $sem2_calc = $twoOnly2;
            } elseif ($oneOnly2 !== null) {
                $sem2_calc = $oneOnly2;
            } else {
                if ($d2 > 0) {
                    // ✅ المنطق الافتراضي القديم لباقي الصفوف غير المشمولة بالتعديل
                    $vals2 = array($m4, $m5, $m6, $d2);

                    $pos2 = array();

                    $cnt2 = 0;

                    $sum2 = 0;

                    foreach ($vals2 as $vv) {

                        if ($vv > 0) { $cnt2++; $sum2 += $vv; $pos2[] = $vv; }

                    }

                    if ($cnt2 == 3) {

                        $minv2 = null;

                        foreach ($pos2 as $vv) { if ($minv2 === null || $vv < $minv2) $minv2 = $vv; }

                        $sem2_calc = round(($sum2 - $minv2) / 2, 2);

                    } else {

                        $sem2_calc = top3_avg_admin($vals2);

                    }

                    // ✅ الشطب فقط إذا كانت الأربع درجات موجودة فعلياً (حتى لو كانت 0)
                    $secondRaw = array(
                        'month4' => $r['month4'],
                        'month5' => $r['month5'],
                        'month6' => $r['month6'],
                        'daily2' => $r['daily2']
                    );

                    $present2 = 0;
                    foreach ($secondRaw as $raw) {
                        if (!($raw === null || $raw === '')) $present2++;
                    }

                    if ($present2 == 4) {
                        $min_val2 = null;
                        foreach ($secondRaw as $k => $raw) {
                            $v = (float)$raw; // يشمل 0
                            if ($min_val2 === null || $v < $min_val2) {
                                $min_val2 = $v;
                                $min_key2 = $k;
                            }
                        }
                    } else {
                        $min_key2 = null;
                    }

                } else {
                    $sem2_calc = round(($m4 + $m5 + $m6) / 3, 2);
                }
            }
        }
        $sem2_calc = round_half_up_int($sem2_calc);

        // ✅ المعدل السنوي في التصدير نفس المعروض بالموقع
        $annual_calc = round_half_up_int(($sem1_calc + $sem2_calc + $mid) / 3);

        // ✅ درجة الامتحان النهائي والنتيجة النهائية
        $final_exam_raw = isset($r['final_exam']) ? $r['final_exam'] : '';
        $final_result_calc = calc_final_result_from_exam($annual_calc, $final_exam_raw);

        // ✅ ستايل الشطب داخل الخلية (بدون إضافة أعمدة)
        $strikeStyle = " style='text-decoration:line-through;color:#c00;font-weight:bold;'";

        $cell_m1 = "<td".($min_key1==='month1'?$strikeStyle:'').">".esc($r['month1'])."</td>";
        $cell_m2 = "<td".($min_key1==='month2'?$strikeStyle:'').">".esc($r['month2'])."</td>";
        $cell_m3 = "<td".($min_key1==='month3'?$strikeStyle:'').">".esc($r['month3'])."</td>";
        $cell_d1 = "<td".($min_key1==='daily1'?$strikeStyle:'').">".esc($r['daily1'])."</td>";

        $cell_m4 = "<td".($min_key2==='month4'?$strikeStyle:'').">".esc($r['month4'])."</td>";
        $cell_m5 = "<td".($min_key2==='month5'?$strikeStyle:'').">".esc($r['month5'])."</td>";
        $cell_m6 = "<td".($min_key2==='month6'?$strikeStyle:'').">".esc($r['month6'])."</td>";
        $cell_d2 = "<td".($min_key2==='daily2'?$strikeStyle:'').">".esc($r['daily2'])."</td>";

        echo "<tr>
            <td>".esc($r['name'])."</td>
            <td>".esc($r['class'])."</td>
            <td>".esc(fmt_num($final_exam_raw))."</td>
            <td>".esc($r['stage'])."</td>
            <td>".esc($r['subject'])."</td>

            $cell_m1
            $cell_m2
            $cell_m3
            $cell_d1
            <td>".esc($sem1_calc)."</td>

            <td>".esc($r['midterm'])."</td>

            $cell_m4
            $cell_m5
            $cell_m6
            $cell_d2
            <td>".esc($sem2_calc)."</td>

            <td>".esc($annual_calc)."</td>
            <td>".esc(fmt_num($final_result_calc))."</td>
            <td>".esc($r['saved_at'])."</td>
        </tr>";
    }

    echo "</table>";
    exit;
}

/* =========================
   3) تصدير مادة محددة (بدون تقسيم مدرس)
   ========================= */
if (isset($_GET['export']) && $stage !== '' && $subject !== '') {
    $file_name = "درجات-" . str_replace(' ', '-', $stage) . "-" . str_replace(' ', '-', $subject) . ".xls";

    header("Content-Type: application/vnd.ms-excel; charset=utf-8");
    header("Content-Disposition: attachment; filename=$file_name");
    header("Pragma: no-cache");
    header("Expires: 0");

    echo "<table border='1'>";
    echo "<tr>
        <th>اسم الطالب</th><th>الشعبة</th><th>درجة الامتحان النهائي</th><th>المرحلة</th><th>المادة</th>
        <th>ش1</th><th>ش2</th><th>ش3</th><th>اليومي ف1</th><th>فصل1</th>
        <th>نصف السنة</th><th>ش1 (ف2)</th><th>ش2 (ف2)</th><th>ش3 (ف2)</th>
        <th>اليومي ف2</th><th>فصل2</th><th>معدل سنوي</th><th>النتيجة النهائية</th><th>تاريخ الحفظ</th>
    </tr>";

    $stage_esc   = mysqli_real_escape_string($conn, $stage);
    $subject_esc = mysqli_real_escape_string($conn, $subject);

    $q = mysqli_query($conn, "
        SELECT s.name, s.stage, s.class, g.*
        FROM grades g
        JOIN students s ON s.id = g.student_id
        WHERE REPLACE(s.stage,'الأ','ا') LIKE REPLACE('%$stage_esc%','الأ','ا')
          AND TRIM(LOWER(REPLACE(g.subject,'ال',''))) = TRIM(LOWER(REPLACE('$subject_esc','ال','')))
        ORDER BY s.class ASC, s.name ASC
    ");
    while($r = mysqli_fetch_assoc($q)) {

        // ✅ قيم رقمية للحساب (الفارغ/NULL يعتبر 0 للحساب فقط)
        $m1  = ($r['month1'] === null || $r['month1'] === '' ? 0 : (float)$r['month1']);
        $m2  = ($r['month2'] === null || $r['month2'] === '' ? 0 : (float)$r['month2']);
        $m3  = ($r['month3'] === null || $r['month3'] === '' ? 0 : (float)$r['month3']);
        $d1  = ($r['daily1'] === null || $r['daily1'] === '' ? 0 : (float)$r['daily1']);

        $mid = ($r['midterm'] === null || $r['midterm'] === '' ? 0 : (float)$r['midterm']);

        $m4  = ($r['month4'] === null || $r['month4'] === '' ? 0 : (float)$r['month4']);
        $m5  = ($r['month5'] === null || $r['month5'] === '' ? 0 : (float)$r['month5']);
        $m6  = ($r['month6'] === null || $r['month6'] === '' ? 0 : (float)$r['month6']);
        $d2  = ($r['daily2'] === null || $r['daily2'] === '' ? 0 : (float)$r['daily2']);

        // 🔹 فصل أول (نفس منطق الموقع + منطق خاص لبعض المواد/الصفوف عند غياب اليومي1)
        $min_key1 = null;

        $use_special_sem1 = use_special_sem1_rule($r['stage'], $r['subject']);

        // ✅ منطق خاص: إذا كان اليومي1 = 0 أو فارغ، نحذف أقل شهر من (ش1/ش2/ش3) ثم (الباقي ÷ 2)
        if ($use_special_sem1 && $d1 <= 0) {
            $tmp = sem1_best2_months($m1, $m2, $m3);
            $sem1_calc = $tmp[0];
            $min_candidate = $tmp[1];

            // ✅ الشطب فقط إذا كانت أشهر الفصل الأول الثلاثة موجودة فعلياً (حتى لو كانت 0)
            $presentM = 0;
            foreach (array('month1','month2','month3') as $kk) {
                if (!($r[$kk] === null || $r[$kk] === '')) $presentM++;
            }
            $min_key1 = ($presentM == 3 ? $min_candidate : null);

        } else {

            $twoOnly1 = avg_if_two_only(array($m1, $m2, $m3, $d1));
            if ($twoOnly1 !== null) {
                $sem1_calc = $twoOnly1;
            } else {
                if ($d1 > 0) {
                    $sem1_calc = top3_avg_admin(array($m1, $m2, $m3, $d1));

                    // ✅ تحديد الدرجة المحذوفة (نفس منطق النظام):
                    // ✅ لا يتم الشطب إلا إذا كانت الدرجات الأربع موجودة فعلياً (ش1+ش2+ش3+يومي1) — حتى لو كانت 0
                    $firstRaw = array(
                        'month1' => $r['month1'],
                        'month2' => $r['month2'],
                        'month3' => $r['month3'],
                        'daily1' => $r['daily1']
                    );

                    $present1 = 0;
                    foreach ($firstRaw as $raw) {
                        if (!($raw === null || $raw === '')) $present1++;
                    }

                    if ($present1 == 4) {
                        $min_val1 = null;
                        foreach ($firstRaw as $k => $raw) {
                            $v = (float)$raw; // يشمل 0
                            if ($min_val1 === null || $v < $min_val1) {
                                $min_val1 = $v;
                                $min_key1 = $k;
                            }
                        }
                    } else {
                        $min_key1 = null;
                    }
                } else {
                    $sem1_calc = round(($m1 + $m2 + $m3) / 3, 2);
                }
            }
        }
        $sem1_calc = round_half_up_int($sem1_calc);

        // 🔹 فصل ثاني (حسب القاعدة الجديدة المطلوبة)
        $min_key2 = null;

        $special_sem2 = special_sem2_calc($r['stage'], $r['subject'], $m4, $m5, $m6, $d2);
        if ($special_sem2 !== null) {
            $sem2_calc = $special_sem2;
        } else {
            $twoOnly2 = avg_if_two_only(array($m4, $m5, $m6, $d2));
            $oneOnly2 = avg_if_one_only(array($m4, $m5, $m6, $d2));
            if ($twoOnly2 !== null) {
                $sem2_calc = $twoOnly2;
            } elseif ($oneOnly2 !== null) {
                $sem2_calc = $oneOnly2;
            } else {
                if ($d2 > 0) {
                    // ✅ المنطق الافتراضي القديم لباقي الصفوف غير المشمولة بالتعديل
                    $vals2 = array($m4, $m5, $m6, $d2);

                    $pos2 = array();

                    $cnt2 = 0;

                    $sum2 = 0;

                    foreach ($vals2 as $vv) {

                        if ($vv > 0) { $cnt2++; $sum2 += $vv; $pos2[] = $vv; }

                    }

                    if ($cnt2 == 3) {

                        $minv2 = null;

                        foreach ($pos2 as $vv) { if ($minv2 === null || $vv < $minv2) $minv2 = $vv; }

                        $sem2_calc = round(($sum2 - $minv2) / 2, 2);

                    } else {

                        $sem2_calc = top3_avg_admin($vals2);

                    }

                    // ✅ تحديد الدرجة المحذوفة (نفس منطق النظام):
                    // ✅ لا يتم الشطب إلا إذا كانت الدرجات الأربع موجودة فعلياً (ش4+ش5+ش6+يومي2) — حتى لو كانت 0
                    $secondRaw = array(
                        'month4' => $r['month4'],
                        'month5' => $r['month5'],
                        'month6' => $r['month6'],
                        'daily2' => $r['daily2']
                    );

                    $present2 = 0;
                    foreach ($secondRaw as $raw) {
                        if (!($raw === null || $raw === '')) $present2++;
                    }

                    if ($present2 == 4) {
                        $min_val2 = null;
                        foreach ($secondRaw as $k => $raw) {
                            $v = (float)$raw; // يشمل 0
                            if ($min_val2 === null || $v < $min_val2) {
                                $min_val2 = $v;
                                $min_key2 = $k;
                            }
                        }
                    } else {
                        $min_key2 = null;
                    }
                } else {
                    $sem2_calc = round(($m4 + $m5 + $m6) / 3, 2);
                }
            }
        }
        $sem2_calc = round_half_up_int($sem2_calc);

        // ✅ المعدل السنوي في التصدير نفس المعروض بالموقع
        $annual_calc = round_half_up_int(($sem1_calc + $sem2_calc + $mid) / 3);

        // ✅ درجة الامتحان النهائي والنتيجة النهائية
        $final_exam_raw = isset($r['final_exam']) ? $r['final_exam'] : '';
        $final_result_calc = calc_final_result_from_exam($annual_calc, $final_exam_raw);

        // ✅ ستايل الشطب داخل الخلية (بدون إضافة أعمدة)
        $strikeStyle = " style='text-decoration:line-through;color:#c00;font-weight:bold;'";

        $cell_m1 = "<td".($min_key1==='month1'?$strikeStyle:'').">".esc($r['month1'])."</td>";
        $cell_m2 = "<td".($min_key1==='month2'?$strikeStyle:'').">".esc($r['month2'])."</td>";
        $cell_m3 = "<td".($min_key1==='month3'?$strikeStyle:'').">".esc($r['month3'])."</td>";
        $cell_d1 = "<td".($min_key1==='daily1'?$strikeStyle:'').">".esc($r['daily1'])."</td>";

        $cell_m4 = "<td".($min_key2==='month4'?$strikeStyle:'').">".esc($r['month4'])."</td>";
        $cell_m5 = "<td".($min_key2==='month5'?$strikeStyle:'').">".esc($r['month5'])."</td>";
        $cell_m6 = "<td".($min_key2==='month6'?$strikeStyle:'').">".esc($r['month6'])."</td>";
        $cell_d2 = "<td".($min_key2==='daily2'?$strikeStyle:'').">".esc($r['daily2'])."</td>";

        echo "<tr>
            <td>".esc($r['name'])."</td>
            <td>".esc($r['class'])."</td>
            <td>".esc(fmt_num($final_exam_raw))."</td>
            <td>".esc($r['stage'])."</td>
            <td>".esc($r['subject'])."</td>

            $cell_m1
            $cell_m2
            $cell_m3
            $cell_d1
            <td>".esc($sem1_calc)."</td>

            <td>".esc($r['midterm'])."</td>

            $cell_m4
            $cell_m5
            $cell_m6
            $cell_d2
            <td>".esc($sem2_calc)."</td>

            <td>".esc($annual_calc)."</td>
            <td>".esc(fmt_num($final_result_calc))."</td>
            <td>".esc($r['saved_at'])."</td>
        </tr>";
    }

    echo "</table>";
    exit;
}

/* =========================
   4) حفظ الدرجات (بدون teacher_id)
   ========================= */
$save_notice = "";
if ($_SERVER['REQUEST_METHOD']==='POST' && isset($_POST['do_save'])) {
    $stage   = mysqli_real_escape_string($conn, $_POST['stage']);
    $subject = mysqli_real_escape_string($conn, $_POST['subject']);
    $grades  = $_POST['grades'];

    // نستخدم رقم ثابت لـ teacher_id للدرجات التي يحفظها الأدمن مباشرة
    $admin_teacher_id = 0;

    foreach ($grades as $sid => $g) {
        $sid = (int)$sid;

        // 🔹 نقرأ القيم الخام كنص (حتى نعرف الفارغ) ثم نستخدمها للحساب والتخزين
        $month1_raw      = isset($g['month1']) ? trim($g['month1']) : '';
        $month2_raw      = isset($g['month2']) ? trim($g['month2']) : '';
        $month3_raw      = isset($g['month3']) ? trim($g['month3']) : '';
        $daily1_raw      = isset($g['daily1']) ? trim($g['daily1']) : '';
        $midterm_raw     = isset($g['midterm']) ? trim($g['midterm']) : '';
        $month4_raw      = isset($g['month4']) ? trim($g['month4']) : '';
        $month5_raw      = isset($g['month5']) ? trim($g['month5']) : '';
        $month6_raw      = isset($g['month6']) ? trim($g['month6']) : '';
        $daily2_raw      = isset($g['daily2']) ? trim($g['daily2']) : '';
        $final_exam_raw  = isset($g['final_exam']) ? trim($g['final_exam']) : '';

        // 🔹 قيم رقمية للحساب (الفارغ نحسبه 0 كما كان سابقاً)
        $month1 = ($month1_raw === '' ? 0 : (float)$month1_raw);
        $month2 = ($month2_raw === '' ? 0 : (float)$month2_raw);
        $month3 = ($month3_raw === '' ? 0 : (float)$month3_raw);
        $daily1 = ($daily1_raw === '' ? 0 : (float)$daily1_raw);
        $midterm = ($midterm_raw === '' ? 0 : (float)$midterm_raw);
        $month4 = ($month4_raw === '' ? 0 : (float)$month4_raw);
        $month5 = ($month5_raw === '' ? 0 : (float)$month5_raw);
        $month6 = ($month6_raw === '' ? 0 : (float)$month6_raw);
        $daily2 = ($daily2_raw === '' ? 0 : (float)$daily2_raw);
        $final_exam = ($final_exam_raw === '' ? 0 : (float)$final_exam_raw);

        // ✅ الفصل الأول
        $use_special_sem1 = use_special_sem1_rule($stage, $subject);

        // ✅ منطق خاص: إذا كان اليومي1 = 0 أو فارغ، نحذف أقل شهر من (ش1/ش2/ش3) ثم (الباقي ÷ 2)
        if ($use_special_sem1 && $daily1 <= 0) {
            $tmp = sem1_best2_months($month1, $month2, $month3);
            $semester1 = $tmp[0];
        } else {
            if ($daily1 > 0) {
                $semester1 = top3_avg_admin(array($month1, $month2, $month3, $daily1));
            } else {
                $semester1 = round(($month1 + $month2 + $month3) / 3, 2);
            }
        }

        // تقريب الفصل الأول
        // ✅ (إضافة) إذا كان للطالب درجتان فقط في الفصل الأول (أي شهرين أو شهر+يومي1) => نجمع ونقسم على 2
        $twoOnly1 = avg_if_two_only(array($month1, $month2, $month3, $daily1));
        if ($twoOnly1 !== null) {
            $semester1 = $twoOnly1;
        }

        $semester1 = round_half_up_int($semester1);

        // ✅ الفصل الثاني
        $special_sem2 = special_sem2_calc($stage, $subject, $month4, $month5, $month6, $daily2);
        if ($special_sem2 !== null) {
            $semester2 = $special_sem2;
        } else {
            if ($daily2 > 0) {
                // ✅ المنطق الافتراضي القديم لباقي الصفوف غير المشمولة بالتعديل
                $vals2 = array($month4, $month5, $month6, $daily2);

                $pos2 = array();

                $cnt2 = 0;

                $sum2 = 0;

                foreach ($vals2 as $vv) {

                    if ($vv > 0) { $cnt2++; $sum2 += $vv; $pos2[] = $vv; }

                }

                if ($cnt2 == 3) {

                    $minv2 = null;

                    foreach ($pos2 as $vv) { if ($minv2 === null || $vv < $minv2) $minv2 = $vv; }

                    $semester2 = round(($sum2 - $minv2) / 2, 2);

                } else {

                    $semester2 = top3_avg_admin($vals2);

                }
            } else {
                $semester2 = round(($month4 + $month5 + $month6) / 3, 2);
            }

            // تقريب الفصل الثاني
            // ✅ (إضافة) إذا كان للطالب درجتان فقط في الفصل الثاني (أي شهرين أو شهر+يومي2) => نجمع ونقسم على 2
            $twoOnly2 = avg_if_two_only(array($month4, $month5, $month6, $daily2));
            if ($twoOnly2 !== null) {
                $semester2 = $twoOnly2;
            }

            // ✅ إذا كانت هناك درجة واحدة فقط في الفصل الثاني => نقسمها على 2
            $oneOnly2 = avg_if_one_only(array($month4, $month5, $month6, $daily2));
            if ($oneOnly2 !== null) {
                $semester2 = $oneOnly2;
            }
        }

        $semester2 = round_half_up_int($semester2);

        // ✅ المعدل السنوي يجبر: 0.5 فأعلى للأعلى و0.4 فأقل للأسفل
        $annual_average = round_half_up_int(($semester1 + $semester2 + $midterm) / 3);

        // ✅ النتيجة النهائية = (درجة الامتحان النهائي + المعدل السنوي) ÷ 2
        $final_result = calc_final_result_from_exam($annual_average, $final_exam_raw);

        // 🔹 تجهيز قيم SQL
        // month1, month2, month3, midterm, final_exam, final_result تسمح NULL
        $month1_sql       = ($month1_raw === ''      ? 'NULL' : $month1);
        $month2_sql       = ($month2_raw === ''      ? 'NULL' : $month2);
        $month3_sql       = ($month3_raw === ''      ? 'NULL' : $month3);
        $midterm_sql      = ($midterm_raw === ''     ? 'NULL' : $midterm);
        $final_exam_sql   = ($final_exam_raw === ''  ? 'NULL' : $final_exam);
        $final_result_sql = ($final_result === null  ? 'NULL' : $final_result);

        // أعمدة NOT NULL (month4, month5, month6, daily1, daily2) نخزن 0 عند الفراغ
        $daily1_sql = ($daily1_raw === '' ? 0 : $daily1);
        $month4_sql = ($month4_raw === '' ? 0 : $month4);
        $month5_sql = ($month5_raw === '' ? 0 : $month5);
        $month6_sql = ($month6_raw === '' ? 0 : $month6);
        $daily2_sql = ($daily2_raw === '' ? 0 : $daily2);

        // هذي القيَم محسوبة دائماً، فنخزنها أرقام عادي
        $semester1_sql     = $semester1;
        $semester2_sql     = $semester2;
        $annual_average_sql= $annual_average;

        // نبحث عن درجة لهذه المادة لهذا الطالب (نتجاهل teacher_id)
        $check = mysqli_query($conn, "
            SELECT id FROM grades 
            WHERE student_id=$sid 
              AND TRIM(LOWER(REPLACE(subject,'ال',''))) = TRIM(LOWER(REPLACE('$subject','ال','')))
            LIMIT 1
        ");
        if (mysqli_num_rows($check) > 0) {
            $r = mysqli_fetch_assoc($check);
            mysqli_query($conn, "
                UPDATE grades SET 
                    month1=$month1_sql,
                    month2=$month2_sql,
                    month3=$month3_sql,
                    daily1=$daily1_sql,
                    semester1=$semester1_sql,
                    midterm=$midterm_sql,
                    month4=$month4_sql,
                    month5=$month5_sql,
                    month6=$month6_sql,
                    daily2=$daily2_sql,
                    semester2=$semester2_sql,
                    annual_average=$annual_average_sql,
                    final_exam=$final_exam_sql,
                    final_result=$final_result_sql,
                    saved_at=NOW()
                WHERE id=".$r['id']."
            ");
        } else {
            mysqli_query($conn, "
                INSERT INTO grades (
                    student_id,subject,teacher_id,
                    month1,month2,month3,daily1,semester1,midterm,
                    month4,month5,month6,daily2,semester2,
                    annual_average,final_exam,final_result,saved_at
                )
                VALUES (
                    $sid,'$subject',$admin_teacher_id,
                    $month1_sql,$month2_sql,$month3_sql,$daily1_sql,$semester1_sql,$midterm_sql,
                    $month4_sql,$month5_sql,$month6_sql,$daily2_sql,$semester2_sql,
                    $annual_average_sql,$final_exam_sql,$final_result_sql,NOW()
                )
            ");
        }
    }
    $save_notice = "✅ تم حفظ الدرجات، والآن الصفحة تعرض درجات كل المدرسين لهذه المادة.";
}

/* =========================
   5) جلب المواد للمرحلة (بدون تقسيم مدرس)
   ========================= */
$subjects = [];
if ($stage !== '') {
    $stage_esc = mysqli_real_escape_string($conn, $stage);
    $rs = mysqli_query($conn, "
        SELECT DISTINCT name AS subject
        FROM subjects
        WHERE
            REPLACE(REPLACE(REPLACE(stage,'الأ','ا'),'ال',''), ' ', '') =
            REPLACE(REPLACE(REPLACE('$stage_esc','الأ','ا'),'ال',''), ' ', '')
        ORDER BY name ASC
    ");
    while($r = mysqli_fetch_assoc($rs)) {
        $subjects[] = $r['subject'];
    }
}

/* =========================
   6) جلب الطلاب + دمج درجات كل المدرسين
   ========================= */
$rows = [];
if ($stage !== '' && $subject !== '') {
    $stage_esc   = mysqli_real_escape_string($conn, $stage);
    $subject_esc = mysqli_real_escape_string($conn, $subject);

    // 1) الطلاب
    $srs = mysqli_query($conn, "
        SELECT id,name,class
        FROM students
        WHERE REPLACE(stage,'الأ','ا') LIKE REPLACE('%$stage_esc%','الأ','ا')
        ORDER BY class ASC, name ASC
    ");
    while($s = mysqli_fetch_assoc($srs)) {
        $rows[$s['id']] = [
            'id'            => $s['id'],
            'name'          => $s['name'],
            'class'         => $s['class'],
            'month1'        => '',
            'month2'        => '',
            'month3'        => '',
            'daily1'        => '',
            'semester1'     => '',
            'midterm'       => '',
            'month4'        => '',
            'month5'        => '',
            'month6'        => '',
            'daily2'        => '',
            'semester2'     => '',
            'annual_average'=> '',
            'final_exam'    => '',
            'final_result'  => '',
            'saved_at'      => ''
        ];
    }

    // 2) الدرجات (كل المدرسين لهذه المادة)
    if (!empty($rows)) {
        $ids = implode(',', array_keys($rows));
        $grs = mysqli_query($conn, "
            SELECT g.*
            FROM grades g
            WHERE g.student_id IN ($ids)
              AND TRIM(LOWER(REPLACE(g.subject,'ال',''))) = TRIM(LOWER(REPLACE('$subject_esc','ال','')))
        ");
        while($g = mysqli_fetch_assoc($grs)) {
            $sid = $g['student_id'];
            if (isset($rows[$sid])) {
                $old_time = $rows[$sid]['saved_at'] ? strtotime($rows[$sid]['saved_at']) : 0;
                $new_time = $g['saved_at'] ? strtotime($g['saved_at']) : 0;
                if ($new_time >= $old_time) {
                    foreach ($g as $k=>$v) {
                        if (array_key_exists($k,$rows[$sid])) {
                            $rows[$sid][$k] = $v;
                        }
                    }
                }
            }
        }
    }
}
?>
<!DOCTYPE html>
<html lang="ar" dir="rtl">
<head>
<meta charset="UTF-8">
<title>درجات الطلبة — أدمن</title>
<style>
body{font-family:'Cairo',Arial;background:#f6f7fb;margin:0}
.top{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;background:#fff;border-bottom:1px solid #eee}
.container{max-width:1200px;margin:20px auto;padding:0 16px}
.step{background:#fff;border:1px solid #eee;border-radius:16px;box-shadow:0 10px 25px rgba(0,0,0,.05);padding:14px;margin-bottom:16px}
.badge{display:inline-block;background:#f0f4ff;border:1px solid #dbe4ff;padding:6px 10px;border-radius:8px;margin:4px;text-decoration:none;color:#000}
.btn{display:inline-block;background:#2d6cdf;color:#fff;text-decoration:none;padding:8px 12px;border-radius:10px;margin:4px}
.btn.alt{background:#6c757d}
.btn.save{background:#27ae60}
.btn.excel{background:#1c8b2e}
.btn.all{background:#8b5cf6}
table{width:1800px;border-collapse:collapse;background:#fff;border-radius:12px;overflow:hidden}
th,td{border-bottom:1px solid #eee;padding:6px;text-align:center;font-size:13px;white-space:nowrap}
thead th{background:#f9fafe}
.notice{background:#eaf7ee;border:1px solid #c6efd1;color:#2a7d2e;padding:10px;border-radius:10px;margin-bottom:12px}
.small{font-size:12px;color:#777}
input[type="number"]{width:80px;padding:3px;border:1px solid #ccc;border-radius:4px;text-align:center}
.strike-lowest{background:#ffe6f2 !important;color:#c00 !important;text-decoration:line-through;font-weight:bold}
.class-A { background: #e3f2fd !important; color: #0d47a1; }
.class-B { background: #fff3e0 !important; color: #e65100; }
.class-C { background: #e8f5e9 !important; color: #1b5e20; }
.class-D { background: #f3e5f5 !important; color: #4a148c; }
.class-OTHER { background: #eceff1 !important; color: #263238; }
</style>
</head>
<body>
<div class="top">
  <div><strong>درجات الطلبة (عرض/تحرير) — الأدمن</strong></div>
  <div>
    <a class="btn alt" href="admin_dashboard.php">العودة للوحة</a>
    <a class="btn" href="admin_logout.php">خروج</a>
  </div>
</div>

<div class="container">
<a class="btn all" href="?export_all=1">📘 تصدير كل الدرجات</a>
<?php if($stage && $subject): ?>
<a class="btn excel" href="?stage=<?php echo urlencode($stage); ?>&subject=<?php echo urlencode($subject); ?>&export=1">⬇️ تصدير درجات المادة المحددة</a>
<?php endif; ?>

<?php if($save_notice!==""):?>
  <div class="notice"><?php echo esc($save_notice);?></div>
<?php endif;?>

<div class="step">
  <div><strong>المرحلة:</strong></div>
  <?php foreach($stages as $st): ?>
    <a class="badge" href="?stage=<?php echo urlencode($st);?>"><?php echo esc($st);?></a>
  <?php endforeach;?>
  <?php if($stage!==''):?>
    <div class="small">المختار: <strong><?php echo esc($stage);?></strong></div>
  <?php endif;?>
</div>

<?php if($stage!==''):?>
<div class="step">
  <div><strong>المادة:</strong></div>
  <?php if(count($subjects)===0): ?>
    <div class="small">لا توجد مواد.</div>
  <?php else: ?>
    <?php foreach($subjects as $sub): ?>
      <a class="badge" href="?stage=<?php echo urlencode($stage);?>&subject=<?php echo urlencode($sub);?>"><?php echo esc($sub);?></a>
    <?php endforeach;?>
  <?php endif;?>
  <?php if($subject != ''): ?>
    <div class="small" style="margin-top:6px;">
      المختار: <strong><?php echo esc($subject);?></strong>
    </div>
  <?php endif; ?>
</div>
<?php endif;?>

<?php if($stage!=='' && $subject!=='' && count($rows)>0): ?>
<form method="post" class="step">
  <input type="hidden" name="do_save" value="1">
  <input type="hidden" name="stage" value="<?php echo esc($stage);?>">
  <input type="hidden" name="subject" value="<?php echo esc($subject);?>">
  <div class="small" style="margin-bottom:8px;">
    ✅ ملاحظة: يتم شطب أقل درجة في كل فصل (إذا وُجد يومي)، ويتم حساب المعدل السنوي = (ف1 + ف2 + نصف السنة) ÷ 3 تلقائيًا، ثم يتم حساب النتيجة = (درجة الامتحان النهائي + المعدل السنوي) ÷ 2.
  </div>
  <div style="overflow-x:auto;">
  <table>
    <thead>
      <tr>
        <th>اسم الطالب</th><th>الشعبة</th><th>درجة الامتحان النهائي</th>
        <th>ش1</th><th>ش2</th><th>ش3</th><th>اليومي ف1</th><th>ف1</th>
        <th>نصف السنة</th>
        <th>ش1 (ف2)</th><th>ش2 (ف2)</th><th>ش3 (ف2)</th><th>اليومي ف2</th><th>ف2</th>
        <th>المعدل السنوي</th><th>النتيجة</th><th>📅 تاريخ الحفظ</th>
      </tr>
    </thead>
    <tbody>
    <?php foreach($rows as $sid => $r): ?>
      <?php
        $m1  = (float)$r['month1'];
        $m2  = (float)$r['month2'];
        $m3  = (float)$r['month3'];
        $d1  = (float)$r['daily1'];
        $mid = (float)$r['midterm'];
        $m4  = (float)$r['month4'];
        $m5  = (float)$r['month5'];
        $m6  = (float)$r['month6'];
        $d2  = (float)$r['daily2'];

        // 🔹 فصل أول (حساب + تقريب)
        $use_special_sem1 = use_special_sem1_rule($stage, $subject);
        $used_special1 = false;

        // ✅ منطق خاص: إذا كان اليومي1 = 0 أو فارغ، نحذف أقل شهر من (ش1/ش2/ش3) ثم (الباقي ÷ 2)
        if ($use_special_sem1 && $d1 <= 0) {
            $used_special1 = true;
            $tmp = sem1_best2_months($m1, $m2, $m3);
            $sem1_display = $tmp[0];

            // ✅ شطب أقل شهر فقط إذا كانت أشهر الفصل الأول الثلاثة موجودة فعلياً
            $presentM = 0;
            foreach (array('month1','month2','month3') as $kk) {
                if (!($r[$kk] === null || $r[$kk] === '')) $presentM++;
            }
            $min_key1 = ($presentM == 3 ? $tmp[1] : null);

        } elseif ($d1 > 0) {
            $firstVals = array('month1'=>$m1,'month2'=>$m2,'month3'=>$m3,'daily1'=>$d1);
            $min_key1 = null; $min_val1 = null;
            foreach ($firstVals as $k=>$v) {
                if ($min_val1 === null || $v < $min_val1) {
                    $min_val1 = $v;
                    $min_key1 = $k;
                }
            }
            $sem1_display = top3_avg_admin(array($m1,$m2,$m3,$d1));
        } else {
            $min_key1 = null;
            $sem1_display = round(($m1+$m2+$m3)/3,2);
        }

        // ✅ (إضافة) إذا كان للطالب درجتان فقط في الفصل الأول (أي شهرين أو شهر+يومي1) => نجمع ونقسم على 2
        $twoOnly1d = avg_if_two_only(array($m1, $m2, $m3, $d1));
        if ($twoOnly1d !== null) {
            $sem1_display = $twoOnly1d;
            // لا شطب عند اعتماد درجتين فقط (إلا في المنطق الخاص)
            if (!$used_special1) {
                $min_key1 = null;
            }
        }

        $sem1_display = round_half_up_int($sem1_display);

        // 🔹 فصل ثاني (حسب القاعدة الجديدة المطلوبة)
        $special_sem2 = special_sem2_calc($stage, $subject, $m4, $m5, $m6, $d2);
        if ($special_sem2 !== null) {
            $min_key2 = null;
            $sem2_display = $special_sem2;
        } else {
            if ($d2 > 0) {
                $secondVals = array('month4'=>$m4,'month5'=>$m5,'month6'=>$m6,'daily2'=>$d2);
                $min_key2 = null; $min_val2 = null;
                foreach ($secondVals as $k=>$v) {
                    if ($min_val2 === null || $v < $min_val2) {
                        $min_val2 = $v;
                        $min_key2 = $k;
                    }
                }
                // ✅ المنطق الافتراضي القديم لباقي الصفوف غير المشمولة بالتعديل
                $cnt2 = 0;

                $sum2 = 0;

                foreach ($secondVals as $vv) {

                    if ($vv > 0) { $cnt2++; $sum2 += $vv; }

                }

                if ($cnt2 == 3) {

                    // تحديد الأقل من القيم الثلاثة الموجودة (للشطب)

                    $min_key2 = null; $min_val2 = null;

                    foreach ($secondVals as $k=>$vv) {

                        if ($vv > 0) {

                            if ($min_val2 === null || $vv < $min_val2) { $min_val2 = $vv; $min_key2 = $k; }

                        }

                    }

                    $sem2_display = round(($sum2 - $min_val2) / 2, 2);

                } else {

                    $sem2_display = top3_avg_admin(array($m4,$m5,$m6,$d2));

                }
            } else {
                $min_key2 = null;
                $sem2_display = round(($m4+$m5+$m6)/3,2);
            }

            // ✅ (إضافة) إذا كان للطالب درجتان فقط في الفصل الثاني (أي شهرين أو شهر+يومي2) => نجمع ونقسم على 2
            $twoOnly2d = avg_if_two_only(array($m4, $m5, $m6, $d2));
            if ($twoOnly2d !== null) {
                $sem2_display = $twoOnly2d;
                // لا شطب عند اعتماد درجتين فقط
                $min_key2 = null;
            }

            // ✅ إذا كانت هناك درجة واحدة فقط في الفصل الثاني => نقسمها على 2
            $oneOnly2d = avg_if_one_only(array($m4, $m5, $m6, $d2));
            if ($oneOnly2d !== null) {
                $sem2_display = $oneOnly2d;
                // لا شطب عند اعتماد درجة واحدة فقط
                $min_key2 = null;
            }
        }

        $sem2_display = round_half_up_int($sem2_display);

        $annual_disp = round_half_up_int(($sem1_display + $sem2_display + $mid)/3);
        $final_exam_raw_display = isset($r['final_exam']) ? $r['final_exam'] : '';
        $final_result_disp = calc_final_result_from_exam($annual_disp, $final_exam_raw_display);

        // تلوين الشعبة
        $cls = trim($r['class']);
        $cls_up = strtoupper($cls);
        if ($cls_up == 'A' || $cls_up == 'أ' || $cls_up == 'آ') {
            $class_color = 'class-A';
        } elseif ($cls_up == 'B' || $cls_up == 'ب') {
            $class_color = 'class-B';
        } elseif ($cls_up == 'C' || $cls_up == 'ج') {
            $class_color = 'class-C';
        } elseif ($cls_up == 'D' || $cls_up == 'د') {
            $class_color = 'class-D';
        } else {
            $class_color = 'class-OTHER';
        }
      ?>
      <tr>
        <td><?php echo esc($r['name']);?></td>
        <td class="<?php echo $class_color;?>"><?php echo esc($r['class']);?></td>
        <td><input type="number" step="0.01" name="grades[<?php echo $sid;?>][final_exam]" value="<?php echo esc(fmt_num($final_exam_raw_display));?>"></td>

        <td><input type="number" step="0.01" name="grades[<?php echo $sid;?>][month1]" value="<?php echo esc(fmt_num($r['month1']));?>" <?php echo (isset($min_key1) && $min_key1=='month1'?'class="strike-lowest"':''); ?>></td>
        <td><input type="number" step="0.01" name="grades[<?php echo $sid;?>][month2]" value="<?php echo esc(fmt_num($r['month2']));?>" <?php echo (isset($min_key1) && $min_key1=='month2'?'class="strike-lowest"':''); ?>></td>
        <td><input type="number" step="0.01" name="grades[<?php echo $sid;?>][month3]" value="<?php echo esc(fmt_num($r['month3']));?>" <?php echo (isset($min_key1) && $min_key1=='month3'?'class="strike-lowest"':''); ?>></td>
        <td><input type="number" step="0.01" name="grades[<?php echo $sid;?>][daily1]" value="<?php echo esc(fmt_num($r['daily1']));?>" <?php echo (isset($min_key1) && $min_key1=='daily1'?'class="strike-lowest"':''); ?>></td>
        <td><input type="number" step="0.01" value="<?php echo esc($sem1_display);?>" readonly></td>

        <td><input type="number" step="0.01" name="grades[<?php echo $sid;?>][midterm]" value="<?php echo esc(fmt_num($r['midterm']));?>"></td>

        <td><input type="number" step="0.01" name="grades[<?php echo $sid;?>][month4]" value="<?php echo esc(fmt_num($r['month4']));?>" <?php echo (isset($min_key2) && $min_key2=='month4'?'class="strike-lowest"':''); ?>></td>
        <td><input type="number" step="0.01" name="grades[<?php echo $sid;?>][month5]" value="<?php echo esc(fmt_num($r['month5']));?>" <?php echo (isset($min_key2) && $min_key2=='month5'?'class="strike-lowest"':''); ?>></td>
        <td><input type="number" step="0.01" name="grades[<?php echo $sid;?>][month6]" value="<?php echo esc(fmt_num($r['month6']));?>" <?php echo (isset($min_key2) && $min_key2=='month6'?'class="strike-lowest"':''); ?>></td>
        <td><input type="number" step="0.01" name="grades[<?php echo $sid;?>][daily2]" value="<?php echo esc(fmt_num($r['daily2']));?>" <?php echo (isset($min_key2) && $min_key2=='daily2'?'class="strike-lowest"':''); ?>></td>
        <td><input type="number" step="0.01" value="<?php echo esc($sem2_display);?>" readonly></td>

        <td><input type="number" step="0.01" value="<?php echo esc(fmt_num($annual_disp));?>" readonly></td>
        <td><input type="number" step="0.01" value="<?php echo esc(fmt_num($final_result_disp));?>" readonly></td>
        <td><?php echo $r['saved_at'] ? date("Y-m-d H:i", strtotime($r['saved_at'])) : "-"; ?></td>
      </tr>
    <?php endforeach; ?>
    </tbody>
  </table>
  </div>
  <button class="btn save" type="submit">💾 حفظ الدرجات</button>
</form>
<?php endif;?>
</div>
</body>
</html>
