<?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;
    }

    /**
     * دالة لتنفيذ استعلام SELECT واحد (لجلب الإعدادات)
     */
    public function selectOne($sql, $params = []) {
        $stmt = $this->connection->prepare($sql);
        $stmt->execute($params);
        return $stmt->fetch(PDO::FETCH_ASSOC);
    }
}

/**
 * دالة مساعدة للحصول على اتصال قاعدة البيانات
 */
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 = '';

// هذا الجزء من الكود سيتم تشغيله تلقائياً عند زيارة الصفحة
// لإنشاء النسخة الاحتياطية وإجبار المتصفح على تنزيلها.
// لا يوجد نموذج POST هنا لأنه يتم التنزيل مباشرة.
try {
    // 💡 جلب مسار أداة mysqldump من إعدادات النظام
    $db_settings_conn = getDB();
    $mysqldump_path_from_db = $db_settings_conn->selectOne("SELECT setting_value FROM system_settings WHERE setting_key = 'mysqldump_path'");
    $mysqldump_path = $mysqldump_path_from_db['setting_value'] ?? 'mysqldump'; // قيمة افتراضية إذا لم يتم العثور عليها

    // التحقق من أن المسار ليس فارغًا
    if (empty($mysqldump_path)) {
        throw new Exception("مسار أداة mysqldump غير محدد في إعدادات النظام. يرجى تحديده في صفحة الإعدادات.");
    }

    $database_name = DB_NAME;
    $filename = 'backup_full_' . $database_name . '_' . date('Y-m-d_H-i-s') . '.sql';

    // تهيئة ترويسات الملف للتنزيل
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="' . $filename . '"');
    header('Content-Transfer-encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');

    // بناء أمر mysqldump كاملاً
    // 2>&1 يقوم بتوجيه stderr (الأخطاء) إلى stdout (الإخراج العادي)
    $command = escapeshellarg($mysqldump_path) . " --opt -h " . escapeshellarg(DB_HOST) .
               " -u " . escapeshellarg(DB_USER);
    
    if (!empty(DB_PASS)) {
        $command .= " -p" . escapeshellarg(DB_PASS); // -p بدون مسافة مباشرة قبل كلمة المرور
    }
    
    $command .= " " . escapeshellarg(DB_NAME) . " 2>&1"; // ⚡️ توجيه الأخطاء إلى الإخراج العادي

    // تنفيذ الأمر وتوجيه الخرج مباشرة إلى متصفح المستخدم
    // بدلاً من exec() ثم echo، نستخدم passthru() لتوجيه الخرج مباشرة
    // هذا أفضل للتعامل مع ملفات النسخ الاحتياطي الكبيرة بكفاءة.
    passthru($command, $return_var);

    if ($return_var !== 0) {
        // إذا حدث خطأ، يجب أن يتم تسجيله لأن passthru() قد لا يعرضه مباشرة للمستخدم
        error_log("mysqldump فشل برمز الخطأ {$return_var} أثناء النسخ الاحتياطي الكامل.");
        // يمكننا أيضاً إعادة توجيه المستخدم لصفحة خطأ أو عرض رسالة
        // يجب أن يتم إرسال أي محتوى قبل header('Location')
        echo "<script>alert('حدث خطأ أثناء إنشاء النسخة الاحتياطية. يرجى مراجعة سجلات الخادم.'); window.location.href = '" . SITE_URL . "/pages/settings/index.php?tab=db_management';</script>";
        exit();
    }

    exit(); // إنهاء السكريبت بعد إرسال الملف

} catch (Exception $e) {
    // سجل الخطأ وتوقف مع رسالة تفصيلية
    error_log("Database full backup failed: " . $e->getMessage());
    // يجب التعامل مع الأخطاء قبل إرسال الترويسات
    // هذه الرسالة ستظهر إذا كان الخطأ قبل passthru
    echo "<script>alert('حدث خطأ أثناء إنشاء النسخة الاحتياطية: " . htmlspecialchars($e->getMessage()) . "'); window.location.href = '" . SITE_URL . "/pages/settings/index.php?tab=db_management';</script>";
    exit();
}
?>

<!-- 
    ملاحظة: بما أن هذه الصفحة تقوم بتنزيل ملف SQL مباشرة، 
    فإن محتوى HTML أدناه لن يتم عرضه للمستخدم في حالة النجاح.
    سيتم عرضه فقط في حالة حدوث خطأ قبل عملية التنزيل أو إذا تم تغيير منطق التنزيل.
-->
<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-info border-info" role="alert">
                        <i class="fas fa-info-circle me-2"></i>
                        <strong>ملاحظة:</strong> سيتم تنزيل ملف النسخ الاحتياطي الكامل تلقائياً عند زيارة هذه الصفحة.
                    </div>
                </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>
