$srv) { $list[ $i ]['is_default'] = ($i === $default_idx) ? 1 : 0; } }; // --- Handle “make_default” from overview -------------------------------- if ('make_default' === $action) { // Verify nonce sent via query arg; dies on failure. check_admin_referer('aigude_server_make_default', 'nonce_set_default'); $index = isset($_GET['index']) ? (int) intval(wp_unslash($_GET['index'])) : -1; if ($index >= 0 && isset($servers[ $index ])) { $set_single_default($servers, $index); update_option($option_key, $servers); add_settings_error($messages_server, 'made_default', __('Default server updated.', 'aigude-tools'), 'updated'); $action = ''; $index = -1; } else { add_settings_error($messages_server, 'err', __('Invalid index while setting default.', 'aigude-tools'), 'error'); } } // --- Handle Add/Edit submit --------------------------------------------- if (isset($_POST['submit_ai_server'])) { // Verify form nonce; dies on failure. check_admin_referer($nonce_action, $nonce_name); // Capability fence if (! current_user_can('manage_options')) { wp_die(esc_html__('Insufficient permissions.', 'aigude-tools'), 403); } // Inputs $subaction = isset($_POST['ai_action']) ? sanitize_key(wp_unslash($_POST['ai_action'])) : 'add'; $server_type = isset($_POST['server']) ? sanitize_text_field(wp_unslash($_POST['server'])) : ''; $name = isset($_POST['name']) ? sanitize_text_field(wp_unslash($_POST['name'])) : ''; $api_key = isset($_POST['api_key']) ? sanitize_text_field(wp_unslash($_POST['api_key'])) : ''; $enabled = ! empty($_POST['enabled']) ? 1 : 0; $is_default = ! empty($_POST['is_default']) ? 1 : 0; // Validate $errors = array(); if ('' === $name) { $errors[] = __('Name cannot be empty.', 'aigude-tools'); } if ('' === $api_key) { $errors[] = __('API Key cannot be empty.', 'aigude-tools'); } if (! in_array($server_type, aigude_get_allowed_server_types(), true)) { $errors[] = __('Invalid server type.', 'aigude-tools'); } if (empty($errors)) { if ('edit' === $subaction) { $edit_index = isset($_POST['edit_index']) ? (int) intval(wp_unslash($_POST['edit_index'])) : -1; if (isset($servers[ $edit_index ])) { $servers[ $edit_index ] = array( 'server' => $server_type, 'name' => $name, 'api_key' => $api_key, 'enabled' => $enabled, 'is_default' => $is_default ? 1 : (int) ($servers[ $edit_index ]['is_default'] ?? 0), ); if ($is_default) { $set_single_default($servers, $edit_index); } add_settings_error($messages_server, 'updated', __('Server successfully updated.', 'aigude-tools'), 'updated'); } else { add_settings_error($messages_server, 'err', __('Invalid index while editing.', 'aigude-tools'), 'error'); } } else { // Add $servers[] = array( 'server' => $server_type, 'name' => $name, 'api_key' => $api_key, 'enabled' => $enabled, 'is_default' => $is_default ? 1 : 0, ); if ($is_default) { $set_single_default($servers, count($servers) - 1); } add_settings_error($messages_server, 'added', __('New server added.', 'aigude-tools'), 'updated'); } update_option($option_key, $servers); $action = ''; $index = -1; } else { foreach ($errors as $err) { add_settings_error($messages_server, 'err', $err, 'error'); } } } // --- Handle Delete from overview ---------------------------------------- if ('delete' === $action) { // Verify nonce sent via query arg; dies on failure. check_admin_referer('aigude_server_delete', 'nonce_delete'); $index = isset($_GET['index']) ? (int) intval(wp_unslash($_GET['index'])) : -1; if ($index >= 0 && isset($servers[ $index ])) { unset($servers[ $index ]); $servers = array_values($servers); // If no servers left, nothing to normalize. If there are, ensure at most one default remains. $found_default = false; foreach ($servers as $i => $srv) { if (! empty($srv['is_default'])) { if ($found_default) { $servers[ $i ]['is_default'] = 0; } $found_default = true; } } update_option($option_key, $servers); add_settings_error($messages_server, 'deleted', __('Server deleted.', 'aigude-tools'), 'updated'); $action = ''; $index = -1; } else { add_settings_error($messages_server, 'err', __('Invalid index for delete.', 'aigude-tools'), 'error'); } } // --- Handle context enrichment submit ------------------------------------ if (isset($_POST['submit_aigude_context'])) { check_admin_referer($context_nonce_action, $context_nonce_name); $rag_enabled = ! empty($_POST['aigude_rag_enabled']) ? '1' : '0'; update_option(AIGUDE_Context_Service::OPTION, $rag_enabled); add_settings_error($messages_context, 'context_saved', __('Context enrichment settings saved.', 'aigude-tools'), 'updated'); } // Translation provider selection is deprecated; no-op for submitted forms. if (isset($_POST['submit_translation_provider'])) { check_admin_referer($provider_nonce_action, $provider_nonce_name); add_settings_error($messages_provider, 'provider_deprecated', __('Translation provider settings are no longer used.', 'aigude-tools'), 'updated'); } // --- View ---------------------------------------------------------------- $active_tab = 'connections'; $page_url = menu_page_url('aigude-tools-settings', false); ?>