<?php
/**
 * Uninstall — czyszczenie danych po usunięciu wtyczki.
 *
 * DOMYŚLNIE DANE SĄ ZACHOWYWANE. Faktury są wspólne z wersją Pro (ksef-wordpress)
 * i podlegają ustawowemu obowiązkowi przechowywania (5 lat), więc kasujemy je
 * TYLKO gdy użytkownik świadomie zaznaczył w Ustawieniach „Usuń wszystkie dane
 * przy odinstalowaniu" — i tylko gdy druga wtyczka KSeF nie jest już zainstalowana.
 *
 * @package KSEF\WordPress
 */

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

// phpcs:disable WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders, WordPress.DB.SlowDBQuery, PluginCheck.Security.DirectDB.UnescapedDBParameter -- Wlasne tabele gksef_*: wartosci przez $wpdb->prepare()/esc_like(), nazwy tabel z $wpdb->prefix, paginacja rzutowana (int).

// ── Ochrona wspólnych danych ────────────────────────────────────────────────
// Tabele gksef_* i opcje są WSPÓLNE z wersją Pro (ksef-wordpress). Jeśli Pro jest
// nadal zainstalowane (choćby nieaktywne po auto-zamianie) — dane należą do niej,
// więc niczego nie usuwamy.
if ( ! function_exists( 'get_plugins' ) ) {
	require_once ABSPATH . 'wp-admin/includes/plugin.php';
}
if ( array_key_exists( 'ksef-wordpress/ksef-wordpress.php', get_plugins() ) ) {
	return;
}

// Domyślnie ZACHOWAJ wszystko. Pełne czyszczenie tylko na wyraźne życzenie usera.
if ( '1' !== (string) get_option( 'ksef_delete_data_on_uninstall', '0' ) ) {
	return;
}

// Pelne czyszczenie w domknieciu, by zmienne lokalne nie trafialy do globalnego zakresu.
( static function () {
	global $wpdb;

	// ── 1. Tabele (wszystkie gksef_*) ──────────────────────────────────────────
	$tables = [
		$wpdb->prefix . 'gksef_licenses',
		$wpdb->prefix . 'gksef_credentials',
		$wpdb->prefix . 'gksef_outgoing_invoices',
		$wpdb->prefix . 'gksef_incoming_invoices',
		$wpdb->prefix . 'gksef_contractor_mappings',
		$wpdb->prefix . 'gksef_sync_log',
		$wpdb->prefix . 'gksef_invoice_attachments',
		$wpdb->prefix . 'gksef_incoming_payments',
		$wpdb->prefix . 'gksef_invoice_payments',
		$wpdb->prefix . 'gksef_sync_jobs',
		$wpdb->prefix . 'gksef_bank_accounts',
	];
	foreach ( $tables as $table ) {
		$wpdb->query( "DROP TABLE IF EXISTS `{$table}`" ); // phpcs:ignore
	}

	// ── 2. Pliki załączników z dysku (skany, PDF-y, korespondencja) ─────────────
	// To dane osobowe klientów — muszą zniknąć fizycznie z serwera.
	$uploads = wp_upload_dir();
	$private = ! empty( $uploads['basedir'] ) ? rtrim( (string) $uploads['basedir'], '/' ) . '/ksef-private' : '';
	if ( $private && is_dir( $private ) ) {
		$it = new RecursiveIteratorIterator(
			new RecursiveDirectoryIterator( $private, FilesystemIterator::SKIP_DOTS ),
			RecursiveIteratorIterator::CHILD_FIRST
		);
		foreach ( $it as $file ) {
			if ( $file->isDir() ) {
				@rmdir( $file->getPathname() ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_rmdir -- lokalne operacje na wlasnych plikach wtyczki (cache/upload).
			} else {
				@unlink( $file->getPathname() ); // phpcs:ignore WordPress.WP.AlternativeFunctions.unlink_unlink -- lokalne operacje na wlasnych plikach wtyczki (cache/upload).
			}
		}
		@rmdir( $private ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_rmdir -- lokalne operacje na wlasnych plikach wtyczki (cache/upload).
	}

	// ── 3. Opcje (licencja, ustawienia, uprawnienia, logi, schema, tokeny) ──────
	$exact_options = [
		'gksef_license_key', 'gksef_license_status', 'gksef_license_expiration',
		'gksef_license_activation_code', 'gksef_license_product_type',
		'gksef_license_next_check', 'gksef_license_max_sites',
		'gksef_license_monthly_invoice_limit',
		'_gksef_encryption_salt',
		'ksef_db_version', 'ksef_outgoing_schema_v', 'ksef_integrity_version',
		'ksef_emergency_disabled', 'ksef_auth_debug_log', 'ksef_sync_runner_token',
		'ksef_role_caps', 'ksef_user_caps', 'ksef_caps_v160_cleanup',
		'ksef_default_credential_id', 'ksef_free_tier_unlocked_v',
		'ksef_pdf_cache_locked_v', 'ksef_sensitive_encrypted_v',
		'gksef_seller_name', 'gksef_seller_email', 'gksef_seller_phone',
		'gksef_seller_street', 'gksef_seller_street_number', 'gksef_seller_postal_code',
		'gksef_seller_city', 'gksef_seller_country', 'gksef_email_recipient',
	];
	foreach ( $exact_options as $opt ) {
		delete_option( $opt );
	}

	// Opcje z prefiksem (liczniki numeracji, circuit breakery, token expiry per cred).
	$like_prefixes = [ 'ksef_invc_', 'ksef_invoice_counter_', 'ksef_token_expires_', 'gksef_circuit_breaker_', 'gksef_rate_limit_' ];
	foreach ( $like_prefixes as $pfx ) {
		$wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s", $wpdb->esc_like( $pfx ) . '%' ) );
	}

	// ── 4. Transienty (cache hashy, klucze publiczne MF, tokeny sesji KSeF) ─────
	$wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE '\\_transient\\_ksef%' OR option_name LIKE '\\_transient\\_timeout\\_ksef%' OR option_name LIKE '\\_transient\\_gksef%' OR option_name LIKE '\\_transient\\_timeout\\_gksef%'" );

	// ── 5. Crony ────────────────────────────────────────────────────────────────
	$crons = [
		'ksef_validate_license_cron', 'ksef_license_hourly_validation_cron',
		'ksef_poll_status_cron', 'ksef_v2_poll_status_cron',
		'ksef_v2_fetch_incoming_cron', 'ksef_v2_fetch_outgoing_cron',
		'ksef_check_credentials_expiry', 'ksef_cleanup_pdf_cache',
	];
	foreach ( $crons as $hook ) {
		wp_clear_scheduled_hook( $hook );
	}

	// ── 6. Capabilities z ról WP ──────────────────────────────────────────────
	$caps = [
		'ksef_view_outgoing', 'ksef_view_incoming', 'ksef_create_invoice',
		'ksef_view_external_invoices', 'ksef_view_contractors', 'ksef_view_reports',
		'ksef_view_monitoring', 'ksef_view_settings',
	];
	foreach ( wp_roles()->roles as $role_name => $_role ) {
		$role = get_role( $role_name );
		if ( ! $role ) {
			continue;
		}
		foreach ( $caps as $cap ) {
			$role->remove_cap( $cap );
		}
	}
} )();
