<?php
/**
 * Ability: wp-agent/get-setting
 *
 * Read-only. Liest eine WordPress-Kern-Einstellung, aber ausschließlich aus
 * einer festen Allowlist gängiger Optionen (siehe
 * includes/settings-allowlist.php: WPAGENT_SETTINGS_ALLOWLIST). Geschützte
 * Optionen (Salts/Keys, siteurl, home, active_plugins, wp_user_roles,
 * users_can_register, admin_email sowie alles mit "secret" im Namen) sind
 * über diese Ability nie lesbar, selbst wenn sie fälschlich in der Allowlist
 * stünden (siehe wpagent_setting_denial_reason()).
 *
 * @package WPAgentCompanion
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

function wpagent_ability_get_setting(): array {
	return array(
		'label'               => __( 'Einstellung lesen', 'wp-agent-companion' ),
		'description'         => __( 'Liest eine WordPress-Kern-Einstellung aus einer festen Allowlist gängiger Optionen (Website-Titel, Anzeige-Optionen, Permalink-Struktur, Zeitzone, Datums-/Zeitformat, Standard-Kategorie und mehr). Geschützte Optionen wie Salts/Keys, siteurl, home, active_plugins, wp_user_roles, users_can_register und admin_email sind nie lesbar.', 'wp-agent-companion' ),
		'category'            => 'wp-agent',
		'input_schema'        => array(
			'type'       => 'object',
			'properties' => array(
				'name' => array(
					'type'        => 'string',
					'enum'        => WPAGENT_SETTINGS_ALLOWLIST,
					'description' => __( 'Options-Name aus der Allowlist, z. B. "blogname" oder "permalink_structure".', 'wp-agent-companion' ),
				),
			),
			'required'              => array( 'name' ),
			'additionalProperties'  => false,
		),
		'output_schema'       => array(
			'type'       => 'object',
			'properties' => array(
				'name'   => array( 'type' => 'string', 'enum' => WPAGENT_SETTINGS_ALLOWLIST ),
				'exists' => array( 'type' => 'boolean' ),
				'value'  => wpagent_setting_public_value_schema(),
				'state_hash' => array( 'type' => 'string', 'pattern' => '^[a-f0-9]{64}$' ),
			),
			'required'              => array( 'name', 'exists', 'value', 'state_hash' ),
			'additionalProperties'  => false,
		),
		'execute_callback'    => 'wpagent_exec_get_setting',
		'permission_callback' => 'wpagent_perm_manage_options',
		'meta'                => array(
			'show_in_rest' => true,
			'annotations'  => array(
				'readonly'    => true,
				'destructive' => false,
				'idempotent'  => true,
			),
		),
	);
}

/**
 * @param mixed $input
 * @return array|WP_Error
 */
function wpagent_exec_get_setting( $input ) {
	$input = is_array( $input ) ? $input : array();
	$name  = (string) ( $input['name'] ?? '' );

	if ( '' === trim( $name ) ) {
		return new WP_Error( 'wpagent_missing_name', __( 'Options-Name fehlt.', 'wp-agent-companion' ), array( 'status' => 400 ) );
	}

	if ( ! wpagent_setting_is_allowed( $name ) ) {
		return new WP_Error(
			'wpagent_setting_not_allowed',
			sprintf(
				/* translators: %s: Options-Name. */
				__( 'Die Einstellung "%s" ist nicht in der Allowlist lesbarer Einstellungen.', 'wp-agent-companion' ),
				$name
			),
			array( 'status' => 400 )
		);
	}

	$state = wpagent_core_mutator_setting_state( $name );
	$value = wpagent_setting_public_value( $name, $state );
	if ( is_wp_error( $value ) ) {
		return $value;
	}

	return array(
		'name'   => $name,
		'exists' => $state['exists'],
		'value'  => $value,
		'state_hash' => $state['hash'],
	);
}
