<?php
/**
 * WordPress Plugin - User Management Core Class
 * الجزء الثالث: إدارة المستخدمين - الكلاس الأساسي
 */

class CSM_User_Manager {
    
    /**
     * إنشاء مستخدم جديد
     */
    public function create_user($user_data) {
        // التحقق من البيانات المطلوبة
        if (empty($user_data['username']) || empty($user_data['email'])) {
            return new WP_Error('missing_data', 'Username and email are required');
        }
        
        // تحضير بيانات المستخدم
        $prepared_data = array(
            'user_login'    => sanitize_user($user_data['username']),
            'user_email'    => sanitize_email($user_data['email']),
            'user_pass'     => isset($user_data['password']) ? $user_data['password'] : wp_generate_password(),
            'first_name'    => isset($user_data['first_name']) ? sanitize_text_field($user_data['first_name']) : '',
            'last_name'     => isset($user_data['last_name']) ? sanitize_text_field($user_data['last_name']) : '',
            'display_name'  => isset($user_data['display_name']) ? sanitize_text_field($user_data['display_name']) : '',
            'role'          => isset($user_data['role']) ? $user_data['role'] : 'subscriber'
        );
        
        // إنشاء المستخدم
        $user_id = wp_insert_user($prepared_data);
        
        if (is_wp_error($user_id)) {
            return $user_id;
        }
        
        return $this->get_user_data($user_id);
    }
    
    /**
     * تحديث بيانات المستخدم
     */
    public function update_user($identifier, $user_data) {
        // العثور على المستخدم
        $user = $this->find_user_by_identifier($identifier);
        if (!$user) {
            return new WP_Error('user_not_found', 'User not found');
        }
        
        // تحضير بيانات التحديث
        $prepared_data = array('ID' => $user->ID);
        
        if (isset($user_data['email'])) {
            $prepared_data['user_email'] = sanitize_email($user_data['email']);
        }
        if (isset($user_data['first_name'])) {
            $prepared_data['first_name'] = sanitize_text_field($user_data['first_name']);
        }
        if (isset($user_data['last_name'])) {
            $prepared_data['last_name'] = sanitize_text_field($user_data['last_name']);
        }
        if (isset($user_data['display_name'])) {
            $prepared_data['display_name'] = sanitize_text_field($user_data['display_name']);
        }
        if (isset($user_data['password'])) {
            $prepared_data['user_pass'] = $user_data['password'];
        }
        
        // تحديث المستخدم
        $result = wp_update_user($prepared_data);
        
        if (is_wp_error($result)) {
            return $result;
        }
        
        // تحديث الدور إذا تم تمريره
        if (isset($user_data['role'])) {
            $user_obj = new WP_User($user->ID);
            $user_obj->set_role($user_data['role']);
        }
        
        // الحصول على البيانات المحدثة
        return $this->get_user_data($user->ID);
    }
    
    /**
     * تحديث المستخدمين بالجملة
     */
    public function bulk_update_users($users_data) {
        if (empty($users_data) || !is_array($users_data)) {
            return new WP_Error('invalid_data', 'Users data array is required');
        }
        
        $results = array();
        $success_count = 0;
        $failed_count = 0;
        
        foreach ($users_data as $user_update) {
            if (empty($user_update['username'])) {
                $results[] = array(
                    'username' => 'unknown',
                    'status' => 'error',
                    'message' => 'Username is required'
                );
                $failed_count++;
                continue;
            }
            
            $username = $user_update['username'];
            
            // إعداد البيانات للتحديث
            $update_data = array();
            if (isset($user_update['password'])) {
                $update_data['password'] = $user_update['password'];
            }
            if (isset($user_update['email'])) {
                $update_data['email'] = $user_update['email'];
            }
            if (isset($user_update['role'])) {
                $update_data['role'] = $user_update['role'];
            }
            if (isset($user_update['first_name'])) {
                $update_data['first_name'] = $user_update['first_name'];
            }
            if (isset($user_update['last_name'])) {
                $update_data['last_name'] = $user_update['last_name'];
            }
            if (isset($user_update['display_name'])) {
                $update_data['display_name'] = $user_update['display_name'];
            }
            
            // تحديث المستخدم
            $result = $this->update_user($username, $update_data);
            
            if (is_wp_error($result)) {
                $results[] = array(
                    'username' => $username,
                    'status' => 'error',
                    'message' => $result->get_error_message()
                );
                $failed_count++;
            } else {
                $results[] = array(
                    'username' => $username,
                    'status' => 'success',
                    'updated_fields' => array_keys($update_data),
                    'user_data' => $result
                );
                $success_count++;
            }
        }
        
        return array(
            'results' => $results,
            'total_processed' => count($users_data),
            'success_count' => $success_count,
            'failed_count' => $failed_count
        );
    }
    

    /**
     * تغيير الأدوار بالجملة
     */
    public function bulk_change_roles($users, $role) {
        if (empty($users) || !is_array($users)) {
            return new WP_Error('invalid_data', 'Users array is required');
        }
        
        if (empty($role)) {
            return new WP_Error('missing_role', 'Role is required');
        }
        
        $results = array();
        $success_count = 0;
        
        foreach ($users as $identifier) {
            $user = $this->find_user_by_identifier($identifier);
            
            if (!$user) {
                $results[] = array(
                    'identifier' => $identifier,
                    'status' => 'error',
                    'message' => 'User not found'
                );
                continue;
            }
            
            $old_roles = $user->roles;
            $user_obj = new WP_User($user->ID);
            $user_obj->set_role($role);
            
            $results[] = array(
                'identifier' => $identifier,
                'status' => 'success',
                'old_roles' => $old_roles,
                'new_role' => $role
            );
            $success_count++;
        }
        
        return array(
            'results' => $results,
            'total_processed' => count($users),
            'success_count' => $success_count,
            'failed_count' => count($users) - $success_count
        );
    }
    
    /**
     * حذف مستخدم
     */
    public function delete_user($identifier, $reassign = null) {
        $user = $this->find_user_by_identifier($identifier);
        if (!$user) {
            return new WP_Error('user_not_found', 'User not found');
        }
        
        // إذا لم يتم تحديد reassign، نبحث عن أول أدمن
        if (!$reassign) {
            $admins = get_users(array('role' => 'administrator', 'number' => 1));
            if (!empty($admins)) {
                $reassign = $admins[0]->ID;
            }
        }
        
        $result = wp_delete_user($user->ID, $reassign);
        
        if (!$result) {
            return new WP_Error('delete_failed', 'Failed to delete user');
        }
        
        return array(
            'deleted_user' => array(
                'id' => $user->ID,
                'username' => $user->user_login,
                'email' => $user->user_email
            ),
            'content_reassigned_to' => $reassign
        );
    }
 

    /**
     * جلب قائمة المستخدمين مع فلترة وpagination
     */
 public function query_users($args = array()) {
    $defaults = array(
        'search' => null,
        'search_field' => 'all',
        'regex' => false,
        'page' => 1,
        'per_page' => 50,
        'role' => null,
        'roles' => null,
        'orderby' => 'registered',
        'order' => 'DESC'
    );
    
    $args = wp_parse_args($args, $defaults);

    $query_args = array(
        'number' => ($args['regex']) ? 500 : $args['per_page'],
        'paged' => ($args['regex']) ? 1 : $args['page'],
        'orderby' => $args['orderby'],
        'order' => $args['order']
    );

    // فلترة بالأدوار
    if ($args['role']) {
        $query_args['role'] = $args['role'];
    } elseif ($args['roles']) {
        $roles_array = is_array($args['roles']) ? $args['roles'] : explode(',', $args['roles']);
        $query_args['role__in'] = $roles_array;
    }

    // البحث
    if (!empty($args['search']) && !$args['regex']) {
        $query_args['search'] = '*' . $args['search'] . '*';
        if ($args['search_field'] === 'all') {
            $query_args['search_columns'] = array('user_login', 'user_email', 'display_name');
        } else {
            $query_args['search_columns'] = array($args['search_field']);
        }
    }

    $users = get_users($query_args);

    // فلترة regex يدويًا
    if (!empty($args['search']) && $args['regex']) {
        $filtered_users = array();
        foreach ($users as $user) {
            $match = false;
            if ($args['search_field'] === 'all' || $args['search_field'] === 'user_login') {
                $match = $match || preg_match('/' . $args['search'] . '/i', $user->user_login);
            }
            if ($args['search_field'] === 'all' || $args['search_field'] === 'display_name') {
                $match = $match || preg_match('/' . $args['search'] . '/i', $user->display_name);
            }
            if ($args['search_field'] === 'all' || $args['search_field'] === 'user_email') {
                $match = $match || preg_match('/' . $args['search'] . '/i', $user->user_email);
            }
            if ($match) {
                $filtered_users[] = $user;
            }
        }
        $users = $filtered_users;

        // تقطيع النتائج يدويًا
        $total_found = count($users);
        $users = array_slice($users, ($args['page'] - 1) * $args['per_page'], $args['per_page']);
    } else {
        // حساب العدد الكلي للنتائج
        $count_args = $query_args;
        unset($count_args['number'], $count_args['paged']);
        $count_args['fields'] = 'ID';
        $total_found = count(get_users($count_args));
    }

    // تحضير البيانات
    $users_data = array();
    foreach ($users as $user) {
        $users_data[] = $this->get_user_data($user->ID);
    }

    $total_pages = ceil($total_found / $args['per_page']);

    $response = array(
        'users' => $users_data,
        'pagination' => array(
            'current_page' => $args['page'],
            'per_page' => $args['per_page'],
            'total_found' => $total_found,
            'total_pages' => $total_pages,
            'has_next' => $args['page'] < $total_pages,
            'has_prev' => $args['page'] > 1
        )
    );

    if (!empty($args['search'])) {
        $response['search_info'] = array(
            'search_term' => $args['search'],
            'search_field' => $args['search_field'],
            'is_regex' => $args['regex'],
            'results_found' => $total_found
        );
    }

    return $response;
}

    /**
     * العثور على مستخدم بواسطة ID أو username أو email
     */
    public function find_user_by_identifier($identifier) {
        if (is_numeric($identifier)) {
            return get_user_by('id', $identifier);
        } else {
            // محاولة البحث بـ username أولاً
            $user = get_user_by('login', $identifier);
            if (!$user) {
                // محاولة البحث بـ email
                $user = get_user_by('email', $identifier);
            }
            return $user;
        }
    }
    
    /**
     * الحصول على بيانات المستخدم منسقة
     */
    public function get_user_data($user_id) {
        $user = get_userdata($user_id);
        if (!$user) return null;
        
        // الحصول على تاريخ آخر تسجيل دخول
        $last_login = get_user_meta($user_id, 'last_login', true);
        
        return array(
            'id' => $user->ID,
            'username' => $user->user_login,
            'email' => $user->user_email,
            'first_name' => $user->first_name,
            'last_name' => $user->last_name,
            'display_name' => $user->display_name,
            'roles' => $user->roles,
            'capabilities' => array_keys($user->caps),
            'registered_date' => $user->user_registered,
            'last_login' => $last_login ? $last_login : null,
        );
    }
}