<?php
declare(strict_types=1);

namespace WP_Rocket\Engine\License;

use WP_Rocket\Event_Management\Subscriber_Interface;

class Subscriber implements Subscriber_Interface {
	/**
	 * Upgrade instance
	 *
	 * @var Upgrade
	 */
	private $upgrade;

	/**
	 * Renewal instance
	 *
	 * @var Renewal
	 */
	private $renewal;

	/**
	 * Revoked instance
	 *
	 * @var Revoked
	 */
	private $revoked;

	/**
	 * Instantiate the class
	 *
	 * @param Upgrade $upgrade Upgrade instance.
	 * @param Renewal $renewal Renewal instance.
	 * @param Revoked $revoked Revoked instance.
	 */
	public function __construct( Upgrade $upgrade, Renewal $renewal, Revoked $revoked ) {
		$this->upgrade = $upgrade;
		$this->renewal = $renewal;
		$this->revoked = $revoked;
	}

	/**
	 * Events this subscriber listens to.
	 *
	 * @return array
	 */
	public static function get_subscribed_events() {
		return [
			'rocket_dashboard_license_info'       => 'display_upgrade_section',
			'rocket_settings_page_footer'         => 'display_upgrade_popin',
			'rocket_menu_title'                   => [
				[ 'add_notification_bubble' ],
				[ 'add_notification_bubble_expired' ],
				[ 'maybe_add_revoked_bubble' ],
			],
			'admin_footer-settings_page_wprocket' => [
				[ 'dismiss_notification_bubble' ],
				[ 'set_dashboard_seen_transient' ],
			],
			'rocket_before_dashboard_content'     => [
				[ 'display_promo_banner' ],
				[ 'display_renewal_soon_banner', 11 ],
				[ 'display_renewal_expired_banner', 12 ],
				[ 'maybe_display_revoked_banner', 13 ],
			],
			'wp_ajax_rocket_dismiss_promo'        => 'dismiss_promo_banner',
			'wp_ajax_rocket_dismiss_renewal'      => 'dismiss_renewal_banner',
			'rocket_localize_admin_script'        => 'add_localize_script_data',
			'wp_rocket_upgrade'                   => [ 'clean_user_transient', 15, 2 ],
			'rocket_before_add_field_to_settings' => [
				[ 'maybe_disable_ocd', 11 ],
				[ 'add_license_expire_warning' ],
			],
			'get_rocket_option_remove_unused_css' => [ 'maybe_disable_option', PHP_INT_MAX ],
			'get_rocket_option_async_css'         => [ 'maybe_disable_option', PHP_INT_MAX ],
			'admin_notices'                       => 'maybe_display_revoked_notice',
		];
	}

	/**
	 * Displays the upgrade section in the license info block
	 *
	 * @since 3.7.3
	 *
	 * @return void
	 */
	public function display_upgrade_section() {
		$this->upgrade->display_upgrade_section();
	}

	/**
	 * Displays the upgrade popin
	 *
	 * @since 3.7.3
	 *
	 * @return void
	 */
	public function display_upgrade_popin() {
		$this->upgrade->display_upgrade_popin();
	}

	/**
	 * Adds the notification bubble to the menu title if a promotion is active
	 *
	 * @since 3.7.4
	 *
	 * @param string $menu_title The text to be used for the menu.
	 * @return string
	 */
	public function add_notification_bubble( $menu_title ) {
		return $this->upgrade->add_notification_bubble( $menu_title );
	}

	/**
	 * Prevents the notification bubble from showing once the user accessed the dashboard once
	 *
	 * @since 3.7.4
	 *
	 * @return void
	 */
	public function dismiss_notification_bubble() {
		$this->upgrade->dismiss_notification_bubble();
	}

	/**
	 * Displays the promotions banner when a promotion is active
	 *
	 * @since 3.7.4
	 *
	 * @return void
	 */
	public function display_promo_banner() {
		$this->upgrade->display_promo_banner();
	}

	/**
	 * AJAX callback to dismiss the promotion banner
	 *
	 * @since 3.7.4
	 *
	 * @return void
	 */
	public function dismiss_promo_banner() {
		$this->upgrade->dismiss_promo_banner();
	}

	/**
	 * Adds the current time and promotion end time to WP Rocket localize script data
	 *
	 * @since 3.7.5 Add the renewal localize data
	 * @since 3.7.4
	 *
	 * @param array $data Localize script data.
	 * @return array
	 */
	public function add_localize_script_data( $data ) {
		$data = $this->upgrade->add_localize_script_data( $data );

		return $this->renewal->add_localize_script_data( $data );
	}

	/**
	 * Deletes the user data transient on 3.7.4 update
	 *
	 * @since 3.7.4
	 *
	 * @param string $new_version New version of the plugin.
	 * @param string $old_version Installed version of the plugin.
	 * @return void
	 */
	public function clean_user_transient( $new_version, $old_version ) {
		if ( version_compare( $old_version, '3.7.4', '>' ) ) {
			return;
		}

		delete_transient( 'wp_rocket_customer_data' );
	}

	/**
	 * Displays the renewal banner for users expiring in less than 30 days
	 *
	 * @since 3.7.5
	 *
	 * @return void
	 */
	public function display_renewal_soon_banner() {
		$this->renewal->display_renewal_soon_banner();
	}

	/**
	 * Displays the renewal banner for expired users
	 *
	 * @since 3.7.5
	 *
	 * @return void
	 */
	public function display_renewal_expired_banner() {
		$this->renewal->display_renewal_expired_banner();
	}

	/**
	 * AJAX callback to dismiss the renewal banner
	 *
	 * @since 3.7.5
	 *
	 * @return void
	 */
	public function dismiss_renewal_banner() {
		$this->renewal->dismiss_renewal_expired_banner();
	}

	/**
	 * Add license expiring warning to OCD label
	 *
	 * @param array $args Setting field arguments.
	 *
	 * @return array
	 */
	public function add_license_expire_warning( $args ): array {
		return $this->renewal->add_license_expire_warning( $args );
	}

	/**
	 * Adds the notification bubble to WP Rocket menu item when expired
	 *
	 * @param string $menu_title Menu title.
	 *
	 * @return string
	 */
	public function add_notification_bubble_expired( $menu_title ) {
		return $this->renewal->add_expired_bubble( $menu_title );
	}

	/**
	 * Sets the dashboard seen transient to hide the expired bubble
	 *
	 * @return void
	 */
	public function set_dashboard_seen_transient() {
		$this->renewal->set_dashboard_seen_transient();
	}

	/**
	 * Disable optimize CSS delivery setting
	 *
	 * @param array $args Array of setting field arguments.
	 *
	 * @return array
	 */
	public function maybe_disable_ocd( $args ) {
		return $this->renewal->maybe_disable_ocd( $args );
	}

	/**
	 * Disables the RUCSS & Async CSS options if license is expired
	 *
	 * @param mixed $value Current option value.
	 *
	 * @return mixed
	 */
	public function maybe_disable_option( $value ) {
		return $this->renewal->maybe_disable_option( $value );
	}

	/**
	 * Displays the revoked website banner in the dashboard if the site's license is revoked.
	 *
	 * @since 3.20.4
	 * @return void
	 */
	public function maybe_display_revoked_banner() {
		$this->revoked->maybe_display_revoked_banner();
	}

	/**
	 * Displays a revoked notice in the admin area if the website license is revoked.
	 *
	 * @since 3.20.4
	 * @return void
	 */
	public function maybe_display_revoked_notice() {
		$this->revoked->maybe_display_revoked_notice();
	}

	/**
	 * Adds a revoked license notification bubble to the WP Rocket menu item title if the website's license is revoked.
	 *
	 * @since 3.20.4
	 *
	 * @param string $menu_title The current menu title.
	 * @return string Modified menu title with revoked notification bubble if applicable.
	 */
	public function maybe_add_revoked_bubble( $menu_title ) {
		return $this->revoked->maybe_add_revoked_bubble( $menu_title );
	}
}
