<?php
/**
 * Ability: wp-agent/delete-user
 *
 * Kept registered for backwards-compatible discovery only. The native user
 * removal path re-queries authored posts, links, and user metadata without a
 * conditional expected-state operation. An application lock cannot stop a
 * concurrent wp-admin edit, so remote deletion remains safely unavailable.
 *
 * @package WPAgentCompanion
 */

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

function wpagent_ability_delete_user(): array {
	return array(
		'label'               => __( 'Nutzer löschen', 'wp-agent-companion' ),
		'description'         => __( 'Der Remote-Löschweg für Nutzer ist aus Sicherheitsgründen deaktiviert. WordPress bietet keine atomare konfliktgeschützte Löschung von Nutzer, Inhalten und Links. Prüfe den aktuellen Zustand und lösche den Nutzer manuell unter Nutzer > Alle Nutzer.', 'wp-agent-companion' ),
		'category'            => 'wp-agent',
		'input_schema'        => array(
			'type'       => 'object',
			'properties' => array(
				'user_id'        => array( 'type' => 'integer', 'minimum' => 2 ),
				'reassign_to'    => array(
					'type'        => 'integer',
					'minimum'     => 1,
					'description' => __( 'Ziel-Nutzer-ID für die manuelle Inhaltsübernahme.', 'wp-agent-companion' ),
				),
				'delete_content' => array(
					'type'        => 'boolean',
					'default'     => false,
					'description' => __( 'Bestehender Kompatibilitätsparameter. Remote wird damit nichts gelöscht.', 'wp-agent-companion' ),
				),
				'expected_hash'  => array( 'type' => 'string', 'pattern' => '^[a-f0-9]{64}$' ),
				'confirm'        => array(
					'type'        => 'boolean',
					'description' => __( 'Muss true sein. Der Request wird dennoch ohne Mutation mit einer sicheren manuellen Anweisung abgelehnt.', 'wp-agent-companion' ),
				),
			),
			'required'              => array( 'user_id', 'expected_hash', 'confirm' ),
			'additionalProperties'  => false,
		),
		'output_schema'       => array(
			'type'                 => 'object',
			'properties'           => array(),
			'additionalProperties' => false,
		),
		'execute_callback'    => 'wpagent_exec_delete_user',
		'permission_callback' => 'wpagent_perm_delete_users',
		'meta'                => array(
			'show_in_rest' => true,
			'annotations'  => array(
				'readonly'    => false,
				'destructive' => true,
				'idempotent'  => false,
				'manual_only' => true,
			),
		),
	);
}

/**
 * @param mixed $input
 * @return bool
 */
function wpagent_perm_delete_users( $input = null ): bool {
	return current_user_can( 'delete_users' );
}

/**
 * @param mixed $input
 * @return WP_Error
 */
function wpagent_exec_delete_user( $input ) {
	$input = is_array( $input ) ? $input : array();
	if ( ! wpagent_core_mutator_is_strict_integer( $input['user_id'] ?? null ) || (int) $input['user_id'] < 2 ) {
		return new WP_Error( 'wpagent_bad_user_id', __( 'user_id muss eine positive, nicht geschützte Ganzzahl sein.', 'wp-agent-companion' ), array( 'status' => 400 ) );
	}
	$user_id = (int) $input['user_id'];
	if ( ! current_user_can( 'delete_users' ) || ! current_user_can( 'delete_user', $user_id ) ) {
		return new WP_Error( 'wpagent_forbidden', __( 'Keine Berechtigung.', 'wp-agent-companion' ), array( 'status' => 403 ) );
	}
	$user = get_userdata( $user_id );
	if ( ! $user instanceof WP_User ) {
		return new WP_Error( 'wpagent_forbidden', __( 'Keine Berechtigung.', 'wp-agent-companion' ), array( 'status' => 403 ) );
	}
	if ( is_multisite() ) {
		return new WP_Error( 'wpagent_multisite_user_delete_unsupported', __( 'Nutzer werden auf Multisite-Installationen nicht remote gelöscht.', 'wp-agent-companion' ), array( 'status' => 409 ) );
	}
	if ( 1 === $user_id || get_current_user_id() === $user_id ) {
		return new WP_Error( 'wpagent_protected_user', __( 'Dieser Nutzer ist geschützt und darf nicht gelöscht werden.', 'wp-agent-companion' ), array( 'status' => 400 ) );
	}
	if ( true !== ( $input['confirm'] ?? null ) ) {
		return new WP_Error( 'wpagent_delete_confirmation_required', __( 'confirm=true ist für einen Löschversuch erforderlich.', 'wp-agent-companion' ), array( 'status' => 400 ) );
	}
	$expected_hash = wpagent_core_mutator_expected_hash( $input );
	if ( is_wp_error( $expected_hash ) ) {
		return $expected_hash;
	}

	$reassign_to = null;
	if ( array_key_exists( 'reassign_to', $input ) && null !== $input['reassign_to'] ) {
		if ( ! wpagent_core_mutator_is_strict_integer( $input['reassign_to'] ) || (int) $input['reassign_to'] < 1 || $user_id === (int) $input['reassign_to'] ) {
			return new WP_Error( 'wpagent_bad_reassign', __( 'reassign_to muss ein anderer vorhandener Nutzer sein.', 'wp-agent-companion' ), array( 'status' => 400 ) );
		}
		$reassign_to = (int) $input['reassign_to'];
		if ( ! current_user_can( 'edit_user', $reassign_to ) || ! get_userdata( $reassign_to ) ) {
			return new WP_Error( 'wpagent_bad_reassign', __( 'reassign_to-Nutzer nicht gefunden.', 'wp-agent-companion' ), array( 'status' => 400 ) );
		}
	}
	if ( array_key_exists( 'delete_content', $input ) && ! is_bool( $input['delete_content'] ) ) {
		return new WP_Error( 'wpagent_bad_delete_mode', __( 'delete_content muss ein Boolean sein.', 'wp-agent-companion' ), array( 'status' => 400 ) );
	}
	if ( null !== $reassign_to && true === ( $input['delete_content'] ?? false ) ) {
		return new WP_Error( 'wpagent_bad_delete_mode', __( 'reassign_to und delete_content=true dürfen nicht gemeinsam gesetzt werden.', 'wp-agent-companion' ), array( 'status' => 400 ) );
	}
	if ( null === $reassign_to && true !== ( $input['delete_content'] ?? false ) ) {
		return new WP_Error( 'wpagent_reassign_required', __( 'Entweder reassign_to oder delete_content=true angeben, bevor die manuelle Löschung ausgeführt wird.', 'wp-agent-companion' ), array( 'status' => 400 ) );
	}

	$before = wpagent_core_mutator_user_state( $user );
	if ( ! $before['owned']['readable'] ) {
		return wpagent_core_mutator_recovery_required( 'wpagent_user_delete_state_unavailable', __( 'Die vollständige Inhaltszuordnung des Nutzers konnte nicht sicher gelesen werden. Es wurde nichts geändert.', 'wp-agent-companion' ), $before['hash'] );
	}
	if ( ! $before['owned']['bounded'] ) {
		return new WP_Error( 'wpagent_user_delete_limit', __( 'Nutzer mit mehr als 500 Beiträgen oder Links werden nicht automatisch verarbeitet.', 'wp-agent-companion' ), array( 'status' => 413, 'current_hash' => $before['hash'] ) );
	}
	if ( ! hash_equals( $before['hash'], $expected_hash ) ) {
		return new WP_Error( 'wpagent_user_conflict', __( 'Der Nutzer oder seine zugehörigen Inhalte wurden seit dem Lesen verändert.', 'wp-agent-companion' ), array( 'status' => 409, 'current_hash' => $before['hash'] ) );
	}

	return new WP_Error(
		'wpagent_user_manual_delete_required',
		__( 'Die Remote-Löschung von Nutzern ist deaktiviert, weil WordPress Nutzer, Inhalte und Links nicht atomar gegen parallele Admin-Änderungen löscht. Prüfe den aktuellen Zustand und lösche den Nutzer manuell unter Nutzer > Alle Nutzer.', 'wp-agent-companion' ),
		array( 'status' => 409, 'current_hash' => $before['hash'], 'manual_action_required' => true )
	);
}
