<?php
/**
 * هذا الملف يحتوي على جميع إعدادات النظام الأساسية،
 * وفئة الاتصال بقاعدة البيانات، ودوال مساعدة.
 * يُنصح بتضمينه في جميع الصفحات التي تحتاج إلى الوصول إلى قاعدة البيانات.
 */

// -----------------------------------------------------------
// 1. إعدادات النظام وقاعدة البيانات
// -----------------------------------------------------------

// إعدادات قاعدة البيانات (يجب أن تكون سرية)
define('DB_HOST', 'localhost:3306');
define('DB_NAME', 'lialis_hrms_system');
define('DB_USER', 'lialis');
define('DB_PASS', ',]O1f8)-6r8n');
define('DB_CHARSET', 'utf8mb4');

// إعدادات النظام العامة
define('SITE_NAME', 'نظام إدارة الموارد البشرية');

// تحديد مسار الموقع بشكل آمن وديناميكي
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
$siteUrl = $protocol . $_SERVER['HTTP_HOST'] . str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);
define('SITE_URL', rtrim($siteUrl, '/'));

// إعدادات المسارات للملفات
// استخدام مصفوفة لتنظيم مسارات التحميل
define('UPLOAD_PATHS', [
    'employee_courses' => __DIR__ . '/../uploads/employee_courses/',
    'documents'        => __DIR__ . '/../uploads/documents/',
    'tracking_updates' => __DIR__ . '/../uploads/tracking_updates/',
    'attachments'      => __DIR__ . '/../uploads/attachments/',
]);

define('UPLOAD_URLS', [
    'employee_courses' => SITE_URL . '/uploads/employee_courses/',
    'documents'        => SITE_URL . '/uploads/documents/',
    'tracking_updates' => SITE_URL . '/uploads/tracking_updates/',
    'attachments'      => SITE_URL . '/uploads/attachments/',
]);

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

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


// -----------------------------------------------------------
// 2. فئة الاتصال بقاعدة البيانات (Singleton Pattern)
// -----------------------------------------------------------
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) {
            // يمكن استخدام تسجيل الأخطاء بدلاً من إيقاف البرنامج مباشرة
            error_log("Database connection error: " . $e->getMessage());
            die("خطأ في الاتصال بقاعدة البيانات. يرجى المحاولة لاحقًا.");
        }
    }
    
    // توفير طريقة واحدة للحصول على كائن الاتصال
    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    // منع استنساخ الكائن
    private function __clone() {}
    public function __wakeup() {}
    
    public function getConnection() {
        return $this->connection;
    }
    
    /**
     * تنفيذ استعلام SELECT
     * @param string $query
     * @param array $params
     * @return array|false
     */
    public function select($query, $params = []) {
        try {
            $stmt = $this->connection->prepare($query);
            $stmt->execute($params);
            return $stmt->fetchAll();
        } catch (PDOException $e) {
            error_log("Error in SELECT query: " . $e->getMessage());
            return false;
        }
    }
    
    /**
     * تنفيذ استعلام SELECT لسجل واحد
     * @param string $query
     * @param array $params
     * @return array|false
     */
    public function selectOne($query, $params = []) {
        try {
            $stmt = $this->connection->prepare($query);
            $stmt->execute($params);
            return $stmt->fetch();
        } catch (PDOException $e) {
            error_log("Error in SELECT ONE query: " . $e->getMessage());
            return false;
        }
    }
    
    /**
     * تنفيذ استعلام INSERT
     * @param string $query
     * @param array $params
     * @return int|false آخر معرف تم إدخاله أو false
     */
    public function insert($query, $params = []) {
        try {
            $stmt = $this->connection->prepare($query);
            $result = $stmt->execute($params);
            return $result ? $this->connection->lastInsertId() : false;
        } catch (PDOException $e) {
            error_log("Error in INSERT query: " . $e->getMessage());
            return false;
        }
    }
    
    /**
     * تنفيذ استعلام UPDATE
     * @param string $query
     * @param array $params
     * @return int|false عدد الصفوف المتأثرة أو false
     */
    public function update($query, $params = []) {
        try {
            $stmt = $this->connection->prepare($query);
            $stmt->execute($params);
            return $stmt->rowCount();
        } catch (PDOException $e) {
            error_log("Error in UPDATE query: " . $e->getMessage());
            return false;
        }
    }
    
    /**
     * تنفيذ استعلام DELETE
     * @param string $query
     * @param array $params
     * @return int|false عدد الصفوف المتأثرة أو false
     */
    public function delete($query, $params = []) {
        try {
            $stmt = $this->connection->prepare($query);
            $stmt->execute($params);
            return $stmt->rowCount();
        } catch (PDOException $e) {
            error_log("Error in DELETE query: " . $e->getMessage());
            return false;
        }
    }
    
    // دوال إدارة المعاملات (Transactions)
    public function beginTransaction() { return $this->connection->beginTransaction(); }
    public function commit() { return $this->connection->commit(); }
    public function rollback() { return $this->connection->rollback(); }
}


// -----------------------------------------------------------
// 3. الدوال المساعدة
// -----------------------------------------------------------

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

/**
 * التحقق من صلاحية وصول المستخدم لوحدة معينة
 * @param string $moduleName
 * @return bool
 */
function hasModuleAccess($moduleName) {
    // يجب بدء الجلسة قبل استخدام $_SESSION
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
    
    if (!isset($_SESSION['user_id'])) {
        return false;
    }
    
    $db = getDB();
    $result = $db->selectOne(
        "SELECT COUNT(*) as count 
         FROM users u
         JOIN user_roles ur ON u.id = ur.user_id
         JOIN role_permissions rp ON ur.role_id = rp.role_id
         JOIN permissions p ON rp.permission_id = p.id
         WHERE u.id = ? AND p.module = ?",
        [$_SESSION['user_id'], $moduleName]
    );
    
    return $result && $result['count'] > 0;
}