<?php
/**
 * Ability: wp-agent/delete-menu
 *
 * Löscht ein Navigationsmenü endgültig. wp_delete_nav_menu() im WordPress-Kern
 * löscht dabei automatisch auch alle Menüeinträge dieses Menüs (nav_menu_item-
 * Posts) und entfernt das Menü aus jeder Position, der es zugewiesen war
 * (Theme-Mod nav_menu_locations wird auf 0 zurückgesetzt). Es gibt für Menüs
 * kein Papierkorb-Äquivalent: der Vorgang ist unumkehrbar, deshalb
 * destructive=true, analog zu wp-agent/delete-post mit force=true.
 *
 * Permission-Callback wpagent_perm_edit_theme_options ist in create-menu.php
 * definiert (siehe dortiger Kommentar); diese Datei referenziert sie nur.
 *
 * @package WPAgentCompanion
 */

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

function wpagent_ability_delete_menu(): array {
	return array(
		'label'               => __( 'Menü löschen', 'wp-agent-companion' ),
		'description'         => __( 'Löscht ein Navigationsmenü endgültig, inklusive aller Menüeinträge, und entfernt es aus allen Positionen, denen es zugewiesen war. Unumkehrbar. Verifiziert per Re-Read, dass das Menü nicht mehr existiert.', 'wp-agent-companion' ),
		'category'            => 'wp-agent',
		'input_schema'        => array(
			'type'       => 'object',
			'properties' => array(
				'menu_id' => array( 'type' => 'integer' ),
			),
			'required'   => array( 'menu_id' ),
		),
		'output_schema'       => array(
			'type'       => 'object',
			'properties' => array(
				'menu_id'  => array( 'type' => 'integer' ),
				'deleted'  => array( 'type' => 'boolean' ),
				'verified' => array( 'type' => 'boolean' ),
			),
		),
		'execute_callback'    => 'wpagent_exec_delete_menu',
		'permission_callback' => 'wpagent_perm_edit_theme_options',
		'meta'                => array(
			'show_in_rest' => true,
			'annotations'  => array(
				'readonly'    => false,
				'destructive' => true,
				// Endgültig und ohne Zwischenzustand: ein erneuter Aufruf auf
				// dasselbe (bereits gelöschte) menu_id findet das Menü nicht mehr
				// und meldet 404, verändert dabei aber nichts mehr am Zustand.
				// Kein zusätzlicher Umwelteffekt bei Wiederholung, analog zu
				// wp-agent/delete-post mit force=true.
				'idempotent'  => true,
			),
		),
	);
}

/**
 * @param mixed $input
 * @return array|WP_Error
 */
function wpagent_exec_delete_menu( $input ) {
	$input   = is_array( $input ) ? $input : array();
	$menu_id = (int) ( $input['menu_id'] ?? 0 );
	$menu    = wp_get_nav_menu_object( $menu_id );

	if ( ! $menu ) {
		return new WP_Error( 'wpagent_no_menu', __( 'Menü nicht gefunden.', 'wp-agent-companion' ), array( 'status' => 404 ) );
	}

	$result = wp_delete_nav_menu( $menu_id );
	if ( is_wp_error( $result ) ) {
		return new WP_Error( 'wpagent_delete_menu_failed', $result->get_error_message(), array( 'status' => 500 ) );
	}
	if ( ! $result ) {
		return new WP_Error( 'wpagent_delete_menu_failed', __( 'Menü konnte nicht gelöscht werden.', 'wp-agent-companion' ), array( 'status' => 500 ) );
	}

	$still_exists = (bool) wp_get_nav_menu_object( $menu_id );

	return array(
		'menu_id'  => $menu_id,
		'deleted'  => ! $still_exists,
		'verified' => ! $still_exists,
	);
}
