<?php
/**
 * Ability: wp-agent/get-user
 *
 * Read-only. Liest die Profildaten eines einzelnen Nutzers (Login, E-Mail,
 * Anzeigename, Vor-/Nachname, Rollen, Registrierungsdatum, Profil-URL).
 * Gibt NIEMALS das Passwort-Hash-Feld (user_pass), den Passwort-Reset-Schlüssel
 * (user_activation_key) oder Session-Tokens (usermeta session_tokens) zurück:
 * das Ergebnis-Array wird bewusst Feld für Feld aus dem WP_User-Objekt
 * zusammengesetzt, statt das Objekt oder seine rohen $data-Properties
 * durchzureichen, gerade weil user_pass Teil der wpdb-Zeile ist.
 *
 * Nutzt die Capability edit_users statt list_users: das ist die Capability,
 * die WordPress selbst für den Zugriff auf ein einzelnes Nutzerprofil
 * (wp-admin/user-edit.php) verlangt, während list_users nur die schlanke
 * Listenansicht freischaltet.
 *
 * @package WPAgentCompanion
 */

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

function wpagent_ability_get_user(): array {
	return array(
		'label'               => __( 'Nutzer lesen', 'wp-agent-companion' ),
		'description'         => __( 'Liest die Profildaten eines einzelnen Nutzers (Login, E-Mail, Anzeigename, Vor-/Nachname, Rollen, Registrierungsdatum). Gibt niemals Passwort-Hashes oder Session-Tokens aus.', 'wp-agent-companion' ),
		'category'            => 'wp-agent',
		'input_schema'        => array(
			'type'       => 'object',
			'properties' => array(
				'user_id' => array( 'type' => 'integer', 'minimum' => 1 ),
			),
			'required'              => array( 'user_id' ),
			'additionalProperties'  => false,
		),
		'output_schema'       => array(
			'type'       => 'object',
			'properties' => array(
				'id'           => array( 'type' => 'integer' ),
				'username'     => array( 'type' => 'string' ),
				'email'        => array( 'type' => 'string' ),
				'display_name' => array( 'type' => 'string' ),
				'first_name'   => array( 'type' => 'string' ),
				'last_name'    => array( 'type' => 'string' ),
				'roles'        => array(
					'type'  => 'array',
					'items' => array( 'type' => 'string' ),
				),
				'registered'   => array( 'type' => 'string' ),
				'url'          => array( 'type' => 'string' ),
				'state_hash'   => array( 'type' => 'string', 'pattern' => '^[a-f0-9]{64}$' ),
				'delete_state_hash' => array( 'type' => 'string', 'pattern' => '^[a-f0-9]{64}$' ),
				'delete_eligible'   => array( 'type' => 'boolean' ),
			),
			'required'              => array( 'id', 'username', 'email', 'display_name', 'first_name', 'last_name', 'roles', 'registered', 'url', 'state_hash', 'delete_state_hash', 'delete_eligible' ),
			'additionalProperties'  => false,
		),
		'execute_callback'    => 'wpagent_exec_get_user',
		'permission_callback' => 'wpagent_perm_edit_users',
		'meta'                => array(
			'show_in_rest' => true,
			'annotations'  => array(
				'readonly'    => true,
				'destructive' => false,
				'idempotent'  => true,
			),
		),
	);
}

/**
 * Permission callback: der Aufrufer muss edit_users besitzen. Diese
 * Capability ist in einer Standardinstallation Administratoren vorbehalten;
 * der als Editor eingerichtete Companion-Bot besitzt sie nie.
 *
 * @param mixed $input Unused ability input.
 * @return bool
 */
function wpagent_perm_edit_users( $input = null ): bool {
	return current_user_can( 'edit_users' );
}

/**
 * @param mixed $input
 * @return array|WP_Error
 */
function wpagent_exec_get_user( $input ) {
	$input   = is_array( $input ) ? $input : array();
	$user_id = (int) ( $input['user_id'] ?? 0 );
	// The broad edit_users gate is not enough for a concrete profile. Check
	// edit_user before loading it so foreign and missing IDs do not disclose
	// profile data or have distinguishable target-state responses.
	if ( ! current_user_can( 'edit_users' ) || ! current_user_can( 'edit_user', $user_id ) ) {
		return new WP_Error( 'wpagent_forbidden', __( 'Keine Berechtigung.', 'wp-agent-companion' ), array( 'status' => 403 ) );
	}
	$user = get_userdata( $user_id );
	if ( ! $user ) {
		return new WP_Error( 'wpagent_forbidden', __( 'Keine Berechtigung.', 'wp-agent-companion' ), array( 'status' => 403 ) );
	}

	$identity = wpagent_core_mutator_user_role_state( $user );
	$deletion = wpagent_core_mutator_user_state( $user );

	// Bewusst nur diese benannten Felder: kein user_pass, kein
	// user_activation_key, keine Session-Tokens.
	return array(
		'id'           => (int) $user->ID,
		'username'     => $user->user_login,
		'email'        => $user->user_email,
		'display_name' => $user->display_name,
		'first_name'   => $user->first_name,
		'last_name'    => $user->last_name,
		'roles'        => array_values( $user->roles ),
		'registered'   => $user->user_registered,
		'url'          => $user->user_url,
		'state_hash'   => $identity['hash'],
		'delete_state_hash' => $deletion['hash'],
		'delete_eligible'   => $deletion['owned']['readable'] && $deletion['owned']['bounded'],
	);
}
