<?php
/**
 * Ability: wp-agent/list-reusable-blocks
 *
 * Read-only. Listet wiederverwendbare Blöcke (Post-Type wp_block) mit Such-,
 * Status- und Paginierungs-Filter als schlanke Liste. Anders als
 * wp-agent/list-posts nimmt diese Ability KEINEN post_type-Parameter entgegen:
 * der Typ ist fest auf wp_block verdrahtet, und wpagent_validate_post_type()
 * kommt bewusst nicht zum Einsatz, weil wp_block im Kern mit 'public' => false
 * registriert ist (siehe create-reusable-block.php für die Details) und dieser
 * generische Whitelist-Check den Zugriff sonst fälschlich verweigern würde.
 *
 * @package WPAgentCompanion
 */

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

function wpagent_ability_list_reusable_blocks(): array {
	return array(
		'label'               => __( 'Wiederverwendbare Blöcke auflisten', 'wp-agent-companion' ),
		'description'         => __( 'Listet wiederverwendbare Blöcke (wp_block) mit Suche, Status- und Paginierungs-Filter als schlanke Liste (id, title, status, date, slug) plus Gesamtzahl.', 'wp-agent-companion' ),
		'category'            => 'wp-agent',
		'input_schema'        => array(
			'type'       => 'object',
			'properties' => array(
				'status'   => array(
					'type'    => 'string',
					'default' => 'any',
				),
				'search'   => array( 'type' => 'string' ),
				'per_page' => array(
					'type'    => 'integer',
					'default' => 20,
				),
				'page'     => array(
					'type'    => 'integer',
					'default' => 1,
				),
			),
		),
		'output_schema'       => array(
			'type'       => 'object',
			'properties' => array(
				'items' => array(
					'type'  => 'array',
					'items' => array(
						'type'       => 'object',
						'properties' => array(
							'id'     => array( 'type' => 'integer' ),
							'title'  => array( 'type' => 'string' ),
							'status' => array( 'type' => 'string' ),
							'date'   => array( 'type' => 'string' ),
							'slug'   => array( 'type' => 'string' ),
						),
					),
				),
				'total' => array( 'type' => 'integer' ),
			),
		),
		'execute_callback'    => 'wpagent_exec_list_reusable_blocks',
		'permission_callback' => 'wpagent_perm_edit_posts',
		'meta'                => array(
			'show_in_rest' => true,
			'annotations'  => array(
				'readonly'    => true,
				'destructive' => false,
				'idempotent'  => true,
			),
		),
	);
}

/**
 * @param mixed $input
 * @return array|WP_Error
 */
function wpagent_exec_list_reusable_blocks( $input ) {
	$input = is_array( $input ) ? $input : array();

	// Grobe Schranke oben ist edit_posts; hier zusätzlich die für wp_block
	// tatsächlich zuständige Lese-Capability prüfen (bei wp_block explizit auf
	// das literale edit_posts gemappt, siehe Kern-Registrierung in
	// wp-includes/post.php), analog zu list-posts.php.
	if ( ! current_user_can( wpagent_post_type_edit_cap( 'wp_block' ) ) ) {
		return new WP_Error( 'wpagent_forbidden', __( 'Keine Berechtigung für wiederverwendbare Blöcke.', 'wp-agent-companion' ), array( 'status' => 403 ) );
	}

	$status = (string) ( $input['status'] ?? 'any' );
	if ( '' === $status ) {
		$status = 'any';
	}

	$per_page = (int) ( $input['per_page'] ?? 20 );
	if ( $per_page <= 0 ) {
		$per_page = 20;
	}
	$per_page = min( $per_page, 100 );

	$page = (int) ( $input['page'] ?? 1 );
	if ( $page <= 0 ) {
		$page = 1;
	}

	$query_args = array(
		'post_type'           => 'wp_block',
		'post_status'         => $status,
		'posts_per_page'      => $per_page,
		'paged'               => $page,
		'orderby'             => 'date',
		'order'               => 'DESC',
		'ignore_sticky_posts' => true,
		'no_found_rows'       => false,
	);
	if ( ! empty( $input['search'] ) ) {
		$query_args['s'] = (string) $input['search'];
	}

	$query = new WP_Query( $query_args );

	$items = array();
	foreach ( $query->posts as $post ) {
		$items[] = array(
			'id'     => (int) $post->ID,
			'title'  => $post->post_title,
			'status' => $post->post_status,
			'date'   => $post->post_date,
			'slug'   => $post->post_name,
		);
	}

	return array(
		'items' => $items,
		'total' => (int) $query->found_posts,
	);
}
