<?php
/**
 * نظام صلاحيات الصفحات المتقدم
 * Page Permissions System
 */

class PagePermissions {
    private static $permissions = null;
    private static $userPermissions = null;
    private static $userRole = null;
    
    /**
     * تحميل صلاحيات الصفحات
     */
    private static function loadPermissions() {
        if (self::$permissions === null) {
            $jsonFile = __DIR__ . '/../config/pages_permissions.json';
            if (file_exists($jsonFile)) {
                $json = file_get_contents($jsonFile);
                self::$permissions = json_decode($json, true);
            } else {
                self::$permissions = [];
            }
        }
        return self::$permissions;
    }
    
    /**
     * الحصول على دور المستخدم الحالي
     */
    private static function getUserRole() {
        if (self::$userRole === null) {
            if (isset($_SESSION['role'])) {
                self::$userRole = strtolower($_SESSION['role']);
            } else {
                self::$userRole = 'guest';
            }
        }
        return self::$userRole;
    }
    
    /**
     * تحميل صلاحيات المستخدم من قاعدة البيانات
     */
    private static function loadUserPermissions() {
        if (self::$userPermissions === null) {
            self::$userPermissions = [];
            
            if (!isset($_SESSION['user_id'])) {
                return self::$userPermissions;
            }
            
            try {
                require_once __DIR__ . '/../config/database.php';
                $db = new Database();
                $conn = $db->getConnection();
                
                $stmt = $conn->prepare("SELECT page_name, permission_key FROM user_page_permissions WHERE user_id = ?");
                $stmt->execute([$_SESSION['user_id']]);
                $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
                
                foreach ($rows as $row) {
                    $page = $row['page_name'];
                    $permKey = $row['permission_key'];
                    
                    if (!isset(self::$userPermissions[$page])) {
                        self::$userPermissions[$page] = [];
                    }
                    self::$userPermissions[$page][] = $permKey;
                }
            } catch (Exception $e) {
                error_log("Error loading user permissions: " . $e->getMessage());
            }
        }
        
        return self::$userPermissions;
    }
    
    /**
     * التحقق من صلاحية معينة في صفحة
     * @param string $page اسم الصفحة
     * @param string $permission الصلاحية المطلوبة
     * @return bool
     */
    public static function hasPermission($page, $permission) {
        $role = self::getUserRole();
        
        // Admin له كل الصلاحيات
        if (strtolower($role) === 'admin') {
            return true;
        }
        
        // التحقق من الصلاحيات المخصصة للمستخدم من قاعدة البيانات
        $userPerms = self::loadUserPermissions();
        
        if (isset($userPerms[$page]) && in_array($permission, $userPerms[$page])) {
            return true;
        }
        
        return false;
    }
    
    /**
     * الحصول على كل صلاحيات صفحة معينة للمستخدم الحالي
     * @param string $page اسم الصفحة
     * @return array
     */
    public static function getPagePermissions($page) {
        $role = self::getUserRole();
        
        // Admin له كل الصلاحيات
        if (strtolower($role) === 'admin') {
            $permissions = self::loadPermissions();
            if (isset($permissions['pages'][$page]['permissions'])) {
                return array_keys($permissions['pages'][$page]['permissions']);
            }
        }
        
        // الحصول على صلاحيات المستخدم من قاعدة البيانات
        $userPerms = self::loadUserPermissions();
        
        if (isset($userPerms[$page])) {
            return $userPerms[$page];
        }
        
        return [];
    }
    
    /**
     * الحصول على معلومات صلاحية معينة
     * @param string $page اسم الصفحة
     * @param string $permission الصلاحية
     * @return array|null
     */
    public static function getPermissionInfo($page, $permission) {
        $permissions = self::loadPermissions();
        
        if (isset($permissions['pages'][$page]['permissions'][$permission])) {
            return $permissions['pages'][$page]['permissions'][$permission];
        }
        
        return null;
    }
    
    /**
     * الحصول على كل صلاحيات الصفحة مع معلوماتها
     * @param string $page اسم الصفحة
     * @return array
     */
    public static function getAllPagePermissionsInfo($page) {
        $permissions = self::loadPermissions();
        
        if (isset($permissions['pages'][$page]['permissions'])) {
            return $permissions['pages'][$page]['permissions'];
        }
        
        return [];
    }
    
    /**
     * عرض صندوق الصلاحيات للصفحة
     * @param string $page اسم الصفحة
     * @param string $lang اللغة (ar/en)
     * @return string HTML
     */
    public static function renderPermissionsBox($page, $lang = 'ar') {
        $permissions = self::loadPermissions();
        $userPermissions = self::getPagePermissions($page);
        $allPermissions = self::getAllPagePermissionsInfo($page);
        
        if (empty($allPermissions)) {
            return '';
        }
        
        $pageName = $lang === 'ar' ? 
            ($permissions['pages'][$page]['name_ar'] ?? $page) : 
            ($permissions['pages'][$page]['name_en'] ?? $page);
        
        $html = '<div class="permissions-box">';
        $html .= '<h3 class="permissions-title">';
        $html .= $lang === 'ar' ? '🔑 الصلاحيات الأساسية' : '🔑 Basic Permissions';
        $html .= '</h3>';
        $html .= '<div class="permissions-grid">';
        
        foreach ($allPermissions as $permKey => $permInfo) {
            $hasPermission = in_array($permKey, $userPermissions);
            $disabled = !$hasPermission ? 'disabled' : '';
            $checked = $hasPermission ? 'checked' : '';
            
            $name = $lang === 'ar' ? $permInfo['name_ar'] : $permInfo['name_en'];
            $icon = $permInfo['icon'] ?? '🔹';
            
            $html .= '<div class="permission-item ' . ($hasPermission ? 'enabled' : 'disabled') . '">';
            $html .= '<label>';
            $html .= '<input type="checkbox" ' . $checked . ' ' . $disabled . ' data-permission="' . $permKey . '">';
            $html .= '<span class="permission-icon">' . $icon . '</span>';
            $html .= '<span class="permission-name">' . $name . '</span>';
            $html .= '</label>';
            $html .= '</div>';
        }
        
        $html .= '</div>';
        $html .= '</div>';
        
        return $html;
    }
    
    /**
     * التحقق من إمكانية الوصول للصفحة
     * @param string $page اسم الصفحة
     * @return bool
     */
    public static function canAccessPage($page) {
        $role = self::getUserRole();
        
        // Admin له كل الصلاحيات
        if (strtolower($role) === 'admin') {
            return true;
        }
        
        // السماح بالوصول للوحة التحكم لأي مستخدم مسجل دخول
        if ($page === 'dashboard' && isset($_SESSION['user_id'])) {
            return true;
        }
        
        $userPermissions = self::getPagePermissions($page);
        return !empty($userPermissions);
    }
    
    /**
     * إعادة توجيه إذا لم يكن لديه صلاحية
     * @param string $page اسم الصفحة
     * @param string $permission الصلاحية المطلوبة
     */
    public static function requirePermission($page, $permission) {
        if (!self::hasPermission($page, $permission)) {
            header('Location: access_denied.php');
            exit;
        }
    }
    
    /**
     * إعادة توجيه إذا لم يستطع الوصول للصفحة
     * @param string $page اسم الصفحة
     */
    public static function requirePageAccess($page) {
        if (!self::canAccessPage($page)) {
            header('Location: access_denied.php');
            exit;
        }
    }
}

