<?php
/**
 * Ability: wp-agent/delete-comment
 *
 * Ohne force: Sicherheitsverhalten wie ein "trash". Mit force=true: endgültig,
 * über wp_delete_comment( $comment_id, true ). Direkter Aufruf von
 * wp_delete_comment( $comment_id, false ) ist dabei bewusst NICHT ungeschützt:
 * WordPress' Kernfunktion schließt Kommentare, die bereits im Papierkorb ODER
 * als Spam markiert sind, von ihrer eigenen Trash-Weiche aus
 * ( ! in_array( wp_get_comment_status( $comment ), array( 'trash', 'spam' ) ) )
 * und löscht sie in diesem Fall auch OHNE force_delete=true sofort endgültig.
 * Ein zweiter Aufruf ohne force auf einem bereits getrashten oder als Spam
 * markierten Kommentar würde ihn also still und unumkehrbar entfernen, obwohl
 * der Aufrufer explizit force=false (den Standardwert) gewählt hat. Genau das
 * schließt diese Ability aus: bei trash/spam UND force=false wird
 * wp_delete_comment() gar nicht erst aufgerufen, sondern ein Idempotenz-No-op
 * zurückgegeben.
 *
 * @package WPAgentCompanion
 */

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

if ( ! function_exists( 'wpagent_perm_moderate_comments' ) ) {
	/**
	 * Permission callback: der Aufrufer muss Kommentare moderieren dürfen.
	 *
	 * Siehe die ausführliche Begründung in list-comments.php (identische,
	 * function_exists()-geschützte Definition in allen vier neuen
	 * Kommentare-Ability-Dateien, damit keine Ladereihenfolge zwischen ihnen
	 * vorausgesetzt werden muss).
	 *
	 * @param mixed $input Ungenutzter Ability-Input.
	 * @return bool
	 */
	function wpagent_perm_moderate_comments( $input = null ): bool {
		return current_user_can( 'moderate_comments' );
	}
}

function wpagent_ability_delete_comment(): array {
	return array(
		'label'               => __( 'Kommentar löschen', 'wp-agent-companion' ),
		'description'         => __( 'Ohne force: verhält sich sicher wie ein Trash (No-op, wenn bereits getrasht oder als Spam markiert). Mit force=true: löscht endgültig, unabhängig vom aktuellen Status. Verifiziert per Re-Read.', 'wp-agent-companion' ),
		'category'            => 'wp-agent',
		'input_schema'        => array(
			'type'       => 'object',
			'properties' => array(
				'comment_id' => array( 'type' => 'integer' ),
				'force'      => array(
					'type'        => 'boolean',
					'default'     => false,
					'description' => __( 'true = endgültig löschen (unumkehrbar). false (Default) = sicheres Trash-Verhalten.', 'wp-agent-companion' ),
				),
			),
			'required'   => array( 'comment_id' ),
		),
		'output_schema'       => array(
			'type'       => 'object',
			'properties' => array(
				'comment_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_comment',
		'permission_callback' => 'wpagent_perm_moderate_comments',
		'meta'                => array(
			'show_in_rest' => true,
			'annotations'  => array(
				'readonly'    => false,
				// Der einzige echte Datenverlust-Fall unter den Kommentar-
				// Abilities: mit force=true unumkehrbar. Bewusst analog zu
				// wp-agent/delete-post als destructive:true markiert, obwohl
				// force=false standardmäßig sicher ist.
				'destructive' => true,
				'idempotent'  => true,
			),
		),
	);
}

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

	if ( ! $comment ) {
		return new WP_Error( 'wpagent_no_comment', __( 'Kommentar nicht gefunden.', 'wp-agent-companion' ), array( 'status' => 404 ) );
	}

	// KEIN current_user_can( 'delete_comment', ... ): 'delete_comment' ist in
	// WordPress' eigenem map_meta_cap() KEIN registrierter Meta-Capability-Fall
	// (anders als 'delete_post', das über delete_posts/delete_pages auflöst).
	// Ohne eigenen 'delete_comment'-Case fällt map_meta_cap() auf ihren
	// Default-Zweig zurück und verlangt die IDENTISCHE, wörtliche Capability
	// 'delete_comment' als Primitiv-Capability, die aber standardmäßig
	// KEINER Rolle zugewiesen ist, auch nicht Administrator. Ein solcher Check
	// würde für praktisch jeden echten Nutzer also immer false liefern.
	// Kommentar-Löschrechte laufen in WordPress stattdessen über
	// 'edit_comment' (mappt auf edit_post des zugehörigen Beitrags), exakt wie
	// bei moderate-comment.php und reply-to-comment.php.
	if ( ! current_user_can( 'edit_comment', $comment_id ) ) {
		return new WP_Error( 'wpagent_forbidden', __( 'Keine Berechtigung.', 'wp-agent-companion' ), array( 'status' => 403 ) );
	}

	$current_status = wp_get_comment_status( $comment_id );

	if ( ! $force && in_array( $current_status, array( 'trash', 'spam' ), true ) ) {
		// Idempotent: siehe Datei-Kommentar oben. wp_delete_comment() OHNE
		// force_delete=true würde einen bereits getrashten ODER als Spam
		// markierten Kommentar hier trotzdem endgültig löschen.
		return array(
			'comment_id' => $comment_id,
			'forced'     => false,
			'trashed'    => ( 'trash' === $current_status ),
			'deleted'    => false,
			'verified'   => true,
		);
	}

	if ( ! $force && ! wpagent_trash_is_available() ) {
		return wpagent_trash_disabled_error();
	}

	$res = wp_delete_comment( $comment_id, $force );
	if ( ! $res ) {
		return new WP_Error( 'wpagent_delete_failed', __( 'Löschen fehlgeschlagen.', 'wp-agent-companion' ), array( 'status' => 500 ) );
	}

	if ( $force ) {
		$still_exists = (bool) get_comment( $comment_id );

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

	$fresh_status = wp_get_comment_status( $comment_id );
	$ok           = ( 'trash' === $fresh_status );

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