<?php
/**
 * ThemeIsle - About page class
 *
 * @package ti-about-page
 */

/**
 * Class Ti_About_Page_Main
 *
 * @package Themeisle
 */
class Ti_About_Page {

	/**
	 * @var
	 * About Page instance
	 */
	public static $instance;
	/**
	 * @var
	 * About page content that should be rendered
	 */
	public $config = array();
	/**
	 * @var
	 * Current theme args
	 */
	private $theme_args = array();

	/**
	 * The Main Themeisle_About_Page instance.
	 *
	 * We make sure that only one instance of Themeisle_About_Page exists in the memory at one time.
	 *
	 * @param array $config The configuration array.
	 */
	public static function init( $config ) {
		if ( ! isset( self::$instance ) && ! ( self::$instance instanceof Ti_About_Page ) ) {
			self::$instance = new Ti_About_Page();
			if ( ! empty( $config ) && is_array( $config ) ) {
				self::$instance->config = apply_filters( 'ti_about_config_filter', $config );
				self::$instance->setup_config();
				self::$instance->setup_actions();
				self::$instance->set_recommended_plugins_visibility();
			}
		}
	}

	/**
	 * Setup the class props based on current theme
	 */
	private function setup_config() {

		$theme = wp_get_theme();

		$this->theme_args['name']        = apply_filters( 'ti_wl_theme_name', $theme->__get( 'Name' ) );
		$this->theme_args['template']    = $theme->get( 'Template' );
		$this->theme_args['version']     = $theme->__get( 'Version' );
		$this->theme_args['description'] = apply_filters( 'ti_wl_theme_description', $theme->__get( 'Description' ) );
		$this->theme_args['slug']        = $theme->__get( 'stylesheet' );
	}

	/**
	 * Setup the actions used for this page.
	 */
	public function setup_actions() {

		add_action( 'admin_menu', array( $this, 'register' ) );
		add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ) );
		add_action(
			'wp_ajax_update_recommended_plugins_visibility',
			array(
				$this,
				'update_recommended_plugins_visibility',
			)
		);

		if ( ! class_exists( 'Ti_Notice_Manager' ) && isset( $this->config['welcome_notice'] ) ) {
			require_once 'includes' . DIRECTORY_SEPARATOR . 'admin' . DIRECTORY_SEPARATOR . 'class-ti-notice-manager.php';
			add_action( 'init', array( Ti_Notice_Manager::instance(), 'init' ) );
		}
	}

	/**
	 * Set an option with recommended plugins slugs and visibility
	 * Based on visibility flag the plugin should be shown/hidden in recommended_plugins tab
	 */
	public function set_recommended_plugins_visibility() {
		$recommended_plugins = get_theme_mod( 'ti_about_recommended_plugins' );
		if ( ! empty( $recommended_plugins ) ) {
			return;
		}
		$required_plugins           = $this->get_recommended_plugins();
		$required_plugins_visbility = array();
		foreach ( $required_plugins as $slug => $req_plugin ) {
			$required_plugins_visbility[ $slug ] = 'visible';
		}
		set_theme_mod( 'ti_about_recommended_plugins', $required_plugins_visbility );
	}

	/**
	 * Get the list of recommended plugins
	 *
	 * @return array - either recommended plugins or empty array.
	 */
	public function get_recommended_plugins() {
		foreach ( $this->config as $index => $content ) {
			if ( isset( $content['type'] ) && $content['type'] === 'recommended_actions' ) {
				$plugins = $content['plugins'];

				return $plugins;
				break;
			}
		}

		return array();
	}

	/**
	 * Register the menu page under Appearance menu.
	 */
	public function register() {
		$theme = $this->theme_args;

		if ( empty( $theme['name'] ) || empty( $theme['slug'] ) ) {
			return;
		}

		$page_title = $theme['name'] . ' ' . __( 'Options', 'hestia' ) . ' ';

		$menu_name        = $theme['name'] . ' ' . __( 'Options', 'hestia' ) . ' ';
		$required_actions = $this->get_recommended_actions_left();
		if ( $required_actions > 0 ) {
			$menu_name .= '<span class="badge-action-count update-plugins">' . esc_html( $required_actions ) . '</span>';
		}

		$theme_page = ! empty( $theme['template'] ) ? $theme['template'] . '-welcome' : $theme['slug'] . '-welcome';
		add_theme_page(
			$page_title,
			$menu_name,
			'activate_plugins',
			$theme_page,
			array(
				$this,
				'render',
			)
		);
	}

	/**
	 * Utility function for checking the number of recommended actions uncompleted
	 *
	 * @return int $actions_left - the number of uncompleted recommended actions.
	 */
	public function get_recommended_actions_left() {

		$nb_of_actions       = 0;
		$actions_left        = 0;
		$recommended_plugins = get_theme_mod( 'ti_about_recommended_plugins' );

		if ( ! empty( $recommended_plugins ) ) {
			foreach ( $recommended_plugins as $slug => $visibility ) {
				if ( $recommended_plugins[ $slug ] === 'visible' ) {
					$nb_of_actions += 1;

					if ( Ti_About_Plugin_Helper::instance()->check_plugin_state( $slug ) !== 'deactivate' ) {
						$actions_left += 1;
					}
				}
			}
		}

		return $actions_left;
	}

	/**
	 * Instantiate the render class which will render all the tabs based on config
	 */
	public function render() {
		require_once 'includes/class-ti-about-render.php';
		new TI_About_Render( $this->theme_args, $this->config, $this );
	}

	/**
	 * Load css and scripts for the about page
	 */
	public function enqueue() {
		$screen = get_current_screen();
		if ( ! isset( $screen->id ) ) {
			return;
		}
		$theme      = $this->theme_args;
		$theme_page = ! empty( $theme['template'] ) ? $theme['template'] . '-welcome' : $theme['slug'] . '-welcome';
		if ( $screen->id !== 'appearance_page_' . $theme_page ) {
			return;
		}

		wp_enqueue_style( 'ti-about-style', TI_ABOUT_PAGE_URL . 'assets/css/about.css', array(), TI_ABOUT_PAGE_VERSION );
		wp_register_script(
			'ti-about-scripts',
			TI_ABOUT_PAGE_URL . 'assets/js/script.js',
			array(
				'jquery',
			),
			TI_ABOUT_PAGE_VERSION,
			true
		);

		wp_localize_script(
			'ti-about-scripts',
			'tiAboutPageObject',
			array(
				'nr_actions_required' => $this->get_recommended_actions_left(),
				'ajaxurl'             => admin_url( 'admin-ajax.php' ),
				'nonce'               => wp_create_nonce( 'ti-about-nonce' ),
				'template_directory'  => get_template_directory_uri(),
				'activating_string'   => esc_html__( 'Activating', 'hestia' ),
			)
		);

		wp_enqueue_script( 'ti-about-scripts' );
		Ti_About_Plugin_Helper::instance()->enqueue_scripts();
	}

	/**
	 * Update recommended plugins visibility flag if the user dismiss one of them
	 */
	public function update_recommended_plugins_visibility() {
		$nonce = $_POST['nonce'];
		if ( ! wp_verify_nonce( $nonce, 'ti-about-nonce' ) ) {
			return;
		}
		$recommended_plugins = get_theme_mod( 'ti_about_recommended_plugins' );

		$plugin_to_update                         = $_POST['slug'];
		$recommended_plugins[ $plugin_to_update ] = 'hidden';

		set_theme_mod( 'ti_about_recommended_plugins', $recommended_plugins );

		$required_actions_left = array( 'required_actions' => $this->get_recommended_actions_left() );
		wp_send_json( $required_actions_left );
	}
}
