<?php

defined( 'ABSPATH' ) or exit;

/**
 * Class MC4WP_BuddyPress_Integration
 *
 * @ignore
 */
class MC4WP_BuddyPress_Integration extends MC4WP_User_Integration {


	/**
	 * @var string
	 */
	public $name = 'BuddyPress';

	/**
	 * @var string
	 */
	public $description = 'Subscribes users from BuddyPress registration forms.';


	/**
	 * Add hooks
	 */
	public function add_hooks() {
		if ( ! $this->options['implicit'] ) {
			add_action( 'bp_before_registration_submit_buttons', array( $this, 'output_checkbox' ), 20 );
		}

		if ( is_multisite() ) {

			/**
			 * Multisite signups are a two-stage process - the data is first added to
			 * the 'signups' table and then converted into an actual user during the
			 * activation process.
			 *
			 * To avoid all signups being subscribed to the Mailchimp list until they
			 * have responded to the activation email, a value is stored in the signup
			 * usermeta data which is retrieved on activation and acted upon.
			 */
			add_filter( 'bp_signup_usermeta', array( $this, 'store_usermeta' ), 10, 1 );
			add_action( 'bp_core_activated_user', array( $this, 'subscribe_from_usermeta' ), 10, 3 );
		} else {
			add_action( 'bp_core_signup_user', array( $this, 'subscribe_from_form' ), 10, 4 );
		}

		/**
		 * There is one further issue to consider, which is that many BuddyPress
		 * installs have a user moderation plugin (e.g. BP Registration Options)
		 * installed. This is because email activation on itself is sometimes not enough to ensure
		 * that user signups are not spammers. There should therefore be a way for
		 * plugins to delay the Mailchimp signup process.
		 *
		 * Plugins can hook into the 'mc4wp_integration_buddypress_should_subscribe' filter to prevent
		 * subscriptions from taking place:
		 *
		 * add_filter( 'mc4wp_integration_buddypress_should_subscribe', '__return_false' );
		 *
		 * The plugin would then then call:
		 *
		 * do_action( 'mc4wp_integration_buddypress_subscribe_user', $user_id );
		 *
		 * to perform the subscription at a later point.
		 */
		add_action( 'mc4wp_integration_buddypress_subscribe_user', array( $this, 'subscribe_buddypress_user' ), 10, 1 );
	}

	/**
	 * Subscribes from BuddyPress Registration Form.
	 *
	 * @param int $user_id
	 * @param string $user_login
	 * @param string $user_password
	 * @param string $user_email
	 * @return bool
	 */
	public function subscribe_from_form( $user_id, $user_login, $user_password, $user_email ) {
		if ( ! $this->triggered() ) {
			return false;
		}

		$subscribe = true;

		/**
		 * Allow other plugins to prevent the Mailchimp sign-up.
		 *
		 * @param bool $subscribe False does not subscribe the user.
		 * @param int $user_id The user ID to subscribe
		 */
		$subscribe = apply_filters( 'mc4wp_integration_buddypress_should_subscribe', $subscribe, $user_id );

		if ( ! $subscribe ) {
			return false;
		}

		return $this->subscribe_buddypress_user( $user_id );
	}

	/**
	 * Stores subscription data from BuddyPress Registration Form.
	 *
	 * @param array $usermeta The existing usermeta
	 * @return array $usermeta The modified usermeta
	 */
	public function store_usermeta( $usermeta ) {

		// only add meta if triggered (checked)
		if ( $this->triggered() ) {
			$usermeta['mc4wp_subscribe'] = '1';
		}

		return $usermeta;
	}

	/**
	 * Subscribes from BuddyPress Activation.
	 *
	 * @param int $user_id The activated user ID
	 * @param string $key the activation key (not used)
	 * @param array $userdata An array containing the activated user data
	 * @return bool
	 */
	public function subscribe_from_usermeta( $user_id, $key, $userdata ) {

		// sanity check
		if ( empty( $user_id ) ) {
			return false;
		}

		// bail if our usermeta key is not switched on
		$meta = ( isset( $userdata['meta'] ) ) ? $userdata['meta'] : array();
		if ( empty( $meta['mc4wp_subscribe'] ) ) {
			return false;
		}

		$subscribe = true;

		/**
		 * @ignore Documented elsewhere, see MC4WP_BuddyPress_Integration::subscribe_from_form.
		 */
		$subscribe = apply_filters( 'mc4wp_integration_buddypress_should_subscribe', $subscribe, $user_id );
		if ( ! $subscribe ) {
			return false;
		}

		return $this->subscribe_buddypress_user( $user_id );
	}

	/**
	 * Subscribes a user to Mailchimp list(s).
	 *
	 * @param int $user_id The user ID to subscribe
	 * @return bool
	 */
	public function subscribe_buddypress_user( $user_id ) {
		$user = get_userdata( $user_id );

		// was a user found with the given ID?
		if ( ! $user instanceof WP_User ) {
			return false;
		}

		// gather email address and name from user
		$data = $this->user_merge_vars( $user );

		return $this->subscribe( $data, $user_id );
	}
	/* End BuddyPress functions */

	/**
	 * @return bool
	 */
	public function is_installed() {
		return class_exists( 'BuddyPress' );
	}
}
