<?php
/**
 * Uninstall script for BW Dev.
 *
 * Runs when the plugin is deleted via the WP Admin plugins screen.
 * Cleans up options, custom tables, custom post-meta, and scheduled events.
 */

defined( 'WP_UNINSTALL_PLUGIN' ) || exit;

global $wpdb;

// Delete plugin options.
delete_option( 'bw_dev_settings' );
delete_option( 'bw_dev_version' );
delete_option( 'bw_dev_migration_version' );
delete_option( 'bw_dev_login_log_db_version' );
delete_option( 'bw_dev_dashboard_widget_cache' );
delete_option( 'bw_dev_request_firewall_fingerprint' );
delete_option( 'bw_dev_request_firewall_error' );
delete_option( 'bw_dev_request_firewall_allowlist_meta' );
delete_option( 'bw_dev_request_firewall_activations' );
delete_option( 'bw_dev_request_firewall_deployed_version' );
delete_option( 'bw_dev_request_firewall_decommissioned' );
delete_option( 'bw_dev_request_firewall_decommission_error' );

// Delete site meta on multisite.
if ( is_multisite() ) {
	delete_site_option( 'bw_dev_settings' );
	delete_site_option( 'bw_dev_migration_version' );
	delete_site_option( 'bw_dev_login_log_db_version' );
}

// Drop the Login Activity Log table.
$login_log_table = $wpdb->prefix . 'bw_dev_login_log';
$wpdb->query( "DROP TABLE IF EXISTS {$login_log_table}" ); // phpcs:ignore WordPress.DB

// Drop per-menu-item visibility meta from the Menu Visibility module.
$wpdb->delete( $wpdb->postmeta, array( 'meta_key' => '_bw_dev_menu_visibility' ), array( '%s' ) ); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key

// Drop per-post title override meta from the Title Override module.
$wpdb->delete( $wpdb->postmeta, array( 'meta_key' => '_bw_dev_title_override' ), array( '%s' ) ); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key

// Drop per-post scheduled-action meta from the Scheduled Post Actions module.
// `_bw_dev_psa_actions` is the current (1.11.1+) JSON-list key; the other four
// are legacy single-action keys kept around for cleanup on pre-1.11.1 data.
foreach ( array( '_bw_dev_psa_timestamp', '_bw_dev_psa_actions', '_bw_dev_psa_action', '_bw_dev_psa_status', '_bw_dev_psa_taxonomy', '_bw_dev_psa_terms' ) as $bw_dev_psa_meta_key ) {
	$wpdb->delete( $wpdb->postmeta, array( 'meta_key' => $bw_dev_psa_meta_key ), array( '%s' ) ); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
}

// Clear any scheduled events the plugin owns.
wp_clear_scheduled_hook( 'bw_dev_login_log_prune' );
wp_clear_scheduled_hook( 'bw_dev_psa_run' );
wp_clear_scheduled_hook( 'bw_dev_request_firewall_rebuild' );
wp_clear_scheduled_hook( 'bw_dev_request_firewall_rebuild_daily' );

// Remove the Request Firewall mu-plugin stub + its data dir (allowlist +
// counter store) — self-contained files the plugin manages outside its own
// directory.
$bw_dev_rf_mu = ( defined( 'WPMU_PLUGIN_DIR' ) ? WPMU_PLUGIN_DIR : ( WP_CONTENT_DIR . '/mu-plugins' ) );
$bw_dev_rf_stub = $bw_dev_rf_mu . '/bw-request-firewall.php';
if ( is_file( $bw_dev_rf_stub ) && is_writable( $bw_dev_rf_stub ) ) {
	@unlink( $bw_dev_rf_stub ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
}
$bw_dev_rf_data = $bw_dev_rf_mu . '/bw-request-firewall-data';
if ( is_dir( $bw_dev_rf_data ) ) {
	foreach ( (array) glob( $bw_dev_rf_data . '/*' ) as $bw_dev_rf_f ) {
		if ( is_file( $bw_dev_rf_f ) ) {
			@unlink( $bw_dev_rf_f ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
		}
	}
	@rmdir( $bw_dev_rf_data ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
}

// Also drop the diagnostic log if present.
$bw_dev_rf_log = WP_CONTENT_DIR . '/bw-request-firewall.log';
if ( is_file( $bw_dev_rf_log ) && is_writable( $bw_dev_rf_log ) ) {
	@unlink( $bw_dev_rf_log ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
}
