<?php
header('Content-Type: application/json; charset=utf-8');
require_once '../includes/db.php';

// Safe session start
if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

// 1. Verify if user is logged in
if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true || !isset($_SESSION['user'])) {
    echo json_encode(['status' => 'error', 'message' => 'عذراً، يجب تسجيل الدخول أولاً للوصول لهذه الصفحة.']);
    exit;
}

$currentUser = $_SESSION['user'];
$pageKey = 'users';

// 2. Check if user has view/edit permissions for users
if (!isset($currentUser['permissions'][$pageKey]) || $currentUser['permissions'][$pageKey]['view'] !== true) {
    echo json_encode(['status' => 'error', 'message' => 'عذراً، حسابك لا يملك الصلاحية للوصول لبيانات المستخدمين.']);
    exit;
}

$action = isset($_GET['action']) ? $_GET['action'] : '';

if ($_SERVER['REQUEST_METHOD'] === 'GET') {
    if ($action === 'list') {
        $result = $conn->query("SELECT id, name, username, status, permissions, created_at FROM users ORDER BY id DESC");
        $users = [];
        if ($result) {
            while ($row = $result->fetch_assoc()) {
                $users[] = [
                    'id' => (string)$row['id'],
                    'name' => $row['name'],
                    'username' => $row['username'],
                    'status' => $row['status'],
                    'permissions' => json_decode($row['permissions'], true) ?: new stdClass(),
                    'createdAt' => $row['created_at']
                ];
            }
        }

        echo json_encode([
            'status' => 'success',
            'users' => $users
        ]);
        exit;
    }
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Check modify/add/delete permissions
    $hasAdd = isset($currentUser['permissions'][$pageKey]['add']) && $currentUser['permissions'][$pageKey]['add'] === true;
    $hasEdit = isset($currentUser['permissions'][$pageKey]['edit']) && $currentUser['permissions'][$pageKey]['edit'] === true;
    $hasDelete = isset($currentUser['permissions'][$pageKey]['delete']) && $currentUser['permissions'][$pageKey]['delete'] === true;

    $input = json_decode(file_get_contents('php://input'), true) ?? [];

    if ($action === 'save') {
        $id = isset($input['id']) ? trim($input['id']) : '';
        $name = isset($input['name']) ? trim($input['name']) : '';
        $username = isset($input['username']) ? trim($input['username']) : '';
        $password = isset($input['password']) ? $input['password'] : '';
        $status = isset($input['status']) ? trim($input['status']) : 'active';
        $permissions = isset($input['permissions']) ? $input['permissions'] : [];

        if (empty($name) || empty($username)) {
            echo json_encode(['status' => 'error', 'message' => 'يرجى إدخال جميع البيانات المطلوبة (الاسم واسم المستخدم).']);
            exit;
        }

        // Prevent suspending self or the main admin
        if ($username === 'admin' && $status === 'suspended') {
            echo json_encode(['status' => 'error', 'message' => 'لا يمكن إيقاف حساب المدير العام الرئيسي للنظام.']);
            exit;
        }

        // Self-privilege escalation guard: non-admin cannot edit their own account or escalate perms
        if (!empty($id) && $id == $currentUser['id'] && strtolower($currentUser['username']) !== 'admin') {
            echo json_encode(['status' => 'error', 'message' => 'عذراً، لا يمكنك تعديل صلاحيات أو بيانات حسابك الشخصي بنفسك.']);
            exit;
        }

        $permissions_str = json_encode($permissions, JSON_UNESCAPED_UNICODE);

        if (!empty($id)) {
            // Edit User
            if (!$hasEdit) {
                echo json_encode(['status' => 'error', 'message' => 'عذراً، حسابك لا يملك صلاحية تعديل بيانات المستخدمين.']);
                exit;
            }

            // Verify the user exists
            $stmt = $conn->prepare("SELECT id, name, username, status, permissions FROM users WHERE id = ?");
            $stmt->bind_param('i', $id);
            $stmt->execute();
            $exist = $stmt->get_result()->fetch_assoc();
            $stmt->close();

            if (!$exist) {
                echo json_encode(['status' => 'error', 'message' => 'المستخدم المراد تعديله غير موجود.']);
                exit;
            }

            // If changing username, make sure it is not taken
            if (strtolower($exist['username']) !== strtolower($username)) {
                $stmt = $conn->prepare("SELECT id FROM users WHERE LOWER(username) = LOWER(?) AND id != ?");
                $stmt->bind_param('si', $username, $id);
                $stmt->execute();
                $taken = $stmt->get_result()->fetch_assoc();
                $stmt->close();
                if ($taken) {
                    echo json_encode(['status' => 'error', 'message' => 'اسم المستخدم هذا محجوز مسبقاً لموظف آخر.']);
                    exit;
                }
            }

            // Prevent editing main admin username
            if (strtolower($exist['username']) === 'admin' && strtolower($username) !== 'admin') {
                echo json_encode(['status' => 'error', 'message' => 'لا يمكن تغيير اسم المستخدم لحساب المدير العام الرئيسي.']);
                exit;
            }

            if (!empty($password)) {
                // Update with password
                $hashed_pass = password_hash($password, PASSWORD_DEFAULT);
                $stmt = $conn->prepare("UPDATE users SET name = ?, username = ?, password = ?, status = ?, permissions = ? WHERE id = ?");
                $stmt->bind_param('sssssi', $name, $username, $hashed_pass, $status, $permissions_str, $id);
            } else {
                // Update without password
                $stmt = $conn->prepare("UPDATE users SET name = ?, username = ?, status = ?, permissions = ? WHERE id = ?");
                $stmt->bind_param('ssssi', $name, $username, $status, $permissions_str, $id);
            }

            if ($stmt->execute()) {
                updateSystemState($conn, 'users');
                // Audit logging
                logActivity($conn, 'update', 'users', $id, [
                    'name' => $exist['name'],
                    'username' => $exist['username'],
                    'status' => $exist['status']
                ], [
                    'name' => $name,
                    'username' => $username,
                    'status' => $status
                ]);

                echo json_encode(['status' => 'success', 'message' => 'تم تحديث حساب الموظف بنجاح']);
            } else {
                echo json_encode(['status' => 'error', 'message' => 'فشل التعديل في قاعدة البيانات: ' . $conn->error]);
            }
            $stmt->close();
            exit;
        } else {
            // Add User
            if (!$hasAdd) {
                echo json_encode(['status' => 'error', 'message' => 'عذراً، حسابك لا يملك صلاحية إضافة مستخدمين جدد.']);
                exit;
            }

            if (empty($password)) {
                echo json_encode(['status' => 'error', 'message' => 'يرجى كتابة كلمة المرور للمستخدم الجديد.']);
                exit;
            }

            // Check if username taken
            $stmt = $conn->prepare("SELECT id FROM users WHERE LOWER(username) = LOWER(?)");
            $stmt->bind_param('s', $username);
            $stmt->execute();
            $taken = $stmt->get_result()->fetch_assoc();
            $stmt->close();
            if ($taken) {
                echo json_encode(['status' => 'error', 'message' => 'اسم المستخدم هذا محجوز مسبقاً لموظف آخر.']);
                exit;
            }

            $hashed_pass = password_hash($password, PASSWORD_DEFAULT);
            $stmt = $conn->prepare("INSERT INTO users (name, username, password, status, permissions) VALUES (?, ?, ?, ?, ?)");
            $stmt->bind_param('sssss', $name, $username, $hashed_pass, $status, $permissions_str);
            if ($stmt->execute()) {
                updateSystemState($conn, 'users');
                $new_id = $conn->insert_id;
                // Audit logging
                logActivity($conn, 'insert', 'users', $new_id, null, [
                    'name' => $name,
                    'username' => $username,
                    'status' => $status
                ]);

                echo json_encode(['status' => 'success', 'message' => 'تم إنشاء حساب الموظف بنجاح']);
            } else {
                echo json_encode(['status' => 'error', 'message' => 'فشل الحفظ في قاعدة البيانات: ' . $conn->error]);
            }
            $stmt->close();
            exit;
        }
    }

    if ($action === 'delete') {
        if (!$hasDelete) {
            echo json_encode(['status' => 'error', 'message' => 'عذراً، حسابك لا يملك صلاحية حذف المستخدمين.']);
            exit;
        }

        $id = isset($input['id']) ? trim($input['id']) : '';

        if (empty($id)) {
            echo json_encode(['status' => 'error', 'message' => 'معرف المستخدم المطلوب غير صالح.']);
            exit;
        }

        // Verify it is not the main admin or currently logged in user
        $stmt = $conn->prepare("SELECT name, username, status FROM users WHERE id = ?");
        $stmt->bind_param('i', $id);
        $stmt->execute();
        $user = $stmt->get_result()->fetch_assoc();
        $stmt->close();

        if (!$user) {
            echo json_encode(['status' => 'error', 'message' => 'المستخدم المراد حذفه غير موجود في قاعدة البيانات.']);
            exit;
        }

        if (strtolower($user['username']) === 'admin' || $id == 'user_default_admin') {
            echo json_encode(['status' => 'error', 'message' => 'لا يمكن حذف حساب المدير العام الرئيسي للنظام.']);
            exit;
        }

        if ($id == $currentUser['id'] || $user['username'] === $currentUser['username']) {
            echo json_encode(['status' => 'error', 'message' => 'لا يمكنك حذف حسابك الشخصي الذي تستخدمه حالياً.']);
            exit;
        }

        $stmt = $conn->prepare("DELETE FROM users WHERE id = ?");
        $stmt->bind_param('i', $id);
        if ($stmt->execute()) {
            updateSystemState($conn, 'users');
            // Audit logging
            logActivity($conn, 'delete', 'users', $id, [
                'name' => $user['name'],
                'username' => $user['username'],
                'status' => $user['status']
            ], null);

            echo json_encode(['status' => 'success', 'message' => 'تم حذف حساب الموظف بنجاح']);
        } else {
            echo json_encode(['status' => 'error', 'message' => 'فشل الحذف في قاعدة البيانات: ' . $conn->error]);
        }
        $stmt->close();
        exit;
    }
}

echo json_encode(['status' => 'error', 'message' => 'طلب غير صالح']);
?>
