<?php
// generate_student_id.php - نسخة كاملة وآمنة لتوليد رقم الطالب التالي
error_reporting(E_ALL);
ini_set('display_errors', 0); // إيقاف عرض الأخطاء في الإنتاج
session_start();
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');

require 'db.php';
require 'helpers.php';

// تسجيل بدء الطلب
error_log("=== بدء توليد رقم الطالب ===");

// معالجة طلبات OPTIONS (CORS preflight)
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit();
}

try {
    // التحقق من طريقة الطلب
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        throw new Exception('طريقة الطلب غير مسموحة', 405);
    }

    // التحقق من CSRF token للمستخدمين المسجلين
    if (isset($_SESSION['committee_id']) && !isset($_SESSION['csrf_token_skip'])) {
        if (!isset($_POST['csrf_token']) || !isset($_SESSION['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
            error_log("CSRF token mismatch in generate_student_id");
            throw new Exception('رمز التحقق غير صالح', 403);
        }
    }

    // التحقق من وجود البيانات المطلوبة
    if (!isset($_POST['section_id']) || !isset($_POST['batch_id'])) {
        throw new Exception('معرف القسم والدفعة مطلوب', 400);
    }

    $section_id = (int)$_POST['section_id'];
    $batch_id = (int)$_POST['batch_id'];

    // التحقق من صحة القيم
    if ($section_id <= 0 || $batch_id <= 0) {
        throw new Exception('قيم غير صالحة للقسم أو الدفعة', 400);
    }

    // التحقق من وجود القسم في قاعدة البيانات
    $check_section = $mysqli1->prepare("SELECT id FROM sections WHERE id = ? AND deleted_at IS NULL");
    if (!$check_section) {
        throw new Exception('خطأ في قاعدة البيانات', 500);
    }
    $check_section->bind_param('i', $section_id);
    $check_section->execute();
    if ($check_section->get_result()->num_rows === 0) {
        $check_section->close();
        throw new Exception('القسم غير موجود', 404);
    }
    $check_section->close();

    // التحقق من وجود الدفعة في قاعدة البيانات
    $check_batch = $mysqli1->prepare("SELECT id FROM batches WHERE id = ? AND deleted_at IS NULL");
    if (!$check_batch) {
        throw new Exception('خطأ في قاعدة البيانات', 500);
    }
    $check_batch->bind_param('i', $batch_id);
    $check_batch->execute();
    if ($check_batch->get_result()->num_rows === 0) {
        $check_batch->close();
        throw new Exception('الدفعة غير موجودة', 404);
    }
    $check_batch->close();

    // ============================================
    // البحث عن أكبر رقم طالب في نفس القسم والدفعة
    // ============================================
    
    // استعلام للحصول على آخر رقم طالب
    // نستخدم ORDER BY LENGTH لترتيب الأرقام حسب الطول أولاً ثم القيمة
    $query = "SELECT student_id FROM students 
              WHERE section_id = ? AND batch_id = ? AND deleted_at IS NULL 
              ORDER BY LENGTH(student_id) DESC, student_id DESC LIMIT 1";
    
    $stmt = $mysqli1->prepare($query);
    if (!$stmt) {
        error_log("Prepare failed: " . $mysqli1->error);
        throw new Exception('خطأ في إعداد استعلام قاعدة البيانات', 500);
    }
    
    $stmt->bind_param('ii', $section_id, $batch_id);
    
    if (!$stmt->execute()) {
        error_log("Execute failed: " . $stmt->error);
        throw new Exception('خطأ في تنفيذ الاستعلام', 500);
    }
    
    $result = $stmt->get_result();
    $last_student = $result->fetch_assoc();
    $stmt->close();
    
    $max_student_id = $last_student['student_id'] ?? null;
    
    error_log("📊 آخر رقم طالب موجود: " . ($max_student_id ?: 'لا يوجد'));

    // ============================================
    // توليد الرقم التالي
    // ============================================
    
    $next_student_id = '';
    $details = '';
    $pattern_detected = '';
    
    if ($max_student_id) {
        // محاولة استخراج النمط من الرقم الموجود
        // الأنماط المدعومة:
        // 1. أحرف + أرقام (مثال: STU001, CS100)
        // 2. أرقام فقط (مثال: 2023001, 12345)
        // 3. أرقام + أحرف (مثال: 2023CS001)
        
        if (preg_match('/^([A-Za-z]+)(\d+)$/', $max_student_id, $matches)) {
            // النمط: أحرف ثم أرقام (مثال: STU001)
            $prefix = $matches[1];
            $number = (int)$matches[2] + 1;
            
            // الحفاظ على عدد الأصفار في البداية
            $original_length = strlen($matches[2]);
            $next_number = str_pad($number, $original_length, '0', STR_PAD_LEFT);
            
            $next_student_id = $prefix . $next_number;
            $pattern_detected = 'prefix_number';
            $details = "تم زيادة الرقم من {$max_student_id} إلى {$next_student_id}";
            
        } elseif (preg_match('/^(\d+)([A-Za-z]+)$/', $max_student_id, $matches)) {
            // النمط: أرقام ثم أحرف (مثال: 2023CS001)
            $number_part = $matches[1];
            $suffix = $matches[2];
            
            // محاولة استخراج رقم من النهاية
            if (preg_match('/(\d+)$/', $suffix, $num_matches)) {
                $num = (int)$num_matches[1] + 1;
                $num_length = strlen($num_matches[1]);
                $new_suffix = preg_replace('/\d+$/', str_pad($num, $num_length, '0', STR_PAD_LEFT), $suffix);
                $next_student_id = $number_part . $new_suffix;
            } else {
                // إذا لم نجد أرقاماً في اللاحقة، نضيف 1
                $next_student_id = $number_part . $suffix . '1';
            }
            $pattern_detected = 'number_suffix';
            $details = "تم توليد الرقم {$next_student_id} بناءً على {$max_student_id}";
            
        } elseif (preg_match('/^\d+$/', $max_student_id)) {
            // النمط: أرقام فقط
            $number = (int)$max_student_id + 1;
            
            // الحفاظ على نفس عدد الأرقام إذا كان الرقم يبدأ بأصفار
            if (strlen($max_student_id) > 1 && $max_student_id[0] === '0') {
                $next_student_id = str_pad($number, strlen($max_student_id), '0', STR_PAD_LEFT);
            } else {
                $next_student_id = (string)$number;
            }
            
            $pattern_detected = 'numbers_only';
            $details = "تم زيادة الرقم من {$max_student_id} إلى {$next_student_id}";
            
        } else {
            // نمط غير معروف - نستخدم الرقم كاملاً ونحاول زيادة الرقم الأخير
            error_log("⚠️ نمط غير معروف للرقم: {$max_student_id}");
            
            // محاولة العثور على آخر مجموعة أرقام
            if (preg_match('/(\d+)(?!.*\d)/', $max_student_id, $matches)) {
                $last_number = $matches[1];
                $rest = substr($max_student_id, 0, strrpos($max_student_id, $last_number));
                $next_number = (int)$last_number + 1;
                
                // الحفاظ على نفس تنسيق الأرقام
                $next_number_str = str_pad($next_number, strlen($last_number), '0', STR_PAD_LEFT);
                $next_student_id = $rest . $next_number_str;
                $pattern_detected = 'unknown_pattern';
                $details = "تم توليد الرقم {$next_student_id} بناءً على آخر رقم في {$max_student_id}";
            } else {
                // إذا لم نجد أي أرقام، نستخدم التاريخ والرقم العشوائي
                $next_student_id = date('Y') . str_pad(mt_rand(1, 9999), 4, '0', STR_PAD_LEFT);
                $pattern_detected = 'fallback_random';
                $details = "لا يمكن تحديد نمط، تم توليد رقم عشوائي: {$next_student_id}";
            }
        }
    } else {
        // لا يوجد طلاب سابقين - نستخدم الصيغة الافتراضية
        // يمكن تغيير هذه الصيغة حسب احتياجات النظام
        $next_student_id = date('Y') . '0001';
        $pattern_detected = 'first_student';
        $details = "أول طالب في هذا القسم والدفعة، تم توليد الرقم: {$next_student_id}";
    }

    error_log("🔢 الرقم المقترح: {$next_student_id} (النمط: {$pattern_detected})");

    // ============================================
    // التحقق من عدم تكرار الرقم
    // ============================================
    
    $check_query = "SELECT COUNT(*) as count FROM students WHERE student_id = ? AND deleted_at IS NULL";
    $check_stmt = $mysqli1->prepare($check_query);
    if (!$check_stmt) {
        throw new Exception('خطأ في التحقق من الرقم', 500);
    }
    
    $check_stmt->bind_param('s', $next_student_id);
    $check_stmt->execute();
    $check_result = $check_stmt->get_result();
    $check_data = $check_result->fetch_assoc();
    $check_stmt->close();

    if ($check_data['count'] > 0) {
        error_log("⚠️ الرقم {$next_student_id} موجود مسبقاً، البحث عن رقم بديل");
        
        // البحث عن رقم متاح
        $counter = 1;
        $max_attempts = 100;
        $found = false;
        $base_id = $next_student_id;
        
        while ($counter <= $max_attempts && !$found) {
            // محاولة توليد رقم بديل بناءً على النمط
            if (preg_match('/^([A-Za-z]+)(\d+)$/', $base_id, $matches)) {
                // نمط: أحرف + أرقام
                $prefix = $matches[1];
                $number = (int)$matches[2] + $counter;
                $original_length = strlen($matches[2]);
                $candidate = $prefix . str_pad($number, $original_length, '0', STR_PAD_LEFT);
                
            } elseif (preg_match('/^(\d+)$/', $base_id, $matches)) {
                // نمط: أرقام فقط
                $number = (int)$matches[1] + $counter;
                
                // الحفاظ على عدد الأرقام
                if (strlen($base_id) > 1 && $base_id[0] === '0') {
                    $candidate = str_pad($number, strlen($base_id), '0', STR_PAD_LEFT);
                } else {
                    $candidate = (string)$number;
                }
                
            } else {
                // نمط آخر - نضيف الرقم في النهاية
                $candidate = $base_id . '_' . $counter;
            }
            
            // التحقق من عدم وجود الرقم البديل
            $check_stmt = $mysqli1->prepare($check_query);
            $check_stmt->bind_param('s', $candidate);
            $check_stmt->execute();
            $check_result = $check_stmt->get_result();
            $check_data = $check_result->fetch_assoc();
            $check_stmt->close();
            
            if ($check_data['count'] == 0) {
                $next_student_id = $candidate;
                $details = "تم تعديل الرقم لتجنب التكرار إلى {$next_student_id}";
                $found = true;
                error_log("✅ وجد رقم بديل: {$next_student_id}");
                break;
            }
            
            $counter++;
        }
        
        if (!$found) {
            // إذا لم نجد رقماً بعد 100 محاولة، نستخدم uniqid
            $next_student_id = uniqid('STU-');
            $details = "تم توليد رقم عشوائي لتجنب التكرار: {$next_student_id}";
            error_log("⚠️ استخدام رقم عشوائي: {$next_student_id}");
        }
    }

    // ============================================
    // إرجاع النتيجة
    // ============================================
    
    $response = [
        'success' => true,
        'message' => 'تم توليد رقم الطالب بنجاح',
        'next_student_id' => $next_student_id,
        'last_student_id' => $max_student_id,
        'details' => $details,
        'pattern' => $pattern_detected,
        'timestamp' => time()
    ];
    
    error_log("✅ تم توليد الرقم بنجاح: " . json_encode($response));
    echo json_encode($response);

} catch (Exception $e) {
    // ============================================
    // معالجة الأخطاء
    // ============================================
    
    $code = $e->getCode() ?: 500;
    http_response_code($code);
    
    $error_response = [
        'success' => false,
        'message' => $e->getMessage(),
        'code' => $code,
        'timestamp' => time()
    ];
    
    // إضافة تفاصيل أكثر في وضع التطوير
    if (defined('DEVELOPMENT_MODE') && DEVELOPMENT_MODE === true) {
        $error_response['file'] = $e->getFile();
        $error_response['line'] = $e->getLine();
        $error_response['trace'] = $e->getTraceAsString();
    }
    
    error_log("❌ خطأ في generate_student_id: " . $e->getMessage());
    echo json_encode($error_response);
}

error_log("=== انتهاء توليد رقم الطالب ===\n");
?>