<?php
/**
 * Ability: wp-agent/delete-reusable-block
 *
 * Analog zu wp-agent/delete-post: ohne force wird in den Papierkorb verschoben,
 * mit force=true endgültig gelöscht. Ruft dafür bewusst wp_trash_post() DIREKT
 * auf statt wp_delete_post( $id, false ): der WordPress-Kern löscht einen
 * bereits im Papierkorb liegenden Post über wp_delete_post() nämlich auch OHNE
 * force_delete=true endgültig (die Weiche auf wp_trash_post() innerhalb von
 * wp_delete_post() greift nur, wenn der Status noch NICHT 'trash' ist). Das
 * wäre ein stiller Sicherheits-Fallstrick, den diese Ability ausschließt.
 *
 * block_id muss auf einen tatsächlich existierenden wp_block-Post zeigen; zeigt
 * sie auf einen Post eines anderen Post-Types, wird das wie "nicht gefunden"
 * behandelt (404), statt versehentlich einen fremden Post-Type über diese
 * Ability zu löschen.
 *
 * Anders als delete-post.php wird hier bewusst KEIN
 * wpagent_check_protected_post()-Aufruf gemacht: page_on_front/page_for_posts
 * können laut WordPress-Kern ausschließlich auf Posts vom Typ 'page' zeigen,
 * ein wp_block kann diese Rolle also nie einnehmen, und der Aufruf wäre hier
 * reiner toter Code.
 *
 * @package WPAgentCompanion
 */

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

function wpagent_ability_delete_reusable_block(): array {
	return array(
		'label'               => __( 'Wiederverwendbaren Block löschen', 'wp-agent-companion' ),
		'description'         => __( 'Ohne force: verschiebt den wiederverwendbaren Block in den Papierkorb. Mit force=true: löscht endgültig, unabhängig vom aktuellen Status. Verifiziert per Re-Read (Block existiert nicht mehr bzw. liegt im Papierkorb).', 'wp-agent-companion' ),
		'category'            => 'wp-agent',
		'input_schema'        => array(
			'type'       => 'object',
			'properties' => array(
				'block_id' => array( 'type' => 'integer' ),
				'force'    => array(
					'type'        => 'boolean',
					'default'     => false,
					'description' => __( 'true = endgültig löschen (unumkehrbar). false (Default) = in den Papierkorb verschieben.', 'wp-agent-companion' ),
				),
			),
			'required'   => array( 'block_id' ),
		),
		'output_schema'       => array(
			'type'       => 'object',
			'properties' => array(
				'block_id' => array( 'type' => 'integer' ),
				'forced'   => array( 'type' => 'boolean' ),
				'trashed'  => array( 'type' => 'boolean' ),
				'deleted'  => array( 'type' => 'boolean' ),
				'verified' => array( 'type' => 'boolean' ),
			),
		),
		'execute_callback'    => 'wpagent_exec_delete_reusable_block',
		'permission_callback' => 'wpagent_perm_edit_posts',
		'meta'                => array(
			'show_in_rest' => true,
			'annotations'  => array(
				'readonly'    => false,
				// Wie bei delete-post: mit force=true der einzige echte
				// Datenverlust-Fall dieser Ability-Gruppe, unumkehrbar.
				'destructive' => true,
				'idempotent'  => true,
			),
		),
	);
}

/**
 * @param mixed $input
 * @return array|WP_Error
 */
function wpagent_exec_delete_reusable_block( $input ) {
	$input    = is_array( $input ) ? $input : array();
	$block_id = (int) ( $input['block_id'] ?? 0 );
	$force    = rest_sanitize_boolean( $input['force'] ?? false ); // DELETE liefert Booleans als Query-String; !empty("false") wäre fälschlich true.
	$post     = get_post( $block_id );

	if ( ! $post || 'wp_block' !== $post->post_type ) {
		return new WP_Error( 'wpagent_no_block', __( 'Wiederverwendbarer Block nicht gefunden.', 'wp-agent-companion' ), array( 'status' => 404 ) );
	}
	// current_user_can( 'delete_post', ... ) löst über WordPress' eigene
	// Meta-Capability-Zuordnung für wp_block korrekt auf delete_posts /
	// delete_published_posts / delete_others_posts auf (siehe map_meta_cap()-
	// Zweig 'delete_post' im Kern), analog zu delete-post.php.
	if ( ! current_user_can( 'delete_post', $block_id ) ) {
		return new WP_Error( 'wpagent_forbidden', __( 'Keine Berechtigung.', 'wp-agent-companion' ), array( 'status' => 403 ) );
	}

	if ( $force ) {
		$res = wp_delete_post( $block_id, true );
		if ( ! $res || is_wp_error( $res ) ) {
			return new WP_Error( 'wpagent_delete_failed', __( 'Endgültiges Löschen fehlgeschlagen.', 'wp-agent-companion' ), array( 'status' => 500 ) );
		}

		$still_exists = (bool) get_post( $block_id );

		return array(
			'block_id' => $block_id,
			'forced'   => true,
			'trashed'  => false,
			'deleted'  => ! $still_exists,
			'verified' => ! $still_exists,
		);
	}

	if ( 'trash' === $post->post_status ) {
		// Idempotent: liegt bereits im Papierkorb, nichts zu tun. Kein
		// wp_delete_post( $id, false )-Aufruf, siehe Datei-Kommentar oben.
		return array(
			'block_id' => $block_id,
			'forced'   => false,
			'trashed'  => true,
			'deleted'  => false,
			'verified' => true,
		);
	}

	if ( ! wpagent_trash_is_available() ) {
		return wpagent_trash_disabled_error();
	}

	$res = wp_trash_post( $block_id );
	if ( ! $res || is_wp_error( $res ) ) {
		return new WP_Error( 'wpagent_trash_failed', __( 'In den Papierkorb verschieben fehlgeschlagen.', 'wp-agent-companion' ), array( 'status' => 500 ) );
	}

	$fresh = get_post( $block_id );
	$ok    = ( $fresh instanceof WP_Post && 'trash' === $fresh->post_status );

	return array(
		'block_id' => $block_id,
		'forced'   => false,
		'trashed'  => $ok,
		'deleted'  => false,
		'verified' => $ok,
	);
}
