<?php

namespace WPMailSMTP\Pro;

use WPMailSMTP\Pro\Emails\Logs\EmailsCollection;

/**
 * Class SiteHealth adds the plugin status and information to the WP Site Health admin page.
 * Pro version specific tests and info.
 *
 * @since 1.9.0
 */
class SiteHealth {

	/**
	 * This URL is used to check whether the site can communicate with our servers
	 * to receive updated and check the validity of a license.
	 *
	 * @since 1.9.0
	 */
	const CONNECTION_PING_URL = 'https://wpmailsmtp.com/connection-test.php';

	/**
	 * Initialize the site heath functionality for pro plugin version specific tasks.
	 *
	 * @since 1.9.0
	 */
	public function init() {

		add_filter( 'site_status_tests', array( $this, 'register_pro_site_status_tests' ) );

		// The priority is set a bit lower, so the core plugin can register the core debug info fields.
		add_filter( 'debug_information', array( $this, 'register_pro_debug_information' ), 20 );

		// Register async test hooks.
		add_action( 'wp_ajax_health-check-pro-license_test', array( $this, 'pro_license_test' ) );
		add_action( 'wp_ajax_health-check-wpmailsmtpdotcom-communication_test', array( $this, 'wpmailsmtpdotcom_communication_test' ) );
	}

	/**
	 * Register tests.
	 * This will be displayed in the "Status" tab of the WP Site Health page.
	 *
	 * @since 1.9.0
	 *
	 * @param array $tests The array with all tests.
	 *
	 * @return array
	 */
	public function register_pro_site_status_tests( $tests ) {

		$tests['async']['wp_mail_smtp_pro_license_check'] = array(
			'label' => esc_html__( 'Is WP Mail SMTP Pro license active and valid?', 'wp-mail-smtp-pro' ),
			'test'  => 'pro_license_test',
		);

		$tests['async']['wp_mail_smtp_wpmailsmtpdotcom_communication'] = array(
			'label' => esc_html__( 'Is wpmailsmtp.com reachable?', 'wp-mail-smtp' ),
			'test'  => 'wpmailsmtpdotcom_communication_test',
		);

		return $tests;
	}

	/**
	 * Register debug information.
	 * This will be displayed in the "Info" tab of the WP Site Health page.
	 *
	 * @since 1.9.0
	 *
	 * @param array $debug_info Array of existing debug information.
	 *
	 * @return array
	 */
	public function register_pro_debug_information( $debug_info ) {

		$pro_fields = [];

		// Install date.
		$activated = get_option( 'wp_mail_smtp_activated', [] );
		if ( ! empty( $activated['pro'] ) ) {
			$date = $activated['pro'] + ( get_option( 'gmt_offset' ) * 3600 );

			$pro_fields['pro_install_date'] = [
				'label' => esc_html__( 'Pro install date', 'wp-mail-smtp-pro' ),
				'value' => date_i18n( esc_html__( 'M j, Y @ g:ia' ), $date ),
			];
		}

		if ( wp_mail_smtp()->pro->get_logs()->is_enabled() && wp_mail_smtp()->pro->get_logs()->is_valid_db() ) {
			$pro_fields['email_log_entries'] = array(
				'label' => esc_html__( 'Email log entries', 'wp-mail-smtp-pro' ),
				'value' => ( new EmailsCollection() )->get_count(),
			);
		}

		$debug_info[ \WPMailSMTP\SiteHealth::DEBUG_INFO_SLUG ]['fields'] = array_merge(
			$debug_info[ \WPMailSMTP\SiteHealth::DEBUG_INFO_SLUG ]['fields'],
			$pro_fields
		);

		return $debug_info;
	}

	/**
	 * Perform the test (async) for checking and verifying the pro license.
	 *
	 * @since 1.9.0
	 */
	public function pro_license_test() {

		check_ajax_referer( 'health-check-site-status' );

		if ( ! current_user_can( 'view_site_health_checks' ) ) {
			wp_send_json_error();
		}

		$result = array(
			'label'       => esc_html__( 'WP Mail SMTP Pro license is active and valid', 'wp-mail-smtp-pro' ),
			'status'      => 'good',
			'badge'       => array(
				'label' => wp_mail_smtp()->get_site_health()->get_label(),
				'color' => \WPMailSMTP\SiteHealth::BADGE_COLOR,
			),
			'description' => '',
			'actions'     => sprintf(
				'<p><a href="%s">%s</a></p>',
				esc_url( wp_mail_smtp()->get_admin()->get_admin_page_url() ),
				esc_html__( 'View license setting', 'wp-mail-smtp-pro' )
			),
			'test'        => 'wp_mail_smtp_pro_license_check',
		);

		$license_status = wp_mail_smtp()->pro->get_license()->get_status();

		$result['description'] = $license_status['message'];

		if ( $license_status['valid'] === false ) {
			$result['label']          = esc_html__( 'WP Mail SMTP Pro license is invalid', 'wp-mail-smtp-pro' );
			$result['badge']['color'] = 'orange';
			$result['status']         = 'recommended';
		}

		wp_send_json_success( $result );
	}

	/**
	 * Perform the test (async) for checking if this WP site can communicate with wpmailsmtp.com.
	 *
	 * @since 1.9.0
	 */
	public function wpmailsmtpdotcom_communication_test() {

		check_ajax_referer( 'health-check-site-status' );

		if ( ! current_user_can( 'view_site_health_checks' ) ) {
			wp_send_json_error();
		}

		$result = array(
			'label'       => esc_html__( 'Your site can communicate with wpmailsmtp.com', 'wp-mail-smtp-pro' ),
			'status'      => 'good',
			'badge'       => array(
				'label' => wp_mail_smtp()->get_site_health()->get_label(),
				'color' => \WPMailSMTP\SiteHealth::BADGE_COLOR,
			),
			'description' => sprintf(
				'<p>%s</p>',
				esc_html__( 'Communicating with the wpmailsmtp.com servers is used to check for new plugin versions, and to verify license keys.', 'wp-mail-smtp-pro' )
			),
			'actions'     => '',
			'test'        => 'wp_mail_smtp_wpmailsmtpdotcom_communication',
		);

		// Send dummy timestamp data to prevent issues with some cURL configurations which don't allow empty requests.
		$response = wp_remote_post( self::CONNECTION_PING_URL, [ 'body' => [ 'timestamp' => time() ] ] );

		if ( wp_remote_retrieve_response_code( $response ) !== 200 ) {
			$result['status']         = 'critical';
			$result['badge']['color'] = 'red';
			$result['label']          = esc_html__( 'Could not reach wpmailsmtp.com', 'wp-mail-smtp-pro' );

			$result['description'] .= sprintf(
				'<p>%s</p>',
				sprintf(
					'<span class="error"><span class="screen-reader-text">%s</span></span> %s',
					esc_html__( 'Error', 'wp-mail-smtp-pro' ),
					sprintf( /* translators: %s - The error returned by the lookup. */
						esc_html__( 'Your site is unable to reach wpmailsmtp.com, and returned the error: %s', 'wp-mail-smtp-pro' ),
						is_wp_error( $response ) ? $response->get_error_message() : wp_remote_retrieve_response_message( $response )
					)
				)
			);
		}

		wp_send_json_success( $result );
	}
}
