<?php
/**
 * Integrations for buddypress
 *
 * @package   PUM
 * @copyright Copyright (c) 2023, Code Atlantic LLC
 */

// Exit if accessed directly
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Class PUM_BuddyPress_Integration
 */
class PUM_BuddyPress_Integration {

	/**
	 *
	 */
	public static function init() {
		add_filter( 'pum_registered_conditions', [ __CLASS__, 'registered_conditions' ] );
		add_filter( 'pum_condition_sort_order', [ __CLASS__, 'condition_sort_order' ] );
	}

	/**
	 * @param array $conditions
	 *
	 * @return array
	 */
	public static function registered_conditions( $conditions = [] ) {

		$conditions = array_merge(
			$conditions,
			[
				// Add Additional Conditions
				'is_buddypress'           => [
					'group'    => __( 'BuddyPress', 'buddypress' ),
					'name'     => __( 'BP: Is a BuddyPress Page', 'popup-maker' ),
					'callback' => 'is_buddypress',
				],

				'bp_is_user'              => [
					'group'    => __( 'BuddyPress', 'buddypress' ),
					'name'     => __( 'BP: Is User Page', 'popup-maker' ),
					'callback' => 'bp_is_user',
				],

				'bp_is_group'             => [
					'group'    => __( 'BuddyPress', 'buddypress' ),
					'name'     => __( 'BP: Is Group Page', 'popup-maker' ),
					'callback' => 'bp_is_group',
				],

				'bp_is_user_messages'     => [
					'group'    => __( 'BuddyPress', 'buddypress' ),
					'name'     => __( 'BP: Is User Messages Page', 'popup-maker' ),
					'callback' => 'bp_is_user_messages',
				],

				'bp_is_activation_page'   => [
					'group'    => __( 'BuddyPress', 'buddypress' ),
					'name'     => __( 'BP: Is Activation Page', 'popup-maker' ),
					'callback' => 'bp_is_activation_page',
				],

				'bp_is_register_page'     => [
					'group'    => __( 'BuddyPress', 'buddypress' ),
					'name'     => __( 'BP: Is Register Page', 'popup-maker' ),
					'callback' => 'bp_is_register_page',
				],

				'bp_is_item_admin'        => [
					'group'    => __( 'BuddyPress', 'buddypress' ),
					'name'     => __( 'BP: Is Item Admin', 'popup-maker' ),
					'callback' => 'bp_is_item_admin',
				],

				'bp_is_item_mod'          => [
					'group'    => __( 'BuddyPress', 'buddypress' ),
					'name'     => __( 'BP: Is Item Mod', 'popup-maker' ),
					'callback' => 'bp_is_item_mod',
				],

				'bp_is_directory'         => [
					'group'    => __( 'BuddyPress', 'buddypress' ),
					'name'     => __( 'BP: Is Directory', 'popup-maker' ),
					'callback' => 'bp_is_directory',
				],
				'bp_is_current_component' => [
					'group'    => __( 'BuddyPress', 'buddypress' ),
					'name'     => __( 'BP: Is Current Component', 'popup-maker' ),
					'fields'   => [
						'selected' => [
							'type'     => 'select',
							'multiple' => true,
							'as_array' => true,
							'select2'  => true,
							'options'  => self::component_option_list(),
							'label'    => __( 'Which components?' ),
						],
					],
					'callback' => [ __CLASS__, 'bp_is_current_component' ],
				],

				'bp_is_current_action'    => [
					'group'    => __( 'BuddyPress', 'buddypress' ),
					'name'     => __( 'BP: Is Current Action', 'popup-maker' ),
					'fields'   => [
						'selected' => [
							'type'  => 'text',
							'label' => __( 'Which actions?' ),
						],
					],
					'callback' => [ __CLASS__, 'bp_is_current_action' ],
				],

				'bp_is_action_variable'   => [
					'group'    => __( 'BuddyPress', 'buddypress' ),
					'name'     => __( 'BP: Is Action Variable', 'popup-maker' ),
					'fields'   => [
						'selected' => [
							'type'  => 'text',
							'label' => __( 'Which action variables?' ),
						],
					],
					'callback' => [ __CLASS__, 'bp_is_action_variable' ],
				],

			]
		);

		return $conditions;
	}

	/**
	 * @return array
	 */
	public static function component_option_list() {
		global $bp;

		$components = [];

		foreach ( $bp->active_components as $component => $key ) {
			$components[ $component ] = ucfirst( $component );
		}

		return $components;
	}

	/**
	 * Checks if the current page is the selected bp components.
	 *
	 * @param array $settings
	 *
	 * @return bool
	 */
	public static function bp_is_current_component( $settings = [] ) {
		global $bp;

		if ( empty( $settings['selected'] ) ) {
			return false;
		}

		if ( ! is_array( $settings['selected'] ) ) {
			$settings['selected'] = [ $settings['selected'] ];
		}

		$found = false;

		foreach ( $settings['selected'] as $component ) {
			if ( ! array_key_exists( $component, $bp->active_components ) ) {
				continue;
			}

			if ( bp_is_current_component( $component ) ) {
				$found = true;
			}
		}

		return $found;
	}

	/**
	 * Checks if the current page is the selected bp action.
	 *
	 * @param array $settings
	 *
	 * @return bool
	 */
	public static function bp_is_current_action( $settings = [] ) {

		if ( empty( $settings['selected'] ) ) {
			return false;
		}

		if ( ! is_array( $settings['selected'] ) ) {
			$settings['selected'] = array_map( 'trim', explode( ',', $settings['selected'] ) );
		}

		$found = false;

		foreach ( $settings['selected'] as $action ) {
			if ( bp_is_current_action( $action ) ) {
				$found = true;
			}
		}

		return $found;
	}


	/**
	 * Checks if the current page is the selected bp action variable.
	 *
	 * @param array $settings
	 *
	 * @return bool
	 */
	public static function bp_is_action_variable( $settings = [] ) {

		if ( empty( $settings['selected'] ) ) {
			return false;
		}

		if ( ! is_array( $settings['selected'] ) ) {
			$settings['selected'] = array_map( 'trim', explode( ',', $settings['selected'] ) );
		}

		$found = false;

		foreach ( $settings['selected'] as $variable ) {
			if ( bp_is_action_variable( $variable ) ) {
				$found = true;
			}
		}

		return $found;
	}

	/**
	 * @param array $order
	 *
	 * @return array
	 */
	public static function condition_sort_order( $order = [] ) {
		$order[ __( 'BuddyPress', 'buddypress' ) ] = 5.756;

		return $order;
	}

}
