[ $this, 'sanitize_checkbox' ] ] ); register_setting( 'acosmaia_group', 'acosmaia_assistant_name', [ 'sanitize_callback' => 'sanitize_text_field' ] ); register_setting( 'acosmaia_group', 'acosmaia_welcome_message', [ 'sanitize_callback' => 'sanitize_textarea_field' ] ); register_setting( 'acosmaia_group', 'acosmaia_chat_position', [ 'sanitize_callback' => [ $this, 'sanitize_position' ] ] ); register_setting( 'acosmaia_group', 'acosmaia_chat_color', [ 'sanitize_callback' => [ $this, 'sanitize_hex' ] ] ); register_setting( 'acosmaia_group', 'acosmaia_bubble_icon', [ 'sanitize_callback' => [ $this, 'sanitize_bubble_icon' ] ] ); register_setting( 'acosmaia_group', 'acosmaia_default_theme', [ 'sanitize_callback' => [ $this, 'sanitize_theme' ] ] ); register_setting( 'acosmaia_group', 'acosmaia_api_provider', [ 'sanitize_callback' => [ $this, 'sanitize_api_provider' ] ] ); register_setting( 'acosmaia_group', 'acosmaia_openrouter_key', [ 'sanitize_callback' => 'sanitize_text_field' ] ); register_setting( 'acosmaia_group', 'acosmaia_openai_key', [ 'sanitize_callback' => 'sanitize_text_field' ] ); register_setting( 'acosmaia_group', 'acosmaia_openai_model', [ 'sanitize_callback' => 'sanitize_text_field' ] ); register_setting( 'acosmaia_group', 'acosmaia_gemini_key', [ 'sanitize_callback' => 'sanitize_text_field' ] ); register_setting( 'acosmaia_group', 'acosmaia_gemini_model', [ 'sanitize_callback' => 'sanitize_text_field' ] ); register_setting( 'acosmaia_group', 'acosmaia_ai_tool', [ 'sanitize_callback' => [ $this, 'sanitize_ai_tool' ] ] ); register_setting( 'acosmaia_group', 'acosmaia_model', [ 'sanitize_callback' => 'sanitize_text_field' ] ); register_setting( 'acosmaia_group', 'acosmaia_temperature', [ 'sanitize_callback' => [ $this, 'sanitize_temperature' ] ] ); register_setting( 'acosmaia_group', 'acosmaia_max_tokens', [ 'sanitize_callback' => 'absint' ] ); register_setting( 'acosmaia_group', 'acosmaia_timeout', [ 'sanitize_callback' => 'absint' ] ); register_setting( 'acosmaia_group', 'acosmaia_daily_limit', [ 'sanitize_callback' => 'absint' ] ); register_setting( 'acosmaia_group', 'acosmaia_monthly_limit', [ 'sanitize_callback' => 'absint' ] ); register_setting( 'acosmaia_group', 'acosmaia_max_products', [ 'sanitize_callback' => [ $this, 'sanitize_max_products' ] ] ); register_setting( 'acosmaia_group', 'acosmaia_enabled_pages', [ 'sanitize_callback' => [ $this, 'sanitize_enabled_pages' ] ] ); register_setting( 'acosmaia_group', 'acosmaia_restrict_product_only', [ 'sanitize_callback' => [ $this, 'sanitize_checkbox' ] ] ); register_setting( 'acosmaia_group', 'acosmaia_fallback_response', [ 'sanitize_callback' => 'sanitize_textarea_field' ] ); register_setting( 'acosmaia_group', 'acosmaia_knowledge_text', [ 'sanitize_callback' => 'sanitize_textarea_field' ] ); } public function enqueue_assets( $hook ) { if ( 'toplevel_page_ai-chat-assistance' !== $hook ) { return; } wp_enqueue_style( 'acosmaia-admin-style', ACOSMAIA_URL . 'assets/css/admin-style.css', [], ACOSMAIA_VERSION ); wp_enqueue_script( 'acosmaia-admin-script', ACOSMAIA_URL . 'assets/js/admin.js', [], ACOSMAIA_VERSION, true ); wp_localize_script( 'acosmaia-admin-script', 'acosmaiaAdmin', [ 'api_url' => rest_url( 'acosmaia/v1/admin/settings' ), 'nonce' => wp_create_nonce( 'wp_rest' ), ] ); } public function register_rest_routes() { register_rest_route( 'acosmaia/v1', '/admin/settings', [ [ 'methods' => WP_REST_Server::READABLE, 'callback' => [ $this, 'rest_get_settings' ], 'permission_callback' => function() { return current_user_can( 'manage_options' ); }, ], [ 'methods' => WP_REST_Server::EDITABLE, 'callback' => [ $this, 'rest_save_settings' ], 'permission_callback' => function() { return current_user_can( 'manage_options' ); }, ], ] ); } public function can_manage_settings( WP_REST_Request $request ) { unset( $request ); return is_user_logged_in() && current_user_can( 'manage_options' ); } public function rest_get_settings() { return new WP_REST_Response( [ 'options' => $this->get_all_options(), 'stats' => $this->get_usage_stats(), 'meta' => [ 'position_options' => [ [ 'value' => 'bottom-right', 'label' => __( 'Bottom right', 'aco-smart-ai-assistant' ) ], [ 'value' => 'bottom-left', 'label' => __( 'Bottom left', 'aco-smart-ai-assistant' ) ], ], 'theme_options' => [ [ 'value' => 'light', 'label' => __( 'Light', 'aco-smart-ai-assistant' ) ], [ 'value' => 'dark', 'label' => __( 'Dark', 'aco-smart-ai-assistant' ) ], ], 'bubble_icon_options' => [ [ 'value' => 'chat', 'label' => __( 'Chat', 'aco-smart-ai-assistant' ) ], [ 'value' => 'spark', 'label' => __( 'Spark', 'aco-smart-ai-assistant' ) ], [ 'value' => 'bolt', 'label' => __( 'Bolt', 'aco-smart-ai-assistant' ) ], ], 'model_options' => [ [ 'value' => 'mistralai/mistral-7b-instruct:free', 'label' => 'mistralai/mistral-7b-instruct:free' ], [ 'value' => 'google/gemma-2-9b-it:free', 'label' => 'google/gemma-2-9b-it:free' ], [ 'value' => 'meta-llama/llama-3.1-8b-instruct:free', 'label' => 'meta-llama/llama-3.1-8b-instruct:free' ], ], 'page_options' => $this->get_page_options(), 'tool_options' => [ [ 'value' => 'openrouter', 'label' => 'OpenRouter', 'key_label' => __( 'OpenRouter API key', 'aco-smart-ai-assistant' ), 'key_placeholder' => __( 'Paste your OpenRouter API key', 'aco-smart-ai-assistant' ), ], [ 'value' => 'openai', 'label' => 'OpenAI', 'key_label' => __( 'OpenAI API key', 'aco-smart-ai-assistant' ), 'key_placeholder' => __( 'Paste your OpenAI API key', 'aco-smart-ai-assistant' ), ], [ 'value' => 'gemini', 'label' => 'Google Gemini', 'key_label' => __( 'Google Gemini API key', 'aco-smart-ai-assistant' ), 'key_placeholder' => __( 'Paste your Google Gemini API key', 'aco-smart-ai-assistant' ), ], ], ], ] ); } public function rest_save_settings( WP_REST_Request $request ) { $settings = $request->get_param( 'settings' ); if ( ! is_array( $settings ) ) { return new WP_REST_Response( [ 'error' => 'Invalid settings payload.' ], 400 ); } foreach ( $this->option_defaults() as $option_key => $default ) { if ( ! array_key_exists( $option_key, $settings ) ) { continue; } $sanitized = $this->sanitize_option_value( $option_key, $settings[ $option_key ] ); update_option( $option_key, $sanitized ); } return new WP_REST_Response( [ 'success' => true, 'options' => $this->get_all_options(), 'stats' => $this->get_usage_stats(), ] ); } public function page() { echo '