<?php
/**
 * Ability: wp-agent/delete-menu
 *
 * The ability remains registered for backwards-compatible discovery, but
 * remote deletion is deliberately unavailable. WordPress' menu deletion API
 * re-queries and removes menu items plus theme locations without an atomic
 * expected-state condition. Our application lock cannot serialize a human
 * wp-admin edit, so a check-then-delete request could remove that newer work.
 *
 * @package WPAgentCompanion
 */

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

function wpagent_ability_delete_menu(): array {
	return array(
		'label'               => __( 'Menü löschen', 'wp-agent-companion' ),
		'description'         => __( 'Der Remote-Löschweg für Menüs ist aus Sicherheitsgründen deaktiviert. WordPress bietet dafür keine atomare konfliktgeschützte Löschung von Menü, Einträgen und Positionen. Prüfe den aktuellen Zustand und lösche das Menü manuell unter Design > Menüs.', 'wp-agent-companion' ),
		'category'            => 'wp-agent',
		'input_schema'        => array(
			'type'       => 'object',
			'properties' => array(
				'menu_id'       => array( 'type' => 'integer', 'minimum' => 1 ),
				'expected_hash' => array( 'type' => 'string', 'pattern' => '^[a-f0-9]{64}$' ),
				'confirm'       => array(
					'type'        => 'boolean',
					'description' => __( 'Muss true sein. Der Request wird dennoch ohne Mutation mit einer sicheren manuellen Anweisung abgelehnt.', 'wp-agent-companion' ),
				),
			),
			'required'              => array( 'menu_id', 'expected_hash', 'confirm' ),
			'additionalProperties'  => false,
		),
		'output_schema'       => array(
			'type'                 => 'object',
			'properties'           => array(),
			'additionalProperties' => false,
		),
		'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,
				'idempotent'  => false,
				'manual_only' => true,
			),
		),
	);
}

/**
 * @param mixed $input
 * @return WP_Error
 */
function wpagent_exec_delete_menu( $input ) {
	$input = is_array( $input ) ? $input : array();
	if ( ! wpagent_core_mutator_is_strict_integer( $input['menu_id'] ?? null ) || (int) $input['menu_id'] < 1 ) {
		return new WP_Error( 'wpagent_bad_menu_id', __( 'menu_id muss eine positive Ganzzahl sein.', 'wp-agent-companion' ), array( 'status' => 400 ) );
	}
	$menu_id = (int) $input['menu_id'];
	if ( ! wp_get_nav_menu_object( $menu_id ) ) {
		return new WP_Error( 'wpagent_no_menu', __( 'Menü nicht gefunden.', 'wp-agent-companion' ), array( 'status' => 404 ) );
	}
	if ( true !== ( $input['confirm'] ?? null ) ) {
		return new WP_Error( 'wpagent_delete_confirmation_required', __( 'confirm=true ist für einen Löschversuch erforderlich.', 'wp-agent-companion' ), array( 'status' => 400 ) );
	}
	$expected_hash = wpagent_core_mutator_expected_hash( $input );
	if ( is_wp_error( $expected_hash ) ) {
		return $expected_hash;
	}
	if ( ! current_user_can( 'edit_theme_options' ) ) {
		return new WP_Error( 'wpagent_forbidden', __( 'Keine Berechtigung.', 'wp-agent-companion' ), array( 'status' => 403 ) );
	}
	$before = wpagent_core_mutator_menu_state( $menu_id );
	if ( ! is_array( $before ) ) {
		return wpagent_core_mutator_recovery_required( 'wpagent_menu_state_unavailable', __( 'Der vollständige Menü-Zustand konnte nicht sicher gelesen werden. Es wurde nichts geändert.', 'wp-agent-companion' ) );
	}
	if ( ! $before['bounded'] ) {
		return new WP_Error( 'wpagent_menu_delete_limit', __( 'Menüs mit mehr als 500 Einträgen werden nicht automatisch verarbeitet.', 'wp-agent-companion' ), array( 'status' => 413, 'current_hash' => $before['hash'] ) );
	}
	if ( ! hash_equals( $before['hash'], $expected_hash ) ) {
		return new WP_Error( 'wpagent_menu_conflict', __( 'Das Menü wurde seit dem Lesen verändert.', 'wp-agent-companion' ), array( 'status' => 409, 'current_hash' => $before['hash'] ) );
	}

	return new WP_Error(
		'wpagent_menu_manual_delete_required',
		__( 'Die Remote-Löschung von Menüs ist deaktiviert, weil WordPress Menüeinträge und Positionen nicht atomar gegen parallele Admin-Änderungen löscht. Prüfe den aktuellen Zustand und lösche das Menü manuell unter Design > Menüs.', 'wp-agent-companion' ),
		array( 'status' => 409, 'current_hash' => $before['hash'], 'manual_action_required' => true )
	);
}
