<?php
// Enable error display for development purposes
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

$pageTitle = 'عرض الجلسات النشطة';
// يتطلب هذا الملف وجود ملف header.php في المسار الصحيح
include __DIR__ . '/../../includes/header.php';

// التحقق من تسجيل الدخول والصلاحية
checkLogin();
if (!hasPermission('view_sessions')) {
    $_SESSION['error_message'] = 'ليس لديك صلاحية لعرض هذه الصفحة.';
    header('Location: ' . SITE_URL . '/pages/errors/access_denied.php');
    exit();
}

$db = getDB();

// ---------------------------------------------------------------------
// منطق معالجة حذف الجلسات القديمة تلقائياً (أكثر من 5 أيام)
// يتم تشغيل هذا المنطق عند تحميل الصفحة، ولكنه مثالي لجدول زمني (cron job)
// ---------------------------------------------------------------------
if (hasPermission('delete_old_sessions')) { // افتراض صلاحية جديدة لهذا الإجراء
    try {
        $five_days_ago = date('Y-m-d H:i:s', strtotime('-5 days'));
        $sql_delete_old = "DELETE FROM user_sessions WHERE created_at < ? AND expires_at < NOW()";
        $affected_old_sessions = $db->delete($sql_delete_old, [$five_days_ago]);
        if ($affected_old_sessions > 0) {
            // يمكن تسجيل هذا في سجلات النظام بدلاً من رسالة نجاح للمستخدم
            // error_log("تم حذف $affected_old_sessions جلسة قديمة تلقائياً.");
            // لا نعرض رسالة نجاح هنا لتجنب إزعاج المستخدم في كل مرة يزور الصفحة
        }
    } catch (Exception $e) {
        error_log("Database error deleting old sessions: " . $e->getMessage());
        // لا نعرض رسالة خطأ للمستخدم هنا، بل يتم تسجيلها في السجلات
    }
}
// ---------------------------------------------------------------------
// نهاية منطق حذف الجلسات القديمة
// ---------------------------------------------------------------------


// ---------------------------------------------------------------------
// منطق معالجة طلب الحذف اليدوي لجلسة محددة
// ---------------------------------------------------------------------
if (isset($_GET['action']) && $_GET['action'] == 'delete' && isset($_GET['id'])) {
    if (hasPermission('delete_sessions')) {
        $session_id = $_GET['id'];
        if (is_numeric($session_id)) {
            try {
                // منع المستخدم من إنهاء جلسته الحالية عن طريق الخطأ
                if (isset($_SESSION['current_session_id']) && $_SESSION['current_session_id'] == $session_id) {
                    $_SESSION['error_message'] = "لا يمكنك إنهاء جلستك الحالية.";
                } else {
                    $sql = "DELETE FROM user_sessions WHERE id = ?";
                    $affected_rows = $db->delete($sql, [$session_id]);
                    if ($affected_rows > 0) {
                        $_SESSION['success_message'] = "تم إنهاء الجلسة بنجاح.";
                    } else {
                        $_SESSION['error_message'] = "لم يتم العثور على الجلسة أو أنها منتهية بالفعل.";
                    }
                }
            } catch (Exception $e) {
                error_log("Database error deleting session: " . $e->getMessage());
                $_SESSION['error_message'] = "حدث خطأ في قاعدة البيانات أثناء إنهاء الجلسة.";
            }
        } else {
            $_SESSION['error_message'] = 'معرف الجلسة غير صالح.';
        }
    } else {
        $_SESSION['error_message'] = 'ليس لديك صلاحية لإنهاء الجلسات.';
    }

    // إعادة التوجيه لمنع إعادة إرسال النموذج عند تحديث الصفحة
    // لا نمرر معلمات الفلترة هنا لضمان العودة إلى الحالة الافتراضية بعد الحذف
    header('Location: ' . SITE_URL . '/pages/users/sessions_view.php');
    exit();
}
// ---------------------------------------------------------------------
// نهاية منطق الحذف اليدوي
// ---------------------------------------------------------------------

$sessions = [];
$filter_date = '';
$sql_params = [];
$where_clauses = [];

// Pagination settings
const SESSIONS_PER_PAGE = 10; // عدد الجلسات في كل صفحة
$current_page = isset($_GET['page']) && is_numeric($_GET['page']) ? (int)$_GET['page'] : 1;
$offset = ($current_page - 1) * SESSIONS_PER_PAGE;

// معالجة البحث عن التاريخ
if (isset($_GET['filter_date']) && !empty($_GET['filter_date'])) {
    $filter_date = $_GET['filter_date'];
    $where_clauses[] = "DATE(s.created_at) = ?";
    $sql_params[] = $filter_date;
} elseif (isset($_GET['filter_today'])) {
    $filter_date = date('Y-m-d'); // تعيين تاريخ اليوم
    $where_clauses[] = "DATE(s.created_at) = ?";
    $sql_params[] = $filter_date;
}

try {
    // الاستعلام الأساسي لجلب العدد الكلي للجلسات (لتقسيم الصفحات)
    $count_sql = "SELECT COUNT(s.id) as total FROM user_sessions s";
    if (!empty($where_clauses)) {
        $count_sql .= " WHERE " . implode(" AND ", $where_clauses);
    }
    $total_sessions_result = $db->selectOne($count_sql, $sql_params);
    $total_sessions = $total_sessions_result['total'] ?? 0;
    $total_pages = ceil($total_sessions / SESSIONS_PER_PAGE);

    // الاستعلام الأساسي لجلب بيانات الجلسات مع LIMIT و OFFSET
    $sql = "SELECT s.id, s.user_id, s.session_token, s.ip_address, s.user_agent, s.expires_at, s.created_at, u.full_name as user_name
            FROM user_sessions s
            LEFT JOIN users u ON s.user_id = u.id";
    
    // إضافة شروط WHERE إذا كانت هناك فلاتر مطبقة
    if (!empty($where_clauses)) {
        $sql .= " WHERE " . implode(" AND ", $where_clauses);
    }

    // ترتيب الجلسات من الأحدث إلى الأقدم (كما هو مطلوب "آخر الجلسات")
    $sql .= " ORDER BY s.created_at DESC";
    $sql .= " LIMIT ? OFFSET ?";
    $sql_params[] = SESSIONS_PER_PAGE;
    $sql_params[] = $offset;

    $sessions = $db->select($sql, $sql_params);

} catch (Exception $e) {
    error_log("Database error fetching sessions: " . $e->getMessage());
    $_SESSION['error_message'] = "حدث خطأ في قاعدة البيانات. يرجى المحاولة لاحقًا.";
}
?>

<div class="content-area">
    <div class="page-header d-flex justify-content-between align-items-center">
        <div>
            <h2 class="page-title"><?php echo htmlspecialchars($pageTitle); ?></h2>
            <p class="page-subtitle">عرض وتتبع جميع الجلسات النشطة للمستخدمين.</p>
        </div>
    </div>
    
    <?php
    // عرض رسائل الخطأ والنجاح
    if (isset($_SESSION['error_message'])) {
        echo '<div class="alert alert-danger mt-3">' . htmlspecialchars($_SESSION['error_message']) . '</div>';
        unset($_SESSION['error_message']);
    }
    if (isset($_SESSION['success_message'])) {
        echo '<div class="alert alert-success mt-3">' . htmlspecialchars($_SESSION['success_message']) . '</div>';
        unset($_SESSION['success_message']);
    }
    ?>

    <!-- نموذج البحث عن الجلسات -->
    <div class="card mt-4">
        <div class="card-header">
            <h4 class="card-title">خيارات البحث عن الجلسات</h4>
        </div>
        <div class="card-body">
            <form method="GET" action="">
                <div class="row align-items-end">
                    <div class="col-md-4 mb-3">
                        <label for="filter_date" class="form-label">البحث بتاريخ محدد:</label>
                        <input type="date" class="form-control" id="filter_date" name="filter_date" value="<?php echo htmlspecialchars($filter_date); ?>">
                    </div>
                    <div class="col-md-8 mb-3 d-flex align-items-end">
                        <button type="submit" class="btn btn-primary me-2">
                            <i class="fas fa-search me-1"></i> بحث بتاريخ
                        </button>
                        <button type="submit" name="filter_today" value="1" class="btn btn-info me-2">
                            <i class="fas fa-calendar-day me-1"></i> جلسات اليوم
                        </button>
                        <?php if (!empty($filter_date)): ?>
                            <a href="<?php echo SITE_URL; ?>/pages/users/sessions_view.php" class="btn btn-secondary">
                                <i class="fas fa-times me-1"></i> مسح البحث
                            </a>
                        <?php endif; ?>
                    </div>
                </div>
            </form>
            <?php if (!empty($filter_date)): ?>
                <p class="mt-3">
                    <span class="badge bg-secondary">
                        الجلسات المعروضة بتاريخ: <?php echo htmlspecialchars($filter_date); ?>
                    </span>
                </p>
            <?php endif; ?>
        </div>
    </div>

    <!-- جدول عرض الجلسات -->
    <div class="card mt-4">
        <div class="card-body">
            <div class="table-responsive">
                <table class="table table-hover table-striped">
                    <thead class="table-light">
                        <tr>
                            <th>#</th>
                            <th>المستخدم</th>
                            <th>العنوان (IP)</th>
                            <th>الجهاز (User Agent)</th>
                            <th>تنتهي في</th>
                            <th>تاريخ الإنشاء</th>
                            <th>إجراءات</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php if (empty($sessions)): ?>
                            <tr>
                                <td colspan="7" class="text-center">لا توجد جلسات نشطة حاليًا <?php echo !empty($filter_date) ? "للتاريخ المحدد." : "."; ?></td>
                            </tr>
                        <?php else: ?>
                            <?php foreach ($sessions as $session): ?>
                                <?php
                                // Handle potential NULL values for expires_at and created_at
                                $expiresAtTimestamp = $session['expires_at'] ? strtotime($session['expires_at']) : null;
                                $createdAtTimestamp = $session['created_at'] ? strtotime($session['created_at']) : null;

                                $isExpired = ($expiresAtTimestamp !== null && $expiresAtTimestamp < time());
                                $rowClass = $isExpired ? 'table-secondary' : '';
                                ?>
                                <tr class="<?php echo $rowClass; ?>">
                                    <td><?php echo htmlspecialchars($session['id']); ?></td>
                                    <td><?php echo htmlspecialchars($session['user_name'] ?? 'مستخدم محذوف'); ?></td>
                                    <td><?php echo htmlspecialchars($session['ip_address']); ?></td>
                                    <td>
                                        <span title="<?php echo htmlspecialchars($session['user_agent']); ?>">
                                            <?php
                                            // Display a simplified user agent string for readability
                                            echo substr(htmlspecialchars($session['user_agent']), 0, 50) . (strlen($session['user_agent']) > 50 ? '...' : '');
                                            ?>
                                        </span>
                                    </td>
                                    <td>
                                        <?php echo htmlspecialchars($expiresAtTimestamp ? date('Y-m-d h:i A', $expiresAtTimestamp) : 'N/A'); ?>
                                        <?php if ($isExpired): ?>
                                            <span class="badge bg-danger">منتهية</span>
                                        <?php endif; ?>
                                    </td>
                                    <td><?php echo htmlspecialchars($createdAtTimestamp ? date('Y-m-d h:i A', $createdAtTimestamp) : 'N/A'); ?></td>
                                    <td>
                                        <?php 
                                        $canDelete = hasPermission('delete_sessions') && !$isExpired;
                                        $isCurrentSession = isset($_SESSION['current_session_id']) && $_SESSION['current_session_id'] == $session['id'];
                                        ?>
                                        <button 
                                            class="btn btn-danger btn-sm delete-session-btn"
                                            data-session-id="<?php echo htmlspecialchars($session['id']); ?>"
                                            <?php echo (!$canDelete || $isCurrentSession) ? 'disabled' : ''; ?>
                                            title="<?php 
                                                if ($isCurrentSession) echo 'لا يمكنك إنهاء جلستك الحالية';
                                                else if ($isExpired) echo 'لا يمكن إنهاء جلسة منتهية';
                                                else if (!hasPermission('delete_sessions')) echo 'ليس لديك صلاحية لإنهاء الجلسات';
                                                else echo 'إنهاء الجلسة';
                                            ?>"
                                        >
                                            <i class="fas fa-power-off"></i>
                                        </button>
                                    </td>
                                </tr>
                            <?php endforeach; ?>
                        <?php endif; ?>
                    </tbody>
                </table>
            </div>

            <!-- Pagination Controls -->
            <?php if ($total_pages > 1): ?>
                <nav aria-label="Page navigation">
                    <ul class="pagination justify-content-center mt-4">
                        <li class="page-item <?php echo ($current_page <= 1) ? 'disabled' : ''; ?>">
                            <a class="page-link" href="?page=<?php echo $current_page - 1; ?><?php echo !empty($filter_date) ? '&filter_date=' . htmlspecialchars($filter_date) : ''; ?>" aria-label="Previous">
                                <span aria-hidden="true">&laquo;</span>
                            </a>
                        </li>
                        <?php for ($i = 1; $i <= $total_pages; $i++): ?>
                            <li class="page-item <?php echo ($i == $current_page) ? 'active' : ''; ?>">
                                <a class="page-link" href="?page=<?php echo $i; ?><?php echo !empty($filter_date) ? '&filter_date=' . htmlspecialchars($filter_date) : ''; ?>">
                                    <?php echo $i; ?>
                                </a>
                            </li>
                        <?php endfor; ?>
                        <li class="page-item <?php echo ($current_page >= $total_pages) ? 'disabled' : ''; ?>">
                            <a class="page-link" href="?page=<?php echo $current_page + 1; ?><?php echo !empty($filter_date) ? '&filter_date=' . htmlspecialchars($filter_date) : ''; ?>" aria-label="Next">
                                <span aria-hidden="true">&raquo;</span>
                            </a>
                        </li>
                    </ul>
                </nav>
            <?php endif; ?>
            <!-- End Pagination Controls -->

        </div>
    </div>
</div>

<div id="confirmModal" class="modal fade" tabindex="-1" aria-labelledby="confirmModalLabel" aria-hidden="true">
    <div class="modal-dialog modal-dialog-centered">
        <div class="modal-content">
            <div class="modal-header bg-danger text-white">
                <h5 class="modal-title" id="confirmModalLabel">تأكيد إنهاء الجلسة</h5>
                <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button>
            </div>
            <div class="modal-body">
                هل أنت متأكد من إنهاء هذه الجلسة؟ لا يمكن التراجع عن هذا الإجراء.
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">إلغاء</button>
                <button type="button" class="btn btn-danger" id="confirmDeleteBtn">إنهاء الجلسة</button>
            </div>
        </div>
    </div>
</div>

<script>
document.addEventListener('DOMContentLoaded', function() {
    let sessionIdToDelete = null;
    const confirmModal = new bootstrap.Modal(document.getElementById('confirmModal'));
    const confirmDeleteBtn = document.getElementById('confirmDeleteBtn');

    document.querySelectorAll('.delete-session-btn').forEach(button => {
        button.addEventListener('click', function(event) {
            // تحقق إذا كان الزر معطلاً لمنع فتح المودال
            if (this.disabled) {
                event.preventDefault(); // منع أي سلوك افتراضي
                return; 
            }
            sessionIdToDelete = this.dataset.sessionId;
            confirmModal.show();
        });
    });

    confirmDeleteBtn.addEventListener('click', function() {
        if (sessionIdToDelete) {
            window.location.href = `?action=delete&id=${sessionIdToDelete}`;
        }
    });
});
</script>

<?php include __DIR__ . '/../../includes/footer.php'; ?>
