<?php
/**
 * نظام الصلاحيات المتقدم - Advanced Permissions System
 * 
 * هذا الملف يوفر دوال إضافية لنظام الصلاحيات للتحكم في:
 * 1. الأزرار والعناصر (Buttons & Elements)
 * 2. التصديرات (Exports: PDF, Excel)
 * 3. الطباعة (Print)
 * 4. الإجراءات (Actions: Add, Edit, Delete)
 * 
 * ملاحظة: الدوال الأساسية hasPermission() و requirePermission() موجودة في functions.php
 */

/**
 * حماية صفحة كاملة بصلاحية معينة
 * استخدم هذه الدالة في بداية أي صفحة تريد حمايتها
 * 
 * @param string $permission الصلاحية المطلوبة
 * @param string $page_name اسم الصفحة (للتسجيل)
 */
function protectPage($permission, $page_name = '') {
    // التحقق من تسجيل الدخول
    if (!isset($_SESSION['user_id'])) {
        redirect('login.php');
    }
    
    // التحقق من الصلاحية
    if (!hasPermission($permission)) {
        // تسجيل محاولة الوصول غير المصرح بها
        if ($page_name && isset($_SESSION['user_id'])) {
            try {
                global $conn;
                if (isset($conn)) {
                    // Verify user exists before logging to avoid FK constraint violation
                    $check = $conn->prepare("SELECT id FROM users WHERE id = ? LIMIT 1");
                    $check->execute([$_SESSION['user_id']]);
                    if ($check->rowCount() > 0) {
                        $stmt = $conn->prepare("INSERT INTO activity_log (user_id, action, table_name, ip_address, user_agent) VALUES (?, ?, ?, ?, ?)");
                        $stmt->execute([
                            $_SESSION['user_id'],
                            'محاولة وصول غير مصرح بها',
                            $page_name,
                            $_SERVER['REMOTE_ADDR'] ?? null,
                            $_SERVER['HTTP_USER_AGENT'] ?? null
                        ]);
                    }
                }
            } catch (Exception $e) {
                // تجاهل الأخطاء
            }
        }
        
        header('Location: access_denied.php');
        exit();
    }
}

/**
 * إنشاء زر إضافة مع التحقق من الصلاحية
 * 
 * @param string $url رابط الإضافة
 * @param string $text نص الزر (افتراضي: "إضافة جديد")
 * @param string $class كلاسات CSS
 * @return string
 */
function addButton($url, $text = 'إضافة جديد', $class = 'btn btn-success') {
    if (!hasPermission('can_add_records')) {
        return '';
    }
    
    return '<a href="' . htmlspecialchars($url) . '" class="' . htmlspecialchars($class) . '">' .
           '<i class="fas fa-plus"></i> ' . htmlspecialchars($text) . '</a>';
}

/**
 * إنشاء زر تعديل مع التحقق من الصلاحية
 * 
 * @param string $url رابط التعديل
 * @param string $text نص الزر (افتراضي: "تعديل")
 * @param string $class كلاسات CSS
 * @return string
 */
function editButton($url, $text = 'تعديل', $class = 'btn btn-warning btn-sm') {
    if (!hasPermission('can_edit_records')) {
        return '';
    }
    
    return '<a href="' . htmlspecialchars($url) . '" class="' . htmlspecialchars($class) . '">' .
           '<i class="fas fa-edit"></i> ' . ($text ? ' ' . htmlspecialchars($text) : '') . '</a>';
}

/**
 * إنشاء زر حذف مع التحقق من الصلاحية
 * 
 * @param string $onclick كود JavaScript للحذف
 * @param string $text نص الزر (افتراضي: "حذف")
 * @param string $class كلاسات CSS
 * @return string
 */
function deleteButton($onclick, $text = 'حذف', $class = 'btn btn-danger btn-sm') {
    if (!hasPermission('can_delete_records')) {
        return '';
    }
    
    return '<button type="button" class="' . htmlspecialchars($class) . '" onclick="' . htmlspecialchars($onclick) . '">' .
           '<i class="fas fa-trash"></i> ' . ($text ? ' ' . htmlspecialchars($text) : '') . '</button>';
}

/**
 * إنشاء زر تصدير Excel مع التحقق من الصلاحية
 * 
 * @param string $url رابط التصدير
 * @param string $text نص الزر (افتراضي: "تصدير Excel")
 * @param string $class كلاسات CSS
 * @return string
 */
function exportExcelButton($url, $text = 'تصدير Excel', $class = 'btn btn-success') {
    if (!hasPermission('can_export')) {
        return '';
    }
    
    return '<a href="' . htmlspecialchars($url) . '" class="' . htmlspecialchars($class) . '">' .
           '<i class="fas fa-file-excel"></i> ' . htmlspecialchars($text) . '</a>';
}

/**
 * إنشاء زر تصدير PDF مع التحقق من الصلاحية
 * 
 * @param string $url رابط التصدير
 * @param string $text نص الزر (افتراضي: "تصدير PDF")
 * @param string $class كلاسات CSS
 * @return string
 */
function exportPDFButton($url, $text = 'تصدير PDF', $class = 'btn btn-danger') {
    if (!hasPermission('can_export')) {
        return '';
    }
    
    return '<a href="' . htmlspecialchars($url) . '" class="' . htmlspecialchars($class) . '">' .
           '<i class="fas fa-file-pdf"></i> ' . htmlspecialchars($text) . '</a>';
}

/**
 * إنشاء زر طباعة مع التحقق من الصلاحية
 * 
 * @param string $text نص الزر (افتراضي: "طباعة")
 * @param string $class كلاسات CSS
 * @param string $onclick كود JavaScript (افتراضي: window.print())
 * @return string
 */
function printButton($text = 'طباعة', $class = 'btn btn-info', $onclick = 'window.print()') {
    if (!hasPermission('can_print')) {
        return '';
    }
    
    return '<button type="button" class="' . htmlspecialchars($class) . '" onclick="' . htmlspecialchars($onclick) . '">' .
           '<i class="fas fa-print"></i> ' . htmlspecialchars($text) . '</button>';
}

/**
 * مجموعة أزرار التصدير والطباعة الكاملة
 * 
 * @param string $excelUrl رابط تصدير Excel
 * @param string $pdfUrl رابط تصدير PDF (اختياري)
 * @param bool $showPrint إظهار زر الطباعة
 * @param string $containerClass كلاس الحاوية
 * @return string
 */
function exportPrintButtons($excelUrl, $pdfUrl = '', $showPrint = true, $containerClass = 'd-flex gap-2') {
    $buttons = [];
    
    // زر Excel
    if (hasPermission('can_export')) {
        $buttons[] = '<a href="' . htmlspecialchars($excelUrl) . '" class="btn btn-success">' .
                    '<i class="fas fa-file-excel"></i> تصدير Excel</a>';
    }
    
    // زر PDF
    if ($pdfUrl && hasPermission('can_export')) {
        $buttons[] = '<a href="' . htmlspecialchars($pdfUrl) . '" class="btn btn-danger">' .
                    '<i class="fas fa-file-pdf"></i> تصدير PDF</a>';
    }
    
    // زر الطباعة
    if ($showPrint && hasPermission('can_print')) {
        $buttons[] = '<button type="button" class="btn btn-info" onclick="window.print()">' .
                    '<i class="fas fa-print"></i> طباعة</button>';
    }
    
    if (empty($buttons)) {
        return '';
    }
    
    return '<div class="' . htmlspecialchars($containerClass) . '">' . implode("\n", $buttons) . '</div>';
}

/**
 * مجموعة أزرار الإجراءات (تعديل، حذف، عرض)
 * 
 * @param int $recordId معرف السجل
 * @param string $editUrl رابط التعديل
 * @param string $deleteFunction دالة الحذف JavaScript
 * @param array $options خيارات إضافية
 * @return string
 */
function actionButtons($recordId, $editUrl, $deleteFunction, $options = []) {
    $buttons = [];
    
    // زر العرض (اختياري)
    if (isset($options['view_url']) && hasPermission('can_view_records')) {
        $buttons[] = '<a href="' . htmlspecialchars($options['view_url']) . '" class="btn btn-info btn-sm" title="عرض">' .
                    '<i class="fas fa-eye"></i></a>';
    }
    
    // زر التعديل
    if (hasPermission('can_edit_records')) {
        $buttons[] = '<a href="' . htmlspecialchars($editUrl) . '" class="btn btn-warning btn-sm" title="تعديل">' .
                    '<i class="fas fa-edit"></i></a>';
    }
    
    // زر الحذف
    if (hasPermission('can_delete_records')) {
        $confirmMsg = $options['confirm_message'] ?? 'هل أنت متأكد من الحذف؟';
        $buttons[] = '<button type="button" class="btn btn-danger btn-sm" title="حذف" ' .
                    'onclick="if(confirm(\'' . htmlspecialchars($confirmMsg, ENT_QUOTES) . '\')) ' . 
                    htmlspecialchars($deleteFunction) . '(' . intval($recordId) . ')">' .
                    '<i class="fas fa-trash"></i></button>';
    }
    
    if (empty($buttons)) {
        return '<span class="text-muted small">لا توجد إجراءات متاحة</span>';
    }
    
    return '<div class="btn-group" role="group">' . implode("\n", $buttons) . '</div>';
}

/**
 * إخفاء عنصر HTML إذا لم تكن الصلاحية موجودة
 * 
 * @param string $permission الصلاحية المطلوبة
 * @param string $content المحتوى المراد إخفاؤه
 * @return string
 */
function hideIfNoPermission($permission, $content) {
    if (!hasPermission($permission)) {
        return '';
    }
    return $content;
}

/**
 * تعطيل عنصر HTML إذا لم تكن الصلاحية موجودة
 * 
 * @param string $permission الصلاحية المطلوبة
 * @return string سيرجع 'disabled' إذا لم تكن الصلاحية موجودة
 */
function disableIfNoPermission($permission) {
    if (!hasPermission($permission)) {
        return 'disabled';
    }
    return '';
}

/**
 * التحقق من صلاحيات متعددة (يجب توفر جميع الصلاحيات)
 * 
 * @param array $permissions مصفوفة الصلاحيات
 * @return bool
 */
function hasAllPermissions($permissions) {
    foreach ($permissions as $permission) {
        if (!hasPermission($permission)) {
            return false;
        }
    }
    return true;
}

/**
 * التحقق من صلاحيات متعددة (يكفي توفر صلاحية واحدة)
 * 
 * @param array $permissions مصفوفة الصلاحيات
 * @return bool
 */
function hasAnyPermission($permissions) {
    foreach ($permissions as $permission) {
        if (hasPermission($permission)) {
            return true;
        }
    }
    return false;
}

/**
 * عرض رسالة عدم وجود صلاحية
 * 
 * @param string $message الرسالة (اختياري)
 * @return string
 */
function noPermissionMessage($message = 'ليس لديك صلاحية لعرض هذا المحتوى') {
    return '<div class="alert alert-warning text-center">' .
           '<i class="fas fa-exclamation-triangle"></i> ' .
           htmlspecialchars($message) .
           '</div>';
}

/**
 * إنشاء قائمة منسدلة للإجراءات مع الصلاحيات
 * 
 * @param int $recordId معرف السجل
 * @param array $actions مصفوفة الإجراءات
 * @return string
 */
function actionDropdown($recordId, $actions) {
    $items = [];
    
    foreach ($actions as $action) {
        $permission = $action['permission'] ?? 'can_view_records';
        
        if (hasPermission($permission)) {
            $url = str_replace('{id}', $recordId, $action['url']);
            $icon = isset($action['icon']) ? '<i class="' . htmlspecialchars($action['icon']) . '"></i> ' : '';
            $class = $action['class'] ?? '';
            
            $items[] = '<a class="dropdown-item ' . htmlspecialchars($class) . '" href="' . htmlspecialchars($url) . '">' .
                      $icon . htmlspecialchars($action['text']) . '</a>';
        }
    }
    
    if (empty($items)) {
        return '<span class="text-muted small">لا توجد إجراءات</span>';
    }
    
    return '<div class="dropdown">' .
           '<button class="btn btn-sm btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown">' .
           '<i class="fas fa-ellipsis-v"></i>' .
           '</button>' .
           '<ul class="dropdown-menu">' . implode("\n", $items) . '</ul>' .
           '</div>';
}

/**
 * تحميل صلاحيات المستخدم من قاعدة البيانات إلى SESSION
 * 
 * @param PDO $conn اتصال قاعدة البيانات
 * @param int $user_id معرف المستخدم
 * @return bool
 */
function loadUserPermissions($conn, $user_id) {
    try {
        $stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
        $stmt->execute([$user_id]);
        $user = $stmt->fetch(PDO::FETCH_ASSOC);
        
        if (!$user) {
            return false;
        }
        
        // قائمة جميع الصلاحيات
        $permissions = [
            'can_view_dashboard', 'can_view_records', 'can_add_records', 'can_edit_records', 'can_delete_records',
            'can_export', 'can_print', 'can_manage_users', 'can_manage_antibiotics', 'can_manage_patients',
            'can_view_reports', 'can_add_reports', 'can_edit_reports', 'can_delete_reports',
            'can_view_icu', 'can_manage_icu', 'can_view_pharmacy', 'can_manage_pharmacy', 'can_view_kpi',
            'can_access_advanced_search', 'can_view_activity_log', 'can_create_backup'
        ];
        
        // تحميل الصلاحيات في SESSION
        $_SESSION['permissions'] = [];
        foreach ($permissions as $perm) {
            $_SESSION['permissions'][$perm] = isset($user[$perm]) ? $user[$perm] : 0;
        }
        
        return true;
    } catch (Exception $e) {
        return false;
    }
}
?>

