<?php
declare(strict_types=1);

namespace WP_Rocket\Engine\Common\PerformanceHints\Admin;

use WP_Admin_Bar;
use WP_Rocket\Event_Management\Subscriber_Interface;

class Subscriber implements Subscriber_Interface {
	/**
	 * Controller instance.
	 *
	 * @var Controller
	 */
	private $controller;

	/**
	 * AdminBar instance.
	 *
	 * @var AdminBar
	 */
	private $admin_bar;

	/**
	 * Clean Instance.
	 *
	 * @var Clean
	 */
	private $clean;

	/**
	 * Notices Instance.
	 *
	 * @var Notices
	 */
	private $notices;

	/**
	 * Instantiate the class
	 *
	 * @param Controller $controller Controller instance.
	 * @param AdminBar   $admin_bar Admin bar instance.
	 * @param Clean      $clean Clean instance.
	 * @param Notices    $notices Notices instance.
	 */
	public function __construct( Controller $controller, AdminBar $admin_bar, Clean $clean, Notices $notices ) {
		$this->controller = $controller;
		$this->admin_bar  = $admin_bar;
		$this->clean      = $clean;
		$this->notices    = $notices;
	}

	/**
	 * Return an array of events that this subscriber listens to.
	 *
	 * @return array
	 */
	public static function get_subscribed_events(): array {
		return [
			'switch_theme'                              => 'truncate_tables',
			'permalink_structure_changed'               => 'truncate_tables',
			'rocket_domain_options_changed'             => 'truncate_tables',
			'wp_trash_post'                             => 'delete_post',
			'delete_post'                               => 'delete_post',
			'clean_post_cache'                          => 'delete_post',
			'wp_update_comment_count'                   => 'delete_post',
			'edit_term'                                 => 'delete_term',
			'pre_delete_term'                           => 'delete_term',
			'rocket_performance_hints_clean_all'        => 'truncate_from_admin',
			'rocket_performance_hints_clean_url'        => 'clean_url',
			'wp_rocket_upgrade'                         => [ 'truncate_on_update', 10, 2 ],
			'rocket_admin_bar_items'                    => [
				[ 'add_clear_performance_hints_menu_item' ],
				[ 'add_clear_url_performance_hints_menu_item' ],
			],
			'admin_notices'                             => [
				[ 'clean_performance_hint_result' ],
			],
			'rocket_dashboard_actions'                  => 'display_dashboard_button',
			'admin_post_rocket_clean_performance_hints' => 'clean_performance_hints',
			'admin_post_rocket_clean_performance_hints_url' => 'clean_url_performance_hints',
			'pre_set_theme_mod_custom_logo'             => [ 'clean_performance_hints_on_logo_change', 10, 2 ],
			'pre_update_option_site_logo'               => [ 'clean_performance_hints_on_logo_change', 10, 2 ],
		];
	}

	/**
	 * Callback for truncating performance hints tables
	 *
	 * @return void
	 */
	public function truncate_tables(): void {
		$this->controller->truncate_tables();
	}

	/**
	 * Callback for deleting row or update post.
	 *
	 * @param int $post_id The post ID.
	 *
	 * @return void
	 */
	public function delete_post( int $post_id ): void {
		$this->controller->delete_post( $post_id );
	}

	/**
	 * Callback for Deleting Performance hints optimization row on update or delete term.
	 *
	 * @param int $term_id The term ID.
	 *
	 * @return void
	 */
	public function delete_term( int $term_id ): void {
		$this->controller->delete_term( $term_id );
	}

	/**
	 * Deletes rows when triggering clean from admin
	 *
	 * @param array $clean An array containing the status and message.
	 *
	 * @return array
	 */
	public function truncate_from_admin( $clean ): array {
		return $this->controller->truncate_from_admin( $clean );
	}

	/**
	 * Cleans rows for the current URL.
	 *
	 * @return void
	 */
	public function clean_url() {
		$this->controller->clean_url();
	}

	/**
	 * Truncate Performance hints optimization tables on update to 3.16.1 and higher
	 *
	 * @param string $new_version New plugin version.
	 * @param string $old_version Old plugin version.
	 *
	 * @return void
	 */
	public function truncate_on_update( $new_version, $old_version ) {
		$this->controller->truncate_on_update( $new_version, $old_version );
	}

	/**
	 * Add clear performance hints data to WP Rocket admin bar menu
	 *
	 * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance, passed by reference.
	 *
	 * @return void
	 */
	public function add_clear_performance_hints_menu_item( WP_Admin_Bar $wp_admin_bar ): void {
		$this->admin_bar->add_clear_performance_menu_item( $wp_admin_bar );
	}

	/**
	 * Add clear performance data hints for current url to WP Rocket admin bar menu
	 *
	 * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance, passed by reference.
	 *
	 * @return void
	 */
	public function add_clear_url_performance_hints_menu_item( WP_Admin_Bar $wp_admin_bar ): void {
		$this->admin_bar->add_clear_url_performance_hints_menu_item( $wp_admin_bar );
	}

	/**
	 * Display the dashboard button to clear performance data hints features
	 *
	 * @return void
	 */
	public function display_dashboard_button() {
		$this->admin_bar->display_dashboard_button();
	}

	/**
	 * Truncate Performance Hints tables when clicking on the dashboard button/menu
	 *
	 * @return void
	 */
	public function clean_performance_hints(): void {
		$this->clean->clean_performance_hints();
	}

	/**
	 * Truncate performance hints the current URL.
	 *
	 * @return void
	 */
	public function clean_url_performance_hints(): void {
		$this->clean->clean_url_performance_hints();
	}

	/**
	 * Show admin notice after clearing Performance Hints tables.
	 *
	 * @return void
	 */
	public function clean_performance_hint_result(): void {
		$this->notices->clean_performance_hint_result();
	}

	/**
	 * Clean performance hints when changing the logo.
	 *
	 * @param mixed $value The new value of the theme modification.
	 * @param mixed $old_value The old value of the theme modification.
	 *
	 * @return mixed
	 */
	public function clean_performance_hints_on_logo_change( $value, $old_value ) {
		return $this->controller->clean_on_logo_change( $value, $old_value );
	}
}
