<?php
/**
 * WordPress Plugin - User Management API Endpoints
 * الجزء الثالث: إدارة المستخدمين - واجهة APIs
 */

class CSM_User_Management_API {
    
    private $user_manager;
    private $auth_manager;
    
    public function __construct() {
        $this->user_manager = new CSM_User_Manager();
        $this->auth_manager = new CSM_Auth_Manager();
        add_action('rest_api_init', array($this, 'register_routes'));
    }
    
    /**
     * تسجيل المسارات API
     */
    public function register_routes() {
        $namespace = 'csm/v1';
        
        // إنشاء مستخدم
        register_rest_route($namespace, '/users-control/create', array(
            'methods' => 'POST',
            'callback' => array($this, 'create_user'),
            'permission_callback' => '__return_true'
        ));
        
        // تحديث بيانات المستخدم
        register_rest_route($namespace, '/users-control/(?P<identifier>[a-zA-Z0-9_\@\%]+)', array(
            'methods' => 'PUT',
            'callback' => array($this, 'update_user'),
            'permission_callback' => '__return_true'
        ));
        
        // تحديث المستخدمين بالجملة
        register_rest_route($namespace, '/users-control/bulk-update', array(
            'methods' => 'PUT',
            'callback' => array($this, 'bulk_update_users'),
            'permission_callback' => '__return_true'
        ));
 
        
        // تغيير الأدوار بالجملة
        register_rest_route($namespace, '/users-control/bulk-roles', array(
            'methods' => 'PUT',
            'callback' => array($this, 'bulk_change_roles'),
            'permission_callback' => '__return_true'
        ));
        
        // حذف مستخدم
        register_rest_route($namespace, '/users-control/(?P<identifier>[a-zA-Z0-9_\@\%]+)', array(
            'methods' => 'DELETE',
            'callback' => array($this, 'delete_user'),
            'permission_callback' => '__return_true'
        ));
        
        // جلب قائمة المستخدمين مع فلترة
        register_rest_route($namespace, '/users-control', array(
            'methods' => 'GET',
            'callback' => array($this, 'get_users'),
            'permission_callback' => '__return_true'
        ));
        
        // الحصول على بيانات مستخدم واحد
        register_rest_route($namespace, '/users-control/(?P<identifier>[a-zA-Z0-9_\@\%]+)', array(
            'methods' => 'GET',
            'callback' => array($this, 'get_single_user'),
            'permission_callback' => '__return_true'
        ));
    }
    
    /**
     * فحص الصلاحية المضمن
     */
    private function check_auth_inline($request) {
        // يمكن تخصيص هذه الطريقة حسب نظام المصادقة
        return $this->auth_manager->validate_request($request);
    }
    
    /**
     * إنشاء مستخدم جديد
     */
    public function create_user($request) {
        if (is_wp_error($check = $this->check_auth_inline($request))) {
            return $check;
        }
        
        $params = $request->get_params();
        
        if (!$params) {
            return $this->error_response('Missing parameters', 400);
        }
        
        $result = $this->user_manager->create_user($params);
        
        if (is_wp_error($result)) {
            return $this->error_response($result->get_error_message(), 400);
        }
        
        return $this->success_response($result, 'User created successfully', 201);
    }
    
    /**
     * تحديث بيانات المستخدم
     */
    public function update_user($request) {
        if (is_wp_error($check = $this->check_auth_inline($request))) {
            return $check;
        }
        
        $identifier = $request->get_param('identifier');
        $params = $request->get_params();
        
        if (!$params) {
            return $this->error_response('Missing parameters', 400);
        }
        
        $result = $this->user_manager->update_user($identifier, $params);
        
        if (is_wp_error($result)) {
            return $this->error_response($result->get_error_message(), 404);
        }
        
        return $this->success_response($result, 'User updated successfully');
    }
    
    /**
     * تحديث المستخدمين بالجملة
     */
    public function bulk_update_users($request) {
        if (is_wp_error($check = $this->check_auth_inline($request))) {
            return $check;
        }
        
        $params = $request->get_params();
        
        if (!$params || empty($params['users'])) {
            return $this->error_response('Users array is required', 400);
        }
        
        $result = $this->user_manager->bulk_update_users($params['users']);
        
        if (is_wp_error($result)) {
            return $this->error_response($result->get_error_message(), 400);
        }
        
        return $this->success_response($result, 'Bulk update completed');
    }
    
    
    /**
     * تغيير الأدوار بالجملة
     */
    public function bulk_change_roles($request) {
        if (is_wp_error($check = $this->check_auth_inline($request))) {
            return $check;
        }
        
        $params = $request->get_params();
        
        if (empty($params['users']) || !is_array($params['users'])) {
            return $this->error_response('Users array is required', 400);
        }
        
        if (empty($params['role'])) {
            return $this->error_response('Role is required', 400);
        }
        
        $result = $this->user_manager->bulk_change_roles($params['users'], $params['role']);
        
        if (is_wp_error($result)) {
            return $this->error_response($result->get_error_message(), 400);
        }
        
        return $this->success_response($result, 'Bulk role change completed');
    }
    
    /**
     * حذف مستخدم
     */
    public function delete_user($request) {
        if (is_wp_error($check = $this->check_auth_inline($request))) {
            return $check;
        }
        
        $identifier = $request->get_param('identifier');
        $reassign = $request->get_param('reassign');
        
        $result = $this->user_manager->delete_user($identifier, $reassign);
        
        if (is_wp_error($result)) {
            return $this->error_response($result->get_error_message(), 404);
        }
        
        return $this->success_response($result, 'User deleted successfully');
    }

    
    /**
     * جلب قائمة المستخدمين مع فلترة
     */
 
    public function get_users($request) {
        if (is_wp_error($check = $this->check_auth_inline($request))) {
            return $check;
        }

        $args = array(
            'search' => $request->get_param('search'),
            'search_field' => $request->get_param('search_field') ?: 'all',
            'regex' => filter_var($request->get_param('regex'), FILTER_VALIDATE_BOOLEAN),
            'page' => $request->get_param('page') ?: 1,
            'per_page' => $request->get_param('per_page') ?: 50,
            'role' => $request->get_param('role'),
            'roles' => $request->get_param('roles'),
            'orderby' => $request->get_param('orderby') ?: 'registered',
            'order' => $request->get_param('order') ?: 'DESC'
        );

        $result = $this->user_manager->query_users($args);

        return $this->success_response($result, 'Users retrieved successfully');
    }
    
    /**
     * الحصول على بيانات مستخدم واحد
     */
    public function get_single_user($request) {
        if (is_wp_error($check = $this->check_auth_inline($request))) {
            return $check;
        }
        
        $identifier = $request->get_param('identifier');
        
        $user = $this->user_manager->find_user_by_identifier($identifier);
        
        if (!$user) {
            return $this->error_response('User not found', 404);
        }
        
        $user_data = $this->user_manager->get_user_data($user->ID);
        
        return $this->success_response($user_data, 'User data retrieved successfully');
    }
    
    /**
     * إرسال استجابة نجاح
     */
    private function success_response($data, $message = 'Success', $status = 200) {
        return new WP_REST_Response(array(
            'success' => true,
            'message' => $message,
            'data' => $data,
            'timestamp' => current_time('mysql')
        ), $status);
    }
    
    /**
     * إرسال استجابة خطأ
     */
    private function error_response($message, $status = 400, $code = null) {
        return new WP_REST_Response(array(
            'success' => false,
            'message' => $message,
            'error_code' => $code,
            'timestamp' => current_time('mysql')
        ), $status);
    }
    
    /**
     * التحقق من صحة البيانات المرسلة
     */
    private function validate_user_data($data, $required_fields = array()) {
        $errors = array();
        
        // التحقق من الحقول المطلوبة
        foreach ($required_fields as $field) {
            if (empty($data[$field])) {
                $errors[] = "Field '{$field}' is required";
            }
        }
        
        // التحقق من صحة البريد الإلكتروني
        if (isset($data['email']) && !is_email($data['email'])) {
            $errors[] = 'Invalid email format';
        }
        
        // التحقق من صحة اسم المستخدم
        if (isset($data['username'])) {
            if (!validate_username($data['username'])) {
                $errors[] = 'Invalid username format';
            }
            
            if (username_exists($data['username'])) {
                $errors[] = 'Username already exists';
            }
        }
        
        // التحقق من وجود البريد الإلكتروني
        if (isset($data['email']) && email_exists($data['email'])) {
            $errors[] = 'Email address already exists';
        }
        
        // التحقق من صحة الدور
        if (isset($data['role'])) {
            $valid_roles = array_keys(wp_roles()->roles);
            if (!in_array($data['role'], $valid_roles)) {
                $errors[] = 'Invalid user role';
            }
        }
        
        return empty($errors) ? true : $errors;
    }
    
    /**
     * تسجيل الأنشطة (للمراجعة)
     */
    private function log_activity($action, $user_id = null, $details = array()) {
        $log_data = array(
            'action' => $action,
            'user_id' => $user_id,
            'admin_id' => get_current_user_id(),
            'timestamp' => current_time('mysql'),
            'ip_address' => $_SERVER['REMOTE_ADDR'],
            'user_agent' => $_SERVER['HTTP_USER_AGENT'],
            'details' => wp_json_encode($details)
        );
        
        // يمكن حفظ هذه البيانات في جدول منفصل للمراجعة
        do_action('csm_user_activity_logged', $log_data);
    }
    
    /**
     * معالجة الأخطاء المخصصة
     */
    private function handle_wp_error($wp_error) {
        $error_codes = array(
            'existing_user_login' => 'Username already exists',
            'existing_user_email' => 'Email address already exists',
            'invalid_username' => 'Invalid username',
            'invalid_email' => 'Invalid email address',
            'empty_user_login' => 'Username cannot be empty',
            'empty_email' => 'Email address cannot be empty'
        );
        
        $error_code = $wp_error->get_error_code();
        $custom_message = isset($error_codes[$error_code]) ? $error_codes[$error_code] : $wp_error->get_error_message();
        
        return $this->error_response($custom_message, 400, $error_code);
    }
}

new CSM_User_Management_API;