<?php
/**
 * Jetpack Newsletter Dashboard Widget.
 *
 * @package jetpack
 */

use Automattic\Jetpack\Connection\Client;
use Automattic\Jetpack\Modules;

/**
 * Class that adds the Jetpack Newsletter Dashboard Widget to the WordPress admin dashboard.
 */
class Jetpack_Newsletter_Dashboard_Widget {
	/**
	 * Indicates whether the class initialized or not.
	 *
	 * @var bool
	 */
	private static $initialized = false;

	/**
	 * The Widget ID.
	 *
	 * @var string
	 */
	private static $widget_id = 'jetpack_newsletter_dashboard_widget';

	/**
	 * Initialize the class by calling the setup static function.
	 *
	 * @return void
	 */
	public static function init() {
		if ( ! self::$initialized ) {
			self::$initialized = true;
			self::wp_dashboard_setup();
		}
	}

	/**
	 * Get the config data for the Jetpack Newsletter widget.
	 *
	 * @return array
	 */
	public static function get_config_data() {
		$config_data = array(
			'emailSubscribers'       => 0,
			'paidSubscribers'        => 0,
			'allSubscribers'         => 0,
			'subscriberTotalsByDate' => array(),
			'isStatsModuleActive'    => false,
			'showHeader'             => false,
			'showChart'              => false,
			'isWidgetVisible'        => false,
			'newsletterSettingsUrl'  => \Automattic\Jetpack\Newsletter\Urls::get_newsletter_settings_url(),
		);

		if ( Jetpack::is_connection_ready() ) {
			$site_id  = Jetpack_Options::get_option( 'id' );
			$api_path = sprintf( '/sites/%d/subscribers/stats', $site_id );
			$response = Client::wpcom_json_api_request_as_blog(
				$api_path,
				'2',
				array(),
				null,
				'wpcom'
			);

			if ( 200 === wp_remote_retrieve_response_code( $response ) ) {
				$subscriber_counts = json_decode( wp_remote_retrieve_body( $response ), true );
				if ( isset( $subscriber_counts['counts']['email_subscribers'] ) ) {
					$config_data['emailSubscribers'] = (int) $subscriber_counts['counts']['email_subscribers'];
				}

				if ( isset( $subscriber_counts['counts']['paid_subscribers'] ) ) {
					$config_data['paidSubscribers'] = (int) $subscriber_counts['counts']['paid_subscribers'];
				}

				if ( isset( $subscriber_counts['counts']['all_subscribers'] ) ) {
					$config_data['allSubscribers'] = (int) $subscriber_counts['counts']['all_subscribers'];
				}

				if ( isset( $subscriber_counts['aggregate'] ) ) {
					$config_data['subscriberTotalsByDate'] = $subscriber_counts['aggregate'];
				}
			}

			$config_data['isStatsModuleActive'] = ( new Modules() )->is_active( 'stats' );

			$config_data['showHeader'] = $config_data['isStatsModuleActive'] && ( $config_data['allSubscribers'] > 0 || $config_data['paidSubscribers'] > 0 );
			foreach ( $config_data['subscriberTotalsByDate'] as $day ) {
				if ( $day && ( $day['all'] >= 5 || $day['paid'] > 0 ) ) {
					$config_data['showChart'] = true;
					break;
				}
			}

			$config_data['isWidgetVisible'] = $config_data['showHeader'] || $config_data['showChart'];
		}

		return $config_data;
	}

	/**
	 * Sets up the Jetpack Newsletter widget in the WordPress admin dashboard.
	 */
	public static function wp_dashboard_setup() {
		// Do not show the widget to non-admins.
		if ( ! current_user_can( 'manage_options' ) ) {
			return;
		}

		if ( Jetpack::is_connection_ready() ) {
			$config_data = static::get_config_data();

			if ( ! $config_data['isWidgetVisible'] ) {
				return;
			}

			static::load_admin_scripts(
				'jp-newsletter-widget',
				'newsletter-widget',
				array(
					'config_variable_name' => 'jetpackNewsletterWidgetConfigData',
					'config_data'          => $config_data,
					'load_minified_js'     => false,
				)
			);

			wp_add_dashboard_widget(
				self::$widget_id,
				/** "Newsletter" is a product name, do not translate. */
				'Jetpack Newsletter',
				array( static::class, 'render' ),
				// @phan-suppress-next-line PhanTypeMismatchArgumentProbablyReal -- Core should ideally document null for no-callback arg. https://core.trac.wordpress.org/ticket/52539.
				null,
				array(),
				'side',
				'high'
			);
		}
	}

	/**
	 * Render the Jetpack Newsletter widget.
	 *
	 * @return void
	 */
	public static function render() {
		?>
		<div id="wpcom">
			<div id="newsletter-widget-app"></div>
		</div>
		<?php
	}

	/**
	 * Load the admin scripts for the Jetpack Newsletter widget.
	 *
	 * @param string $asset_handle The handle of the asset.
	 * @param string $asset_name The name of the asset.
	 * @param array  $options The options for the asset.
	 * @return void
	 */
	public static function load_admin_scripts( $asset_handle, $asset_name, $options = array() ) {
		$default_options = array(
			'config_data'          => array(),
			'config_variable_name' => 'configData',
			'enqueue_css'          => true,
			'load_minified_js'     => true,
		);
		$options         = wp_parse_args( $options, $default_options );

		/*
		 * Get the asset file path. The widget is built unminified (see tools/webpack.config.js),
		 * so read the matching non-minified asset metadata.
		 */
		$asset_path = JETPACK__PLUGIN_DIR . '_inc/build/' . $asset_name . '.asset.php';

		// Get dependencies and version from asset file
		$dependencies = array();
		$version      = JETPACK__VERSION;

		if ( file_exists( $asset_path ) ) {
			$asset        = require $asset_path;
			$dependencies = $asset['dependencies'];
			$version      = $asset['version'];
		}

		$file_extension = '.min.js';
		if ( ! $options['load_minified_js'] ) {
			$file_extension = '.js';
		}
		// Register and enqueue the script
		wp_register_script(
			$asset_handle,
			plugins_url( '_inc/build/' . $asset_name . $file_extension, JETPACK__PLUGIN_FILE ),
			$dependencies,
			$version,
			true
		);
		wp_enqueue_script( $asset_handle );
		if ( in_array( 'wp-i18n', $dependencies, true ) ) {
			wp_set_script_translations( $asset_handle, 'jetpack' );
		}

		// Enqueue the CSS if enabled
		if ( $options['enqueue_css'] ) {
			wp_enqueue_style(
				$asset_handle,
				plugins_url( '_inc/build/' . $asset_name . '.css', JETPACK__PLUGIN_FILE ),
				array(),
				$version
			);

			// Enqueue RTL stylesheet if needed
			if ( is_rtl() ) {
				wp_enqueue_style(
					$asset_handle . '-rtl',
					plugins_url( '_inc/build/' . $asset_name . '.rtl.css', JETPACK__PLUGIN_FILE ),
					array( $asset_handle ),
					$version
				);
			}
		}

		// Add any configuration data if needed
		if ( ! empty( $options['config_data'] ) ) {
			wp_add_inline_script(
				$asset_handle,
				"window.{$options['config_variable_name']} = " . wp_json_encode( $options['config_data'], JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP ) . ';',
				'before'
			);
		}
	}
}

add_action(
	'wp_dashboard_setup',
	array( 'Jetpack_Newsletter_Dashboard_Widget', 'init' )
);
