<?php
/**
 * إعدادات قاعدة البيانات والنظام
 */
// إعدادات قاعدة البيانات
define('DB_HOST', 'localhost');
define('DB_NAME', 'hrms_system');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DB_CHARSET', 'utf8mb4');

// إعدادات النظام
define('SITE_NAME', 'نظام إدارة الموارد البشرية');
// تأكد أن /hrms_system هو المسار الصحيح لمجلد مشروعك داخل جذر الويب
define('SITE_URL', 'http://' . $_SERVER['HTTP_HOST'] . '/hrms_system'); 

define('UPLOAD_PATH', __DIR__ . '/../uploads/');
define('UPLOAD_URL', SITE_URL . '/uploads/');

// إعدادات الأمان
define('SESSION_TIMEOUT', 3600);
define('PASSWORD_MIN_LENGTH', 6);
define('MAX_LOGIN_ATTEMPTS', 5);

// إعدادات الملفات
define('MAX_FILE_SIZE', 10 * 1024 * 1024);
define('ALLOWED_FILE_TYPES', ['pdf', 'doc', 'docx', 'jpg', 'jpeg', 'png', 'gif']);

/**
 * فئة الاتصال بقاعدة البيانات
 */
class Database {
    private static $instance = null;
    private $connection;
    
    private function __construct() {
        try {
            $dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=" . DB_CHARSET;
            $options = [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_EMULATE_PREPARES => false,
                PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"
            ];
            
            $this->connection = new PDO($dsn, DB_USER, DB_PASS, $options);
        } catch (PDOException $e) {
            // يمكن تحسين هذه الرسالة في بيئة الإنتاج
            die("خطأ في الاتصال بقاعدة البيانات: " . $e->getMessage());
        }
    }
    
    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    public function getConnection() {
        return $this->connection;
    }
}

/**
 * دالة مساعدة للحصول على اتصال قاعدة البيانات
 */
function getDB() {
    return Database::getInstance();
}

/**
 * دالة للتحقق من صلاحيات المستخدم (مثال مبسط)
 * يجب أن تكون هذه الدالة جزءاً من نظام مصادقة فعال
 */
function checkLogin() {
    // يجب أن يكون session_start() قد تم استدعاؤه في header.php
    // إذا لم يكن كذلك، قم بإزالته من هنا أو تأكد من استدعائه مرة واحدة فقط.
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
    if (!isset($_SESSION['user_id'])) {
        header('Location: ' . SITE_URL . '/pages/auth/login.php');
        exit();
    }
}

/**
 * دالة للتحقق من الصلاحية (مثال مبسط)
 * يجب أن تتكامل هذه الدالة مع نظام الصلاحيات الفعلي في قاعدة البيانات
 */
function hasPermission($permissionName) {
    // هذا مثال بسيط، يجب استبداله بالتحقق الفعلي من قاعدة البيانات
    return isset($_SESSION['user_id']) && $_SESSION['user_id'] > 0; // افتراض أن أي مستخدم مسجل الدخول لديه هذه الصلاحية للمثال
}


// ----------------------------------------------------------------------------------
// الكود الخاص بعملية استعادة البيانات فقط
// ----------------------------------------------------------------------------------

$pageTitle = 'استعادة البيانات فقط'; // تعريف عنوان الصفحة هنا حيث أن هذا الملف هو صفحة كاملة
?>
<!DOCTYPE html>
<html lang="ar" dir="rtl">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title><?php echo htmlspecialchars($pageTitle); ?> - <?php echo SITE_NAME; ?></title>
    <!-- Bootstrap CSS -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
    <!-- Font Awesome for icons -->
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
    <!-- Custom CSS (if you have one, specify the path) -->
    <!-- <link rel="stylesheet" href="<?php echo SITE_URL; ?>/assets/css/style.css"> -->
</head>
<body class="bg-light">

<?php
// التحقق من الصلاحيات بعد بدء الجلسة وتحميل الدوال
checkLogin();
if (!hasPermission('system_settings')) {
    header('Location: ' . SITE_URL . '/pages/errors/access_denied.php');
    exit();
}

$errors = [];
$success_message = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['restore_db_data_only'])) {
    if (isset($_FILES['restore_file']) && $_FILES['restore_file']['error'] === UPLOAD_ERR_OK) {
        $file_tmp_name = $_FILES['restore_file']['tmp_name'];
        $file_name = $_FILES['restore_file']['name'];
        $file_ext = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));

        if ($file_ext !== 'sql') {
            $errors[] = "نوع الملف غير مدعوم. يرجى رفع ملف بصيغة SQL.";
        } else {
            // مسار مؤقت لحفظ ملف SQL المرفوع
            $temp_upload_dir = sys_get_temp_dir() . DIRECTORY_SEPARATOR;
            $temp_sql_file = $temp_upload_dir . uniqid('restore_data_') . '.sql';

            if (move_uploaded_file($file_tmp_name, $temp_sql_file)) {
                try {
                    $db_connection = getDB()->getConnection(); // الحصول على اتصال PDO

                    // 1. 💡 تعطيل فحص المفاتيح الخارجية قبل تفريغ الجداول
                    $db_connection->exec("SET FOREIGN_KEY_CHECKS = 0;");

                    // 2. 💡 تفريغ جميع الجداول الحالية في قاعدة البيانات
                    $tables = $db_connection->query("SHOW TABLES")->fetchAll(PDO::FETCH_COLUMN);
                    foreach ($tables as $table) {
                        // استخدام TRUNCATE لإزالة جميع البيانات بسرعة
                        $db_connection->exec("TRUNCATE TABLE `" . $table . "`");
                    }

                    // 3. 💡 بناء أمر استعادة البيانات باستخدام أداة 'mysql' السطرية
                    // المسار لأداة mysql (قد تحتاج لتعديله ليناسب إعدادات الخادم الخاص بك)
                    $mysql_path = 'C:\\xampp\\mysql\\bin\\mysql.exe'; // ⚡️ قم بتعديل هذا المسار إذا كان مختلفًا!

                    $command = escapeshellarg($mysql_path) . " -h " . escapeshellarg(DB_HOST) .
                               " -u " . escapeshellarg(DB_USER);
                    
                    if (!empty(DB_PASS)) {
                        $command .= " -p" . escapeshellarg(DB_PASS);
                    }
                    
                    $command .= " " . escapeshellarg(DB_NAME) .
                               " < " . escapeshellarg($temp_sql_file) . " 2>&1"; // توجيه stderr لـ stdout للتقاط الأخطاء

                    // تنفيذ الأمر
                    $output = [];
                    $return_var = 0;
                    exec($command, $output, $return_var);

                    // 4. 💡 إعادة تفعيل فحص المفاتيح الخارجية بعد الانتهاء من الاستعادة
                    $db_connection->exec("SET FOREIGN_KEY_CHECKS = 1;");

                    // التحقق من نجاح العملية
                    if ($return_var === 0) {
                        $success_message = "تم استعادة البيانات بنجاح، بعد حذف البيانات القديمة.";
                    } else {
                        $errors[] = "حدث خطأ أثناء استعادة البيانات. رمز الخطأ: " . $return_var;
                        $errors[] = "تفاصيل الخطأ: " . implode('<br>', $output);
                    }

                } catch (Exception $e) {
                    // في حالة حدوث خطأ، تأكد من إعادة تفعيل المفاتيح الخارجية
                    try {
                        $db_connection->exec("SET FOREIGN_KEY_CHECKS = 1;");
                    } catch (Exception $e2) {
                        error_log("Failed to re-enable FOREIGN_KEY_CHECKS during error: " . $e2->getMessage());
                    }
                    $errors[] = 'خطأ غير متوقع أثناء الاستعادة: ' . $e->getMessage();
                } finally {
                    // حذف الملف المؤقت بعد الانتهاء
                    if (file_exists($temp_sql_file)) {
                        unlink($temp_sql_file);
                    }
                }
            } else {
                $errors[] = "حدث خطأ أثناء نقل الملف المرفوع.";
            }
        }
    } else {
        $errors[] = "يرجى اختيار ملف SQL لتحميله.";
    }
}
?>

<div class="container-fluid py-5">
    <div class="row justify-content-center">
        <div class="col-lg-8 col-md-10">
            <div class="card shadow-lg border-0 rounded-lg mt-5">
                <div class="card-header bg-primary text-white text-center py-4">
                    <h3 class="card-title my-0"><?php echo htmlspecialchars($pageTitle); ?></h3>
                </div>
                <div class="card-body p-4">
                    <?php if (!empty($errors)): ?>
                        <div class="alert alert-danger alert-dismissible fade show" role="alert">
                            <h4 class="alert-heading">خطأ!</h4>
                            <ul>
                                <?php foreach ($errors as $error): ?>
                                    <li><?php echo htmlspecialchars($error); ?></li>
                                <?php endforeach; ?>
                            </ul>
                            <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
                        </div>
                    <?php endif; ?>

                    <?php if (!empty($success_message)): ?>
                        <div class="alert alert-success alert-dismissible fade show" role="alert">
                            <?php echo htmlspecialchars($success_message); ?>
                            <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
                        </div>
                    <?php endif; ?>

                    <div class="alert alert-warning border-warning" role="alert">
                        <i class="fas fa-exclamation-triangle me-2"></i>
                        <strong>تحذير هام:</strong> هذه العملية ستقوم بـ **حذف جميع البيانات الموجودة حالياً** في جداول قاعدة البيانات الخاصة بك قبل استعادة البيانات من الملف المرفوع. تأكد من أنك تملك نسخة احتياطية كاملة حديثة قبل المتابعة.
                    </div>

                    <form action="" method="POST" enctype="multipart/form-data">
                        <input type="hidden" name="restore_db_data_only" value="1">
                        <h5 class="mb-3">استعادة ملف SQL يحتوي على البيانات فقط (بعد حذف البيانات الحالية)</h5>
                        <div class="form-group mb-3">
                            <label for="restore_file" class="form-label">اختر ملف SQL للاستعادة:</label>
                            <input type="file" class="form-control" id="restore_file" name="restore_file" accept=".sql" required>
                        </div>
                        <div class="d-grid mt-4">
                            <button type="submit" class="btn btn-danger btn-lg" onclick="return confirm('هل أنت متأكد تمامًا؟ هذه العملية ستحذف جميع البيانات الحالية في قاعدة البيانات قبل الاستعادة!');">
                                <i class="fas fa-trash-can me-2"></i> حذف البيانات الحالية واستعادة البيانات المحددة
                            </button>
                        </div>
                    </form>
                </div>
                <div class="card-footer text-center py-3 bg-light">
                    <a href="<?php echo SITE_URL; ?>/pages/settings/index.php?tab=db_management" class="btn btn-secondary btn-sm">
                        <i class="fas fa-arrow-right-from-bracket me-2"></i>العودة إلى الإعدادات
                    </a>
                </div>
            </div>
        </div>
    </div>
</div>

<!-- Bootstrap JS Bundle with Popper -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>

</body>
</html>
