<?php
/**
 * Ability: wp-agent/set-featured-image
 *
 * Setzt einen vorhandenen Medienbeitrag als Featured Image (Meta
 * _thumbnail_id) eines Beitrags oder einer Seite über die offizielle
 * set_post_thumbnail()-API und verifiziert per Re-Read über
 * get_post_thumbnail_id(), analog zum Schreiben-lesen-verified-Muster aus
 * set-seo-meta.php.
 *
 * Capability: nur edit_post auf den ZIEL-Beitrag wird verlangt, keine
 * gesonderte Berechtigung auf den Medienbeitrag selbst. Das spiegelt
 * WordPress' eigenes Verhalten (auch die REST-API für post.featured_media
 * verlangt nur edit_post auf den Beitrag, nicht zusätzlich Rechte am
 * referenzierten Medium): wer einen Beitrag bearbeiten darf, darf ihm auch
 * ein bereits vorhandenes Medium als Featured Image zuweisen.
 *
 * @package WPAgentCompanion
 */

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

function wpagent_ability_set_featured_image(): array {
	return array(
		'label'               => __( 'Featured Image setzen', 'wp-agent-companion' ),
		'description'         => __( 'Setzt einen vorhandenen Medienbeitrag als Featured Image (_thumbnail_id) eines Beitrags oder einer Seite und verifiziert per Re-Read über get_post_thumbnail_id().', 'wp-agent-companion' ),
		'category'            => 'wp-agent',
		'input_schema'        => array(
			'type'       => 'object',
			'properties' => array(
				'post_id'       => array( 'type' => 'integer' ),
				'attachment_id' => array( 'type' => 'integer' ),
			),
			'required'   => array( 'post_id', 'attachment_id' ),
		),
		'output_schema'       => array(
			'type'       => 'object',
			'properties' => array(
				'post_id'       => array( 'type' => 'integer' ),
				'attachment_id' => array( 'type' => 'integer' ),
				'verified'      => array( 'type' => 'boolean' ),
			),
		),
		'execute_callback'    => 'wpagent_exec_set_featured_image',
		'permission_callback' => 'wpagent_perm_edit_posts',
		'meta'                => array(
			'show_in_rest' => true,
			'annotations'  => array(
				'readonly'    => false,
				'destructive' => false,
				'idempotent'  => true,
			),
		),
	);
}

/**
 * @param mixed $input
 * @return array|WP_Error
 */
function wpagent_exec_set_featured_image( $input ) {
	$input         = is_array( $input ) ? $input : array();
	$post_id       = (int) ( $input['post_id'] ?? 0 );
	$attachment_id = (int) ( $input['attachment_id'] ?? 0 );

	$post = get_post( $post_id );
	if ( ! $post ) {
		return new WP_Error( 'wpagent_no_post', __( 'Beitrag nicht gefunden.', 'wp-agent-companion' ), array( 'status' => 404 ) );
	}
	if ( ! current_user_can( 'edit_post', $post_id ) ) {
		return new WP_Error( 'wpagent_forbidden', __( 'Keine Berechtigung für den Beitrag.', 'wp-agent-companion' ), array( 'status' => 403 ) );
	}

	$attachment = get_post( $attachment_id );
	if ( ! $attachment || 'attachment' !== $attachment->post_type ) {
		return new WP_Error( 'wpagent_no_media', __( 'Medienbeitrag nicht gefunden.', 'wp-agent-companion' ), array( 'status' => 404 ) );
	}
	if ( ! wp_get_attachment_image( $attachment_id, 'thumbnail' ) ) {
		return new WP_Error( 'wpagent_not_featured_image', __( 'Medienbeitrag kann nicht als Featured Image gerendert werden.', 'wp-agent-companion' ), array( 'status' => 400 ) );
	}

	$current = (int) get_post_thumbnail_id( $post_id );
	if ( $current === $attachment_id ) {
		return array(
			'post_id'       => $post_id,
			'attachment_id' => $attachment_id,
			'verified'      => true,
		);
	}

	$set = set_post_thumbnail( $post_id, $attachment_id );
	if ( ! $set ) {
		return new WP_Error( 'wpagent_featured_failed', __( 'Featured Image konnte nicht gesetzt werden.', 'wp-agent-companion' ), array( 'status' => 500 ) );
	}

	$fresh    = (int) get_post_thumbnail_id( $post_id );
	$verified = ( $fresh === $attachment_id );

	return array(
		'post_id'       => $post_id,
		'attachment_id' => $fresh,
		'verified'      => $verified,
	);
}
