<?php
/**
 * Visits Manager
 *
 * Handles processes related to site visits control.
 *
 * @package WP_Ultimo
 * @subpackage Managers/Visits_Manager
 * @since 2.0.0
 */

namespace WP_Ultimo\Managers;

// Exit if accessed directly
defined('ABSPATH') || exit;

/**
 * Handles processes related to limitations.
 *
 * @since 2.0.0
 */
class Visits_Manager {

	use \WP_Ultimo\Traits\Singleton;

	/**
	 * Instantiate the necessary hooks.
	 *
	 * @since 2.0.0
	 * @return void
	 */
	public function init() {

		if ((bool) wu_get_setting('enable_visits_limiting', true) === false || is_main_site()) {

			return; // Feature not active, bail.

		} // end if;

		/*
		 * Due to how caching plugins work, we need to count visits via ajax.
		 * This adds the ajax endpoint that performs the counting.
		 */
		add_action('wp_ajax_nopriv_wu_count_visits', array($this, 'count_visits'), 10, 2);

		add_action('wp_enqueue_scripts', array($this, 'enqueue_visit_counter_script'));

		add_action('template_redirect', array($this, 'maybe_lock_site'));

	} // end init;

	/**
	 * Check if the limits for visits was set. If that's the case, lock the site.
	 *
	 * @since 2.0.0
	 * @return void
	 */
	public function maybe_lock_site() {

		$site = wu_get_current_site();

		if (!$site) {

			return;

		} // end if;

		/*
		 * Case unlimited visits
		 */
		if (empty($site->get_limitations()->visits->get_limit())) {

			return;

		} // end if;

		if ($site->has_limitations() && $site->get_visits_count() > $site->get_limitations()->visits->get_limit()) {

			wp_die(__('This site is not available at this time.', 'wp-ultimo'), __('Not available', 'wp-ultimo'), 404);

		} // end if;

	} // end maybe_lock_site;

	/**
	 * Counts visits to network sites.
	 *
	 * This needs to be extremely light-weight.
	 * The flow happens more or less like this:
	 * 1. Gets the site current total;
	 * 2. Adds one and re-save;
	 * 3. Checks limits and see if we need to flush caches and such;
	 * 4. Delegate these heavy tasks to action_scheduler.
	 *
	 * @since 2.0.0
	 * @return void
	 */
	public function count_visits() {

		if (is_main_site() && is_admin()) {

			return; // bail on main site.

		} // end if;

		$site = wu_get_current_site();

		if ($site->get_type() !== 'customer_owned') {

			return;

		} // end if;

		$visits_manager = new \WP_Ultimo\Objects\Visits($site->get_id());

		/*
		 * Add a new visit.
		 */
		$visits_manager->add_visit();

		/*
		 * Checks against the limitations.
		 */
		if (false) {

			Cache_Manager::get_instance()->flush_known_caches();

			echo 'flushing caches';

			die('2');

		} // end if;

		die('1');

	} // end count_visits;

	/**
	 * Enqueues the visits count script when necessary.
	 *
	 * @since 2.0.0
	 * @return void
	 */
	public function enqueue_visit_counter_script() {

		if (is_user_logged_in()) {

			return; // bail if user is logged in.

		} // end if;

		wp_register_script('wu-visits-counter', wu_get_asset('visits-counter.js', 'js'), array(), wu_get_version());

		wp_localize_script('wu-visits-counter', 'wu_visits_counter', array(
			'ajaxurl' => admin_url('admin-ajax.php'),
			'code'    => wp_create_nonce('wu-visit-counter'),
		));

		wp_enqueue_script('wu-visits-counter');

	} // end enqueue_visit_counter_script;

} // end class Visits_Manager;
