<?php
use WP_science\Logger\Logger;

defined( 'ABSPATH' ) || exit;

/**
 * Tell WP what to do when admin is loaded aka upgrader
 *
 * @since 1.0
 */
function science_upgrader() {
	// Grab some infos.
	$actual_version = (string) get_science_option( 'version' );
	// You can hook the upgrader to trigger any action when WP science is upgraded.
	// first install.
	if ( ! $actual_version ) {
		do_action( 'wp_science_first_install' );
	}
	// already installed but got updated.
	elseif ( WP_science_VERSION !== $actual_version ) {
		do_action( 'wp_science_upgrade', WP_science_VERSION, $actual_version );
	}

	// If any upgrade has been done, we flush and update version number.
	if ( did_action( 'wp_science_first_install' ) || did_action( 'wp_science_upgrade' ) ) {
		flush_science_htaccess();

		$options            = get_option( WP_science_SLUG ); // do not use get_science_option() here.
		$options['version'] = WP_science_VERSION;

		$keys = science_check_key();
		if ( is_array( $keys ) ) {
			$options = array_merge( $keys, $options );
		}

		update_option( WP_science_SLUG, $options );
	}

	$page = isset( $_GET['page'] ) ? sanitize_key( $_GET['page'] ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended

	if (
		'wpscience' === $page
		&&
		did_action( 'wp_science_upgrade' )
	) {
		wp_safe_redirect( esc_url_raw( admin_url( 'options-general.php?page=wpscience' ) ) );
		exit;
	}

	if ( ! science_valid_key() && current_user_can( 'science_manage_options' ) && 'wpscience' === $page ) {
		add_action( 'admin_notices', 'science_need_api_key' );
	}
}
add_action( 'admin_init', 'science_upgrader' );

/**
 * Keeps this function up to date at each version
 *
 * @since 1.0
 */
function science_first_install() {
	// Generate an random key for cache dir of user.
	$secret_cache_key = create_science_uniqid();

	// Generate an random key for minify md5 filename.
	$minify_css_key = create_science_uniqid();
	$minify_js_key  = create_science_uniqid();

	// Create Option.
	add_option(
		science_get_constant( 'WP_science_SLUG' ),
		/**
		 * Filters the default science options array
		 *
		 * @since 2.8
		 *
		 * @param array Array of default science options
		 */
		apply_filters(
			'science_first_install_options',
			[
				'secret_cache_key'            => $secret_cache_key,
				'cache_mobile'                => 1,
				'do_caching_mobile_files'     => 0,
				'cache_webp'                  => 0,
				'cache_logged_user'           => 0,
				'cache_ssl'                   => 1,
				'emoji'                       => 1,
				'cache_reject_uri'            => [],
				'cache_reject_cookies'        => [],
				'cache_reject_ua'             => [],
				'cache_query_strings'         => [],
				'cache_purge_pages'           => [],
				'purge_cron_interval'         => 10,
				'purge_cron_unit'             => 'HOUR_IN_SECONDS',
				'exclude_css'                 => [],
				'exclude_js'                  => [],
				'exclude_inline_js'           => [],
				'defer_all_js'                => 0,
				'async_css'                   => 0,
				'critical_css'                => '',
				'lazyload'                    => 0,
				'lazyload_iframes'            => 0,
				'lazyload_youtube'            => 0,
				'minify_css'                  => 0,
				'minify_css_key'              => $minify_css_key,
				'minify_js'                   => 0,
				'minify_js_key'               => $minify_js_key,
				'minify_concatenate_js'       => 0,
				'minify_google_fonts'         => 1,
				'manual_preload'              => 1,
				'dns_prefetch'                => 0,
				'preload_fonts'               => [],
				'database_revisions'          => 0,
				'database_auto_drafts'        => 0,
				'database_trashed_posts'      => 0,
				'database_spam_comments'      => 0,
				'database_trashed_comments'   => 0,
				'database_all_transients'     => 0,
				'database_optimize_tables'    => 0,
				'schedule_automatic_cleanup'  => 0,
				'automatic_cleanup_frequency' => 'daily',
				'cdn'                         => 0,
				'cdn_cnames'                  => [],
				'cdn_zone'                    => [],
				'cdn_reject_files'            => [],
				'do_cloudflare'               => 0,
				'cloudflare_email'            => '',
				'cloudflare_api_key'          => '',
				'cloudflare_zone_id'          => '',
				'cloudflare_devmode'          => 0,
				'cloudflare_protocol_rewrite' => 0,
				'cloudflare_auto_settings'    => 0,
				'cloudflare_old_settings'     => '',
				'control_heartbeat'           => 1,
				'heartbeat_site_behavior'     => 'reduce_periodicity',
				'heartbeat_admin_behavior'    => 'reduce_periodicity',
				'heartbeat_editor_behavior'   => 'reduce_periodicity',
				'varnish_auto_purge'          => 0,
				'analytics_enabled'           => 0,
				'sucury_waf_cache_sync'       => 0,
				'sucury_waf_api_key'          => '',
			]
		)
	);
	science_dismiss_box( 'science_warning_plugin_modification' );
}
add_action( 'wp_science_first_install', 'science_first_install' );

/**
 * What to do when science is updated, depending on versions
 *
 * @since 1.0
 *
 * @param string $wp_science_version Latest WP science version.
 * @param string $actual_version Installed WP science version.
 */
function science_new_upgrade( $wp_science_version, $actual_version ) {
	if ( version_compare( $actual_version, '2.4.1', '<' ) ) {
		delete_transient( 'science_ask_for_update' );
	}

	if ( version_compare( $actual_version, '2.8', '<' ) ) {
		$options                              = get_option( WP_science_SLUG );
		$options['manual_preload']            = 1;
		$options['automatic_preload']         = 1;
		$options['sitemap_preload_url_crawl'] = '500000';

		update_option( WP_science_SLUG, $options );
	}

	// Deactivate CloudFlare completely if PHP Version is lower than 5.4.
	if ( version_compare( $actual_version, '2.8.16', '<' ) ) {
		$options                                = get_option( WP_science_SLUG );
		$options['do_cloudflare']               = 0;
		$options['cloudflare_email']            = '';
		$options['cloudflare_api_key']          = '';
		$options['cloudflare_devmode']          = 0;
		$options['cloudflare_protocol_rewrite'] = 0;
		$options['cloudflare_auto_settings']    = 0;
		$options['cloudflare_old_settings']     = '';

		update_option( WP_science_SLUG, $options );
	}

	// Disable minification options if they're active in Autoptimize.
	if ( version_compare( $actual_version, '2.9.5', '<' ) ) {
		if ( is_plugin_active( 'autoptimize/autoptimize.php' ) ) {
			if ( 'on' === get_option( 'autoptimize_css' ) ) {
				update_science_option( 'minify_css', 0 );
			}

			if ( 'on' === get_option( 'autoptimize_js' ) ) {
				update_science_option( 'minify_js', 0 );
			}
		}
	}

	// Delete old transients.
	if ( version_compare( $actual_version, '2.9.7', '<' ) ) {
		delete_transient( 'science_check_licence_30' );
		delete_transient( 'science_check_licence_1' );
	}

	if ( version_compare( $actual_version, '2.11', '<' ) ) {
		science_clean_minify();
	}

	if ( version_compare( $actual_version, '3.2', '<' ) ) {
		// Default Heartbeat settings.
		$options                              = get_option( WP_science_SLUG, [] );
		$options['heartbeat_site_behavior']   = 'reduce_periodicity';
		$options['heartbeat_admin_behavior']  = 'reduce_periodicity';
		$options['heartbeat_editor_behavior'] = 'reduce_periodicity';

		if ( ! empty( $options['automatic_preload'] ) || ! empty( $options['sitemap_preload'] ) ) {
			$options['manual_preload'] = 1;
		}

		update_option( WP_science_SLUG, $options );
		science_generate_config_file();

		// Create a .htaccess file in the log folder.
		$handler = Logger::get_stream_handler();

		if ( method_exists( $handler, 'create_htaccess_file' ) ) {
			try {
				$success = $handler->create_htaccess_file();
			} catch ( \Exception $e ) {
				$success = false;
			}

			if ( ! $success ) {
				Logger::delete_log_file();
			}
		}
	}

	if ( version_compare( $actual_version, '3.2.0.1', '<' ) ) {
		wp_safe_remote_get( esc_url( home_url() ) );
	}

	if ( version_compare( $actual_version, '3.12.6', '<' ) ) {
		do_action( 'science_preload_unlock_all_urls' );
	}

	if ( version_compare( $actual_version, '3.3.6', '<' ) ) {
		delete_site_transient( 'update_wpscience' );
		delete_site_transient( 'update_wpscience_response' );

		if ( get_science_option( 'do_cloudflare' ) && get_science_option( 'cloudflare_auto_settings' ) ) {
			if ( function_exists( 'set_science_cloudflare_browser_cache_ttl' ) ) {
				set_science_cloudflare_browser_cache_ttl( '31536000' );
			}
		}
	}

	if ( science_is_ssl_website() ) {
		if ( 1 !== (int) get_science_option( 'cache_ssl' ) ) {
			update_science_option( 'cache_ssl', 1 );
			science_generate_config_file();
		}
	}

	if ( version_compare( $actual_version, '3.4', '<' ) ) {
		wp_clear_scheduled_hook( 'science_purge_time_event' );
	}

	if ( version_compare( $actual_version, '3.6', '<' ) ) {
		science_clean_cache_busting();
		science_clean_domain();
	}

	if ( version_compare( $actual_version, '3.7', '<' ) ) {
		science_clean_minify( 'css' );
		science_generate_advanced_cache_file();
	}

	if ( version_compare( $actual_version, '3.8.1', '<' ) ) {
		$options = get_option( science_get_constant( 'WP_science_SLUG' ) );
		unset( $options['dequeue_jquery_migrate'] );
		update_option( science_get_constant( 'WP_science_SLUG' ), $options );
	}

	if ( version_compare( $actual_version, '3.9', '<' ) ) {
		$busting_path = science_get_constant( 'WP_science_CACHE_BUSTING_PATH' );

		science_rrmdir( $busting_path . 'facebook-tracking' );
		science_rrmdir( $busting_path . 'google-tracking' );
		wp_clear_scheduled_hook( 'science_facebook_tracking_cache_update' );
		wp_clear_scheduled_hook( 'science_google_tracking_cache_update' );
	}

	if ( version_compare( $actual_version, '3.10', '<' ) ) {
		$options = get_option( science_get_constant( 'WP_science_SLUG' ) );
		if (
			isset( $options['async_css'] ) && $options['async_css'] &&
			isset( $options['remove_unused_css'] ) && $options['remove_unused_css']
		) {
			$options['async_css'] = 0;
			$cache_path           = science_get_constant( 'WP_science_CACHE_ROOT_PATH' );
			science_rrmdir( $cache_path . 'used-css' );
			update_option( science_get_constant( 'WP_science_SLUG' ), $options );
		}
	}

	if ( version_compare( $actual_version, '3.11.1', '<' ) ) {
		science_generate_config_file();
	}

	if ( version_compare( $actual_version, '3.12.4', '<' ) ) {
		delete_transient( 'wp_science_pricing' );
	}
}
add_action( 'wp_science_upgrade', 'science_new_upgrade', 10, 2 );
