<?php if ( ! defined( 'ABSPATH' ) ) exit;

class NF_PromotionManager
{
	public $promotions;

	/**
	 * Accepts a string of location to tell let us know where in the app we are sending promotions to.
	 * Then will return an array of promotions to run in the location.
	 */
	public function __construct()
	{
		$this->set_promotions();
		$this->maybe_remove_personal();
		$this->maybe_remove_sendwp();
		$this->sort_active_promotions_by_locations();
	}

	public function get_promotions()
	{
		return $this->promotions;
	}

	/**
	 * Set our promtions array to our promotions property.
	 */
	private function set_promotions()
	{
		if ( apply_filters( 'ninja_forms_disable_marketing', false ) )
		{
			$this->promotions = array();
		} else {
			$this->promotions = Ninja_Forms()->config( 'DashboardPromotions' );
		}
	}

	/*
	 * Membership Checks
	 *
	 * These funcitons all check to see if the individual add-ons that make up
	 * our personal membership are active.
	*/
	private function is_layout_styles_active()
	{
		return class_exists( 'NF_Layouts', false );
	}

	private function is_conditional_logic_active()
	{
		return class_exists( 'NF_ConditionalLogic', false );
	}

	private function is_multi_part_active()
	{
		return class_exists( 'NF_MultiPart', false );
	}

	private function is_file_uploads_active()
	{
		return class_exists( 'NF_FU_File_Uploads', false );
	}

	/**
	 * Utilizes the helper methods above to determine if a
	 * a Membership is active on a site.
	 */
	private function is_personal_active()
	{
		if (
			$this->is_conditional_logic_active() &&
			$this->is_file_uploads_active() &&
			$this->is_layout_styles_active() &&
			$this->is_multi_part_active()
		) {
				return true;
		}
		return false;
	}

	/**************************************************************************
	 * Promotion Removal Methods
	 *
	 * These funcitons all check for different add-ons/products and remove
	 * promotions for them if they are in use.
	****************************************************************************/
	private function maybe_remove_sendwp()
	{
		if ( phpversion() < '5.6.0' ) {
			$this->remove_promotion( 'sendwp' );

			return;
		} if ( $this->is_sendwp_active() ) {
			$this->remove_promotion( 'sendwp' );
		} elseif ( $this->is_ninja_mail_active() ) {
			$this->remove_promotion( 'sendwp' );
		}
	}

	private function maybe_remove_personal()
	{
		if ( $this->is_personal_active() ) {
			$this->remove_promotion( 'personal' );
		}
	}

	/***************************************************************************
	 * Helper Methods
	****************************************************************************/
	/**
	 * Pass in a promotion type to have it removed from
	 * the list of active promotions.
	 *
	 * @return void
	 */
	private function remove_promotion( $type )
	{
		// Loops over promotions and removes unused types of promotions.
		foreach ( $this->promotions as $promotion ) {
			if ( $type == $promotion[ 'type' ] ) {
				unset( $this->promotions[ $promotion[ 'id' ] ] );
			}
		}
	}

	/**
	 * Sorts our promotions by where they will appear in app.
	 *
	 * @return void
	 */
	private function sort_active_promotions_by_locations()
	{
		$sorted_locations = array();

		foreach ( $this->promotions as $promotion ) {
			$sorted_locations[ $promotion[ 'location' ] ][] = $promotion;
		}

		$this->promotions = $sorted_locations;
	}

	private function is_sendwp_active()
	{
		if ( class_exists( '\SendWP\Mailer', FALSE ) ) {
			return true;
		}

		return false;
	}

	private function is_ninja_mail_active()
	{
		if ( class_exists('\NinjaMail\Plugin', FALSE ) ) {
			return true;
		}

		return false;
	}
}