<?php
/**
 * إعدادات قاعدة البيانات
 */

// إعدادات قاعدة البيانات
define('DB_HOST', 'localhost');
define('DB_NAME', 'university');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DB_CHARSET', 'utf8mb4');




define('REMEMBER_ME_TIMEOUT', 604800); // أسبوع واحد

// إعدادات النظام
define('SITE_NAME', 'نظام إدارة الجامعة');
// ✅ تم تعديل هذا السطر لجعل SITE_URL ديناميكيًا
define('SITE_URL', 'http://' . $_SERVER['HTTP_HOST'] . '/university'); 

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

// إعدادات الأمان
define('SESSION_TIMEOUT', 500); // ساعة واحدة
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']);

/**
 * فئة الاتصال بقاعدة البيانات
 */
 
// اسم جلسة مخصص للنظام الأول
if (session_status() === PHP_SESSION_NONE) {
    session_name("dialysis_hrms");
    session_start();
}
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 select($query, $params = []) {
        try {
            $stmt = $this->connection->prepare($query);
            $stmt->execute($params);
            return $stmt->fetchAll();
        } catch (PDOException $e) {
            error_log("خطأ في استعلام SELECT: " . $e->getMessage());
            return false;
        }
    }
    
    /**
     * تنفيذ استعلام SELECT لسجل واحد
     */
    public function selectOne($query, $params = []) {
        try {
            $stmt = $this->connection->prepare($query);
            $stmt->execute($params);
            return $stmt->fetch();
        } catch (PDOException $e) {
            error_log("خطأ في استعلام SELECT: " . $e->getMessage());
            return false;
        }
    }
    
    /**
     * تنفيذ استعلام INSERT
     */
    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("خطأ في استعلام INSERT: " . $e->getMessage());
            return false;
        }
    }

    
    
    /**
     * تنفيذ استعلام UPDATE
     */
    public function update($query, $params = []) {
        try {
            $stmt = $this->connection->prepare($query);
            $stmt->execute($params);
            return $stmt->rowCount();
        } catch (PDOException $e) {
            error_log("خطأ في استعلام UPDATE: " . $e->getMessage());
            return false;
        }
    }
    
    /**
     * تنفيذ استعلام DELETE
     */
    public function delete($query, $params = []) {
        try {
            $stmt = $this->connection->prepare($query);
            $stmt->execute($params);
            return $stmt->rowCount();
        } catch (PDOException $e) {
            error_log("خطأ في استعلام DELETE: " . $e->getMessage());
            return false;
        }
    }
    
    /**
     * بدء معاملة
     */
    public function beginTransaction() {
        return $this->connection->beginTransaction();
    }
    
    /**
     * تأكيد المعاملة
     */
    public function commit() {
        return $this->connection->commit();
    }
    
    /**
     * إلغاء المعاملة
     */
    public function rollback() {
        return $this->connection->rollback();
    }
}

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

function hasModuleAccess($moduleName) {
    if (!isset($_SESSION['user_id'])) {
        return false;
    }

    $db = getDB(); // افتراض أن 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 = ?", // الربط مع عمود 'module' مباشرة
        [$_SESSION['user_id'], $moduleName]
    );
    
    return $result && $result['count'] > 0;
}

function logAction($db, $table, $recordId, $userId, $oldData = [], $newData = [], $action = 'UPDATE') {
    $operationType = strtoupper($action);

    $oldJson = ($operationType === 'INSERT') ? NULL : json_encode($oldData, JSON_UNESCAPED_UNICODE);
    $newJson = ($operationType === 'DELETE') ? NULL : json_encode($newData, JSON_UNESCAPED_UNICODE);

    $sql = "INSERT INTO log_file (table_name, record_id, operation_type, old_data, new_data, modified_by)
            VALUES (?, ?, ?, ?, ?, ?)";
    
    $db->insert($sql, [
        $table,
        $recordId,
        $operationType,
        $oldJson,
        $newJson,
        $userId
    ]);
}


?>
