<?php
if (!defined('ABSPATH')) die('Access denied.');

if (!class_exists('WPO_Uninstall')) :

class WPO_Uninstall {

	/**
	 * Actions to be performed upon plugin uninstallation
	 */
	public static function actions() {
		WP_Optimize()->get_gzip_compression()->disable();
		WP_Optimize()->get_browser_cache()->disable();
		WP_Optimize()->get_options()->delete_all_options();
		WP_Optimize()->get_minify()->plugin_uninstall();
		WP_Optimize()->get_options()->wipe_settings();
		WP_Optimize()->delete_transients_and_semaphores();
		// Using Updraft_Smush_Manager() throws `Call to undefined function` fatal error
		Updraft_Smush_Manager::instance()->delete_log_files();
		Updraft_Tasks_Activation::uninstall(WPO_PLUGIN_SLUG);
		self::delete_wpo_folder();

		$wpo_plugins_table_list = self::get_upload_basedir() . 'wpo-plugins-tables-list.json';
		if (is_file($wpo_plugins_table_list)) {
			unlink($wpo_plugins_table_list);
		}
		
		$htaccess_file = self::get_upload_basedir() . '.htaccess';
		if (is_file($htaccess_file) && 0 === filesize($htaccess_file)) {
			unlink($htaccess_file);
		}
		
		wp_clear_scheduled_hook('wpo_smush_clear_backup_images');
		wp_clear_scheduled_hook('wpo_minify_purge_old_cache');
		wp_clear_scheduled_hook('process_smush_tasks');
	}

	/**
	 * Returns absolute path to uploads folder
	 *
	 * @return string
	 */
	private static function get_upload_basedir() {
		$upload_dir = wp_get_upload_dir();
		return trailingslashit($upload_dir['basedir']);
	}

	/**
	 * Returns an array of sub folders in `uploads/wpo` folder
	 *
	 * @return array
	 */
	private static function get_wpo_sub_folders() {
		$sub_folders =  array(
			'add-type',
			'content-digest',
			'crash-tester',
			'directory-index',
			'header-set',
			'images',
			'module-loaded',
			'rewrite',
			'server-signature',
		);
		return apply_filters('wpo_uploads_sub_folders', $sub_folders);
	}

	/**
	 * Delete `uploads/wpo` sub folders and if it is empty delete the folder itself
	 */
	public static function delete_wpo_folder() {
		$wpo_folder = self::get_upload_basedir() . trailingslashit('wpo');
		require_once WPO_PLUGIN_MAIN_PATH . 'cache/file-based-page-cache-functions.php';
		if (is_dir($wpo_folder)) {
			$wpo_sub_folders = self::get_wpo_sub_folders();
			foreach ($wpo_sub_folders as $folder) {
				wpo_delete_files($wpo_folder . $folder);
			}
			$files = @scandir($wpo_folder); // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- suppress warning if it arises due to race condition
			if (false === $files) return;
			if (2 === count($files)) {
				@rmdir($wpo_folder); // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- suppress error due to file permission issues
			}
		}
	}
}

endif;
