<?php
/**
 * Ability: wp-agent/trash-post
 *
 * @package WPAgentCompanion
 */

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

function wpagent_ability_trash_post(): array {
	return array(
		'label'               => __( 'Beitrag in den Papierkorb verschieben', 'wp-agent-companion' ),
		'description'         => __( 'Das ferngesteuerte Verschieben in den Papierkorb ist nicht verfügbar, weil WordPress dafür keinen atomaren, zustandsgebundenen Schreibvorgang bietet. Führe den Vorgang lokal in einer beaufsichtigten Administration aus.', 'wp-agent-companion' ),
		'category'            => 'wp-agent',
		'input_schema'        => array(
			'type'                 => 'object',
			'properties'           => array(
				'post_id'             => array( 'type' => 'integer', 'minimum' => 1 ),
				'expected_state_hash' => array( 'type' => 'string', 'pattern' => '^[a-f0-9]{64}$' ),
			),
			'required'             => array( 'post_id', 'expected_state_hash' ),
			'additionalProperties' => false,
		),
		'output_schema'       => array(
			'type'                 => 'object',
			'properties'           => array(
				'post_id'  => array( 'type' => 'integer' ),
				'status'   => array( 'type' => 'string' ),
				'verified' => array( 'type' => 'boolean' ),
			),
			'additionalProperties' => false,
		),
		'execute_callback'    => 'wpagent_exec_trash_post',
		'permission_callback' => 'wpagent_perm_edit_posts',
		'meta'                => array(
			'show_in_rest' => true,
			'annotations'  => array(
				'readonly'    => false,
				'destructive' => false,
				'idempotent'  => false,
				'manual_only' => true,
			),
		),
	);
}

/** @return WP_Error */
function wpagent_trash_post_manual_only_error(): WP_Error {
	return new WP_Error(
		'wpagent_post_lifecycle_manual_only',
		__( 'Das ferngesteuerte Verschieben in den Papierkorb ist nicht verfügbar. Führe den Vorgang lokal in einer beaufsichtigten Administration aus und lies den Beitrag anschließend neu.', 'wp-agent-companion' ),
		array( 'status' => 409, 'manual_only' => true, 'recovery_required' => false )
	);
}

/**
 * @param mixed $input
 * @return WP_Error
 */
function wpagent_exec_trash_post( $input ) {
	$input   = is_array( $input ) ? $input : array();
	$post_id = (int) ( $input['post_id'] ?? 0 );
	if ( ! current_user_can( 'delete_post', $post_id ) ) {
		return new WP_Error( 'wpagent_forbidden', __( 'Keine Berechtigung.', 'wp-agent-companion' ), array( 'status' => 403 ) );
	}
	$post = get_post( $post_id );
	if ( ! $post ) {
		return new WP_Error( 'wpagent_forbidden', __( 'Keine Berechtigung.', 'wp-agent-companion' ), array( 'status' => 403 ) );
	}
	$expected_state_hash = is_string( $input['expected_state_hash'] ?? null ) ? strtolower( $input['expected_state_hash'] ) : '';
	if ( 1 !== preg_match( '/^[a-f0-9]{64}$/D', $expected_state_hash ) ) {
		return new WP_Error( 'wpagent_post_expected_hash', __( 'expected_state_hash muss der vollständige state_hash aus get-post sein.', 'wp-agent-companion' ), array( 'status' => 400 ) );
	}
	clean_post_cache( $post_id );
	wp_cache_delete( $post_id, 'post_meta' );
	$current = get_post( $post_id );
	if ( ! $current instanceof WP_Post ) {
		return new WP_Error( 'wpagent_forbidden', __( 'Keine Berechtigung.', 'wp-agent-companion' ), array( 'status' => 403 ) );
	}
	$current_hash = wpagent_post_state_hash( $current );
	if ( ! hash_equals( $expected_state_hash, $current_hash ) ) {
		return new WP_Error( 'wpagent_post_conflict', __( 'Der Beitrag wurde seit dem Lesen verändert. Lies ihn neu und wiederhole den Vorgang mit dem aktuellen state_hash.', 'wp-agent-companion' ), array( 'status' => 409, 'current_state_hash' => $current_hash ) );
	}
	return wpagent_trash_post_manual_only_error();
}
