<?php
/**
 * Plugin Name: Easy WP SMTP
 * Version: 2.13.0
 * Requires at least: 5.2
 * Requires PHP: 7.4
 * Plugin URI: https://easywpsmtp.com/
 * Author: Easy WP SMTP
 * Author URI: https://easywpsmtp.com/
 * Description: Fix your WordPress email delivery by sending them via a transactional email provider or an SMTP server.
 * Text Domain: easy-wp-smtp
 * Domain Path: /assets/languages
 */

if ( ! defined( 'EasyWPSMTP_PLUGIN_VERSION' ) ) {
	define( 'EasyWPSMTP_PLUGIN_VERSION', '2.13.0' );
}
if ( ! defined( 'EasyWPSMTP_PHP_VERSION' ) ) {
	define( 'EasyWPSMTP_PHP_VERSION', '7.4' );
}
if ( ! defined( 'EasyWPSMTP_WP_VERSION' ) ) {
	define( 'EasyWPSMTP_WP_VERSION', '5.2' );
}
if ( ! defined( 'EasyWPSMTP_PLUGIN_FILE' ) ) {
	define( 'EasyWPSMTP_PLUGIN_FILE', __FILE__ );
}

/**
 * Don't allow multiple versions (Lite and Pro) to be active.
 *
 * @since 2.1.0
 */
if ( function_exists( 'easy_wp_smtp' ) || class_exists( 'EasyWPSMTP' ) ) {

	if ( ! function_exists( 'easy_wp_smtp_lite_deactivate' ) ) {
		/**
		 * Deactivate Lite version.
		 *
		 * @since 2.1.0
		 */
		function easy_wp_smtp_lite_deactivate() {

			require_once ABSPATH . WPINC . '/pluggable.php';

			$plugin = 'easy-wp-smtp/easy-wp-smtp.php';

			deactivate_plugins( $plugin );
		}
	}

	/**
	 * When we activate a Pro version, we need to deactivate a Lite version.
	 *
	 * @since 2.1.0
	 */
	add_action( 'activate_easy-wp-smtp-pro/easy-wp-smtp.php', 'easy_wp_smtp_lite_deactivate' );

	/**
	 * If a Pro version already loaded, we need to deactivate a Lite version.
	 *
	 * @since 2.1.0
	 */
	add_action( 'admin_init', 'easy_wp_smtp_lite_deactivate' );

	/**
	 * Display notice if user wants to activate the Lite when Pro is active.
	 */

	if ( ! function_exists( 'easy_wp_smtp_lite_just_activated' ) ) {
		/**
		 * Store temporarily that the Lite version of the plugin was activated.
		 * This is needed because WP does a redirect after activation and
		 * we need to preserve this state to know whether user activated Lite or not.
		 *
		 * @since 2.1.0
		 */
		function easy_wp_smtp_lite_just_activated() {

			set_transient( 'easy_wp_smtp_lite_just_activated', true );
		}
	}
	add_action( 'activate_easy-wp-smtp/easy-wp-smtp.php', 'easy_wp_smtp_lite_just_activated' );

	if ( ! function_exists( 'easy_wp_smtp_lite_just_deactivated' ) ) {
		/**
		 * Store temporarily that Lite plugin was deactivated.
		 * Convert temporary "activated" value to a global variable,
		 * so it is available through the request. Remove from the storage.
		 *
		 * @since 2.1.0
		 */
		function easy_wp_smtp_lite_just_deactivated() {

			global $easy_wp_smtp_lite_just_activated, $easy_wp_smtp_lite_just_deactivated;

			$easy_wp_smtp_lite_just_activated   = (bool) get_transient( 'easy_wp_smtp_lite_just_activated' );
			$easy_wp_smtp_lite_just_deactivated = true;

			delete_transient( 'easy_wp_smtp_lite_just_activated' );
		}
	}
	add_action( 'deactivate_easy-wp-smtp/easy-wp-smtp.php', 'easy_wp_smtp_lite_just_deactivated' );

	if ( ! function_exists( 'easy_wp_smtp_lite_notice' ) ) {
		/**
		 * Display the notice after Lite deactivation when Pro is still active
		 * and user wanted to activate the Lite version of the plugin.
		 *
		 * @since 2.1.0
		 */
		function easy_wp_smtp_lite_notice() {

			global $easy_wp_smtp_lite_just_activated, $easy_wp_smtp_lite_just_deactivated;

			if (
				empty( $easy_wp_smtp_lite_just_activated ) ||
				empty( $easy_wp_smtp_lite_just_deactivated )
			) {
				return;
			}

			// Currently tried to activate Lite with Pro still active, so display the message.
			printf(
				'<div class="notice notice-warning easy-wp-smtp-notice">
					<p>%1$s</p>
					<p>%2$s</p>
				</div>',
				esc_html__( 'Heads up!', 'easy_wp_smtp-lite' ),
				esc_html__( 'Your site already has Easy WP SMTP Pro activated. If you want to switch to Easy WP SMTP, please first go to Plugins → Installed Plugins and deactivate Easy WP SMTP Pro. Then, you can activate Easy WP SMTP.', 'easy-wp-smtp' )
			);

			if ( isset( $_GET['activate'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				unset( $_GET['activate'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			}

			unset( $easy_wp_smtp_lite_just_activated, $easy_wp_smtp_lite_just_deactivated );
		}
	}
	add_action( 'admin_notices', 'easy_wp_smtp_lite_notice' );

	// Do not process the plugin code further.
	return;
}

if ( ! function_exists( 'easy_wp_smtp_insecure_php_version_notice' ) ) {
	/**
	 * Display admin notice, if the server is using old/insecure PHP version.
	 *
	 * @since 2.1.0
	 */
	function easy_wp_smtp_insecure_php_version_notice() {

		?>
		<div class="notice notice-error easy-wp-smtp-notice">
			<p>
				<?php
				printf(
					wp_kses( /* translators: %1$s - WPBeginner URL for recommended WordPress hosting. */
						__( 'Your site is running an <strong>insecure version</strong> of PHP that is no longer supported. Please contact your web hosting provider to update your PHP version or switch to a <a href="%1$s" target="_blank" rel="noopener noreferrer">recommended WordPress hosting company</a>.', 'easy-wp-smtp' ),
						array(
							'a'      => array(
								'href'   => array(),
								'target' => array(),
								'rel'    => array(),
							),
							'strong' => array(),
						)
					),
					'https://www.wpbeginner.com/wordpress-hosting/'
				);
				?>
				<br><br>
				<?php

				$doc_link = add_query_arg(
					[
						'utm_source'   => 'WordPress',
						'utm_medium'   => 'Admin Notice',
						'utm_campaign' => is_readable( rtrim( plugin_dir_path( __FILE__ ), '/\\' ) . '/src/Pro/Pro.php' ) ? 'plugin' : 'liteplugin',
						'utm_content'  => 'Minimal Required PHP Version',
					],
					'https://easywpsmtp.com/supported-php-versions-for-easy-wp-smtp/'
				);

				printf(
					wp_kses( /* translators: %s - EasyWPSMTP.com docs URL with more details. */
						__( '<strong>Easy WP SMTP plugin is disabled</strong> on your site until you fix the issue. <a href="%s" target="_blank" rel="noopener noreferrer">Read more for additional information.</a>', 'easy-wp-smtp' ),
						array(
							'a'      => array(
								'href'   => array(),
								'target' => array(),
								'rel'    => array(),
							),
							'strong' => array(),
						)
					),
					esc_url( $doc_link )
				);
				?>
			</p>
		</div>

		<?php

		// In case this is on plugin activation.
		if ( isset( $_GET['activate'] ) ) { //phpcs:ignore
			unset( $_GET['activate'] ); //phpcs:ignore
		}
	}
}

if ( ! function_exists( 'easy_wp_smtp_unsupported_wp_version_notice' ) ) {
	/**
	 * Display admin notice, if the site is using unsupported WP version.
	 *
	 * @since 2.1.0
	 */
	function easy_wp_smtp_unsupported_wp_version_notice() {

		?>
		<div class="notice notice-error easy-wp-smtp-notice">
			<p>
				<?php
				printf(
					wp_kses( /* translators: %s The minimal WP version supported by Easy WP SMTP. */
						__( 'Your site is running an <strong>old version</strong> of WordPress that is no longer supported by Easy WP SMTP. Please update your WordPress site to at least version <strong>%s</strong>.', 'easy-wp-smtp' ),
						[
							'strong' => [],
						]
					),
					esc_html( EasyWPSMTP_WP_VERSION )
				);
				?>
				<br><br>
				<?php
				echo wp_kses(
					__( '<strong>Easy WP SMTP plugin is disabled</strong> on your site until WordPress is updated to the required version.', 'easy-wp-smtp' ),
					[
						'strong' => [],
					]
				);
				?>
			</p>
		</div>

		<?php

		// In case this is on plugin activation.
		if ( isset( $_GET['activate'] ) ) { //phpcs:ignore
			unset( $_GET['activate'] ); //phpcs:ignore
		}
	}
}

/**
 * Display admin notice and prevent plugin code execution, if the server is
 * using old/insecure PHP version.
 *
 * @since 2.1.0
 */
if ( version_compare( phpversion(), EasyWPSMTP_PHP_VERSION, '<' ) ) {
	add_action( 'admin_notices', 'easy_wp_smtp_insecure_php_version_notice' );

	return;
}

/**
 * Display admin notice and prevent plugin code execution, if the WP version is lower than EasyWPSMTP_WP_VERSION.
 *
 * @since 2.1.0
 */
if ( version_compare( get_bloginfo( 'version' ), EasyWPSMTP_WP_VERSION, '<' ) ) {
	add_action( 'admin_notices', 'easy_wp_smtp_unsupported_wp_version_notice' );

	return;
}

/**
 * Autoloader. We need it being separate and not using Composer autoloader because of the vendor libs,
 * which are huge and not needed for most users.
 * Inspired by PSR-4 examples: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md
 *
 * @since 2.0.0
 *
 * @param string $class The fully-qualified class name.
 */
spl_autoload_register( function ( $class ) {

	list( $plugin_space ) = explode( '\\', $class );
	if ( $plugin_space !== 'EasyWPSMTP' ) {
		return;
	}

	$plugin_dir = basename( __DIR__ );

	// Default directory for all code is plugin's /src/.
	$base_dir = plugin_dir_path( __DIR__ ) . '/' . $plugin_dir . '/src/';

	// Get the relative class name.
	$relative_class = substr( $class, strlen( $plugin_space ) + 1 );

	// Prepare a path to a file.
	$file = wp_normalize_path( $base_dir . $relative_class . '.php' );

	// If the file exists, require it.
	if ( is_readable( $file ) ) {
		/** @noinspection PhpIncludeInspection */
		require_once $file;
	}
} );

/*
 * This function should be wrapped to condition, otherwise `function_exists( 'easy_wp_smtp' )` at the beginning of
 * this file will return `true` which is incorrect.
 *
 * @see https://www.php.net/manual/en/function.function-exists.php#110163
 */
if ( ! function_exists( 'easy_wp_smtp' ) ) {
	/**
	 * Global function-holder. Works similar to a singleton's instance().
	 *
	 * @since 2.0.0
	 *
	 * @return EasyWPSMTP\Core
	 */
	function easy_wp_smtp() {
		/**
		 * @var \EasyWPSMTP\Core
		 */
		static $core;

		if ( ! isset( $core ) ) {
			$core = new \EasyWPSMTP\Core();
		}

		return $core;
	}
}

easy_wp_smtp();
