<?php
/**
 * Ability: wp-agent/deactivate-plugin
 *
 * Deaktiviert ein installiertes Plugin über deactivate_plugins(). Die
 * Kernfunktion ist von sich aus idempotent (ein bereits inaktives Plugin wird
 * pro Schleifendurchlauf einfach übersprungen) und feuert die
 * deactivate_plugin/deactivate_{plugin}-Hooks nur für tatsächlich aktive
 * Plugins; ein fehlerhafter Deaktivierungs-Hook eines Fremd-Plugins wird
 * trotzdem per Throwable-Fang abgefangen (siehe activate-plugin.php für die
 * ausführliche Begründung, warum das kein vollständiger Fatal-Schutz sein
 * kann und wo die Grenze liegt).
 *
 * HARTER Schutz: wp-agent-companion und wp-agent-power können über diese
 * Ability NIEMALS deaktiviert werden. Ein Deaktivieren von wp-agent-companion
 * würde die eigene Ability-Registrierung (inklusive dieser Ability selbst)
 * beim nächsten Request entfernen; ein Deaktivieren von wp-agent-power
 * gehört ausschließlich zum dedizierten Panik-Schalter
 * wp-agent/disable-power, der bewusst unabhängig von dieser generischen
 * Ability existiert. Der Schutz greift unabhängig vom aktuellen
 * Aktiv-Status der beiden Plugins.
 *
 * @package WPAgentCompanion
 */

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

function wpagent_ability_deactivate_plugin(): array {
	return array(
		'label'               => __( 'Plugin deaktivieren', 'wp-agent-companion' ),
		'description'         => __( 'Deaktiviert ein installiertes Plugin und verifiziert per Re-Read (is_plugin_active), dass es inaktiv ist. wp-agent-companion und wp-agent-power sind hart ausgenommen (Selbstschutz).', 'wp-agent-companion' ),
		'category'            => 'wp-agent',
		'input_schema'        => array(
			'type'       => 'object',
			'properties' => array(
				'plugin_file' => array(
					'type'        => 'string',
					'description' => __( 'Relativer Plugin-Pfad wie von get_plugins() geliefert, z. B. "akismet/akismet.php".', 'wp-agent-companion' ),
				),
			),
			'required'   => array( 'plugin_file' ),
		),
		'output_schema'       => array(
			'type'       => 'object',
			'properties' => array(
				'plugin_file' => array( 'type' => 'string' ),
				'active'      => array( 'type' => 'boolean' ),
				'verified'    => array( 'type' => 'boolean' ),
			),
		),
		'execute_callback'    => 'wpagent_exec_deactivate_plugin',
		'permission_callback' => 'wpagent_perm_activate_plugins',
		'meta'                => array(
			'show_in_rest' => true,
			'annotations'  => array(
				'readonly'    => false,
				// Wie wp-agent/disable-power: eine Deaktivierung ist folgenreich,
				// aber kein Datenverlust und jederzeit über wp-agent/activate-plugin
				// umkehrbar. Deshalb destructive:false, analog zum bestehenden
				// Companion-Präzedenzfall.
				'destructive' => false,
				'idempotent'  => true,
			),
		),
	);
}

/**
 * @param mixed $input
 * @return array|WP_Error
 */
function wpagent_exec_deactivate_plugin( $input ) {
	$input       = is_array( $input ) ? $input : array();
	$plugin_file = (string) ( $input['plugin_file'] ?? '' );

	if ( '' === trim( $plugin_file ) ) {
		return new WP_Error( 'wpagent_missing_plugin', __( 'plugin_file fehlt.', 'wp-agent-companion' ), array( 'status' => 400 ) );
	}

	if ( ! function_exists( 'get_plugins' ) ) {
		require_once ABSPATH . 'wp-admin/includes/plugin.php';
	}

	$installed = get_plugins();
	if ( ! isset( $installed[ $plugin_file ] ) ) {
		return new WP_Error( 'wpagent_no_plugin', __( 'Plugin nicht gefunden.', 'wp-agent-companion' ), array( 'status' => 404 ) );
	}

	// Siehe Datei-Kommentar: harter, unbedingter Selbstschutz.
	$protected = array( 'wp-agent-companion/wp-agent-companion.php', 'wp-agent-power/wp-agent-power.php' );
	if ( in_array( $plugin_file, $protected, true ) ) {
		return new WP_Error(
			'wpagent_protected_plugin',
			__( 'wp-agent-companion und wp-agent-power können über diese Ability nicht deaktiviert werden. Für den Power-Modus gezielt wp-agent/disable-power verwenden.', 'wp-agent-companion' ),
			array( 'status' => 400 )
		);
	}

	try {
		deactivate_plugins( $plugin_file );
	} catch ( \Throwable $e ) {
		return new WP_Error(
			'wpagent_deactivation_fatal',
			sprintf(
				/* translators: 1: Plugin-Pfad, 2: Fehlermeldung. */
				__( 'Deaktivierung von "%1$s" hat einen fatalen Fehler ausgelöst: %2$s', 'wp-agent-companion' ),
				$plugin_file,
				$e->getMessage()
			),
			array( 'status' => 500 )
		);
	}

	$active = is_plugin_active( $plugin_file );

	return array(
		'plugin_file' => $plugin_file,
		'active'      => $active,
		'verified'    => ! $active,
	);
}
