/home/arranoyd/magicraft/wp-content/plugins/incsub-support/inc/integration/pro-sites.php
<?php

/**
 * Pro Sites integration
 */

class Support_System_Pro_Sites_Integration {

	public function __construct() {

		if ( ! class_exists( 'ProSites' ) )
			return;

		add_filter( 'support_system_default_settings', array( $this, 'add_pro_sites_default_settings' ) );
		add_action( 'support_sytem_general_settings', array( $this, 'add_pro_sites_general_settings_fields' ) );
		add_action( 'support_sytem_front_settings', array( $this, 'add_pro_sites_front_settings_fields' ) );
		add_filter( 'support_system_validate_general_settings', array( $this, 'validate_general_settings' ) );
		add_filter( 'support_system_validate_front_settings', array( $this, 'validate_front_settings' ) );
		add_filter( 'support_system_user_can', array( $this, 'set_capabilities' ), 10, 3 );

		add_filter( 'support_system_not_allowed_tickets_list_message', array( $this, 'maybe_add_link_to_admin' ), 10, 2 );
		add_filter( 'support_system_not_allowed_submit_ticket_form_message', array( $this, 'maybe_add_link_to_admin' ), 10, 2 );
		add_filter( 'support_system_not_allowed_faqs_list_message', array( $this, 'maybe_add_link_to_admin' ), 10, 2 );
	}

	/**
	 * Add a link to the frontend message when the user cannot use support in frontend
	 *
	 * Sometimes, a user cannot use support in the front but in the admin side. This function
	 * will add a link to the support system
	 *
	 * @param  String $message Current message
	 * @return String          New message
	 */
	public function maybe_add_link_to_admin( $message, $type ) {
		if ( ! is_user_logged_in() )
			return $message;

		$user_id = get_current_user_id();

		$settings = incsub_support_get_settings();
		if ( is_multisite() && $settings['incsub_allow_only_pro_sites'] ) {
			$pro_blog_id = false;

			// Let's check if its main blog is a pro site
			$main_blog = get_active_blog_for_user( $user_id );
			if ( $main_blog && is_pro_site( $main_blog->blog_id, $settings['incsub_pro_sites_level'] ) ) {
				$pro_blog_id = $main_blog->blog_id;
			}
			else {
				$user_blogs = get_blogs_of_user( $user_id );
				foreach ( $user_blogs as $blog ) {

					if ( is_pro_site( $blog->userblog_id, $settings['incsub_pro_sites_level']  ) ) {
						$pro_blog_id = $blog->userblog_id;
						break;
					}
				}
			}

			if ( $pro_blog_id ) {
				$admin_url = add_query_arg( 'page', 'ticket-manager', get_admin_url( $pro_blog_id, 'admin.php' ) );
				$message = sprintf( __( 'Need support? <a href="%s" title="%s">Click here to go to your dashboard</a>', INCSUB_SUPPORT_LANG_DOMAIN ), $admin_url, esc_attr( __( 'Go to support in your site dashboard', INCSUB_SUPPORT_LANG_DOMAIN ) ) );
			}


		}
		elseif ( is_multisite() && ! $settings['incsub_allow_only_pro_sites'] ) {

			$blog_id = false;

			$main_blog = get_active_blog_for_user( $user_id );
			if ( $main_blog ) {
				$blog_id = $main_blog->blog_id;
			}
			else {
				$user_blogs = get_blogs_of_user( $user_id );
				if ( $user_blogs ) {
					$blog = key( $user_blogs );
					$blog_id = $blog->userblog_id;
				}
			}

			if ( $blog_id ) {
				if ( $type == 'faq-list' )
					$admin_url = add_query_arg( 'page', 'support-faq', get_admin_url( $blog_id, 'admin.php' ) );
				else
					$admin_url = add_query_arg( 'page', 'ticket-manager', get_admin_url( $blog_id, 'admin.php' ) );

				$message = sprintf( __( 'Need support? <a href="%s" title="%s">Click here to go to your dashboard</a>', INCSUB_SUPPORT_LANG_DOMAIN ), $admin_url, esc_attr( __( 'Go to support in your site dashboard', INCSUB_SUPPORT_LANG_DOMAIN ) ) );
			}

		}

		return $message;
	}

	public function add_pro_sites_general_settings_fields() {
		$settings = incsub_support_get_settings();

		$allow_only_pro_sites = $settings['incsub_allow_only_pro_sites'];
		$pro_sites_level = $settings['incsub_pro_sites_level'];
		$allow_only_pro_sites_faq = $settings['incsub_allow_only_pro_sites_faq'];
		$pro_sites_faq_level = $settings['incsub_pro_sites_faq_level'];
		$allow_only_pro_users_tickets = $settings['incsub_allow_only_pro_users_tickets'];
		$allow_only_pro_users_faq = $settings['incsub_allow_only_pro_users_faq'];

		?>

			<h3><?php _e( 'Pro Sites integration', INCSUB_SUPPORT_LANG_DOMAIN ); ?></h3>
			<p><?php _e( 'Set a Pro Site level for Admin Menus. This options will not affect the Frontend.', INCSUB_SUPPORT_LANG_DOMAIN ); ?></p>
			<table class="form-table">

				<tr valign="top">
					<th scope="row"><?php _e( 'Tickets', INCSUB_SUPPORT_LANG_DOMAIN ); ?></th>
					<td>
				    	<p>
				    		<label for="pro_sites">
					    		<input type="checkbox" id="pro_sites" name="pro_sites" <?php checked( $allow_only_pro_sites ); ?>>
					    		<span> <?php _e( 'Check and select a minimum Pro Site Level to allow <strong>Support Tickets</strong> in a blog (if unchecked, Support will be available for any blog)', INCSUB_SUPPORT_LANG_DOMAIN); ?></span>
				    		</label>
				    	</p>
				    	<p>
				    		<label for="pro_sites_levels">
				    			<?php psts_levels_select( 'pro_sites_levels', $pro_sites_level ); ?>
				    			<span class="description"><?php _e( 'Minimum Pro Site Level', INCSUB_SUPPORT_LANG_DOMAIN ); ?></span>
				    		</label>
				    	</p>

				    </td>
				</tr>
				<tr valign="top">
				    <th scope="row"><?php _e( 'FAQs', INCSUB_SUPPORT_LANG_DOMAIN ); ?></th>
				    <td>
				    	<p>
				    		<label for="pro_sites_faq">
				    			<input type="checkbox" id="pro_sites_faq" name="pro_sites_faq" <?php checked( $allow_only_pro_sites_faq ); ?>>
				    			<span> <?php _e( 'Check and select a minimum Pro Site Level to allow <strong>Support FAQ</strong> in a blog (if unchecked, Support FAQ will be available for any blog)', INCSUB_SUPPORT_LANG_DOMAIN); ?></span>
				    		</label>
				    	</p>
				    	<p>
				    		<label for="pro_sites_faq_levels">
				    			<?php psts_levels_select( 'pro_sites_faq_levels', $pro_sites_faq_level ); ?>
				    			<span class="description"><?php _e( 'Minimum Pro Site Level', INCSUB_SUPPORT_LANG_DOMAIN ); ?></span>
				    		</label>
				    	</p>
				    </td>
		    	</tr>
		    </table>
	    <?php
	}

	public function add_pro_sites_front_settings_fields() {
		$settings = incsub_support_get_settings();

		$pro_users_level = $settings['incsub_pro_users_level'];
		$pro_users_faqs_level = $settings['incsub_pro_users_faqs_level'];
		$allow_only_pro_users_tickets = $settings['incsub_allow_only_pro_users_tickets'];
		$allow_only_pro_users_faqs = $settings['incsub_allow_only_pro_users_faqs'];

		?>

			<h3><?php _e( 'Pro Users integration', INCSUB_SUPPORT_LANG_DOMAIN ); ?></h3>
			<p><?php _e( 'Set a Pro Level for users. A user is pro if it has at least one Pro Site with the specified level.', INCSUB_SUPPORT_LANG_DOMAIN ); ?></p>
			<table class="form-table">

		    	<tr valign="top">
					<th scope="row"><?php _e( 'Tickets', INCSUB_SUPPORT_LANG_DOMAIN ); ?></th>
				    <td>
				    	<p>
				    		<label for="pro_users_tickets">
				    			<input type="checkbox" id="pro_users_tickets" name="pro_users_tickets" <?php checked( $allow_only_pro_users_tickets ); ?>>
				    			<span> <?php _e( 'Allow <strong>Support Tickets</strong> only for Pro Users', INCSUB_SUPPORT_LANG_DOMAIN); ?></span>
				    		</label>
				    	</p>
				    	<p>
				    		<label for="pro_users_levels">
				    			<?php psts_levels_select( 'pro_users_levels', $pro_users_level ); ?>
				    			<span class="description"><?php _e( 'Minimum Pro Site Level', INCSUB_SUPPORT_LANG_DOMAIN ); ?></span>
				    		</label>
				    	</p>
					</td>
				</tr>

				<tr valign="top">
					<th scope="row"><?php _e( 'FAQs', INCSUB_SUPPORT_LANG_DOMAIN ); ?></th>
				    <td>
				    	<p>
				    		<label for="pro_users_faqs">
				    			<input type="checkbox" id="pro_users_faqs" name="pro_users_faqs" <?php checked( $allow_only_pro_users_faqs ); ?>>
				    			<span> <?php _e( 'Allow <strong>Support FAQs</strong> only for Pro Users', INCSUB_SUPPORT_LANG_DOMAIN); ?></span>
				    		</label>
				    	</p>
				    	<p>
				    		<label for="pro_users_faq_levels">
				    			<?php psts_levels_select( 'pro_users_faqs_levels', $pro_users_faqs_level ); ?>
				    			<span class="description"><?php _e( 'Minimum Pro Site Level', INCSUB_SUPPORT_LANG_DOMAIN ); ?></span>
				    		</label>
				    	</p>
					</td>
				</tr>

		    </table>
	    <?php
	}

	public function add_pro_sites_default_settings( $defaults ) {
		$pro_sites_defaults = array(
			'incsub_allow_only_pro_sites' => false,
			'incsub_pro_sites_level' => '',
			'incsub_allow_only_pro_sites_faq' => false,
			'incsub_pro_sites_faq_level' => '',
			'incsub_allow_only_pro_users_tickets' => false,
			'incsub_allow_only_pro_users_faqs' => false,
			'incsub_pro_users_level' => '',
			'incsub_pro_users_faqs_level' => ''
		);

		return array_merge( $defaults, $pro_sites_defaults );
	}

	public function validate_general_settings( $settings ) {
		$input = $_POST;

		if ( isset( $input['pro_sites'] ) ) {
			$settings['incsub_allow_only_pro_sites'] = true;
			$settings['incsub_pro_sites_level'] = absint( $input['pro_sites_levels'] );
		}
		else {
			$settings['incsub_allow_only_pro_sites'] = false;
			$settings['incsub_pro_sites_level'] = '';
		}

		if ( isset( $input['pro_sites_faq'] ) ) {
			$settings['incsub_allow_only_pro_sites_faq'] = true;
			$settings['incsub_pro_sites_faq_level'] = absint( $input['pro_sites_faq_levels'] );
		}
		else {
			$settings['incsub_allow_only_pro_sites_faq'] = false;
			$settings['incsub_pro_sites_faq_level'] = '';
		}

		return $settings;
	}

	public function validate_front_settings( $settings ) {
		$input = $_POST;

		if ( isset( $input['pro_users_tickets'] ) ) {
			$settings['incsub_allow_only_pro_users_tickets'] = true;
			$settings['incsub_pro_users_level'] = absint( $input['pro_users_levels'] );
		}
		else {
			$settings['incsub_allow_only_pro_users_tickets'] = false;
			$settings['incsub_pro_users_level'] = '';
		}

		if ( isset( $input['pro_users_faqs'] ) ) {
			$settings['incsub_allow_only_pro_users_faqs'] = true;
			$settings['incsub_pro_users_faqs_level'] = absint( $input['pro_users_faqs_levels'] );
		}
		else {
			$settings['incsub_allow_only_pro_users_faqs'] = false;
			$settings['incsub_pro_users_faqs_level'] = '';
		}


		return $settings;
	}

	public function set_capabilities( $user_can, $user_id, $cap ) {

		$tickets_caps = array( 'read_ticket', 'insert_ticket', 'insert_reply' );
		$faqs_caps = array( 'read_faq' );

		$settings = incsub_support_get_settings();
		if (
			is_multisite()
			&& is_admin()
			&& ! is_network_admin()
			&& $settings['incsub_allow_only_pro_sites']
			&& in_array( $cap, $tickets_caps )
			&& ! is_pro_site( get_current_blog_id(), absint( $settings['incsub_pro_sites_level'] ) )
		) {
			return false;
		}

		if (
			is_multisite()
			&& is_admin()
			&& ! is_network_admin()
			&& $settings['incsub_allow_only_pro_sites_faq']
			&& in_array( $cap, $faqs_caps )
			&& ! is_pro_site( get_current_blog_id(), absint( $settings['incsub_pro_sites_faq_level'] ) )
		) {
			return false;
		}

		if (
			is_multisite()
			&& ! is_admin()
			&& $settings['incsub_allow_only_pro_users_tickets']
			&& in_array( $cap, $tickets_caps )
		) {
			return $this->_is_pro_user( $user_id, $settings['incsub_pro_users_level'] );
		}

		if (
			is_multisite()
			&& ! is_admin()
			&& $settings['incsub_allow_only_pro_users_faqs']
			&& in_array( $cap, $faqs_caps )
		) {
			return $this->_is_pro_user( $user_id, $settings['incsub_pro_users_faqs_level'] );
		}

		return $user_can;
	}

	private function _is_pro_user( $user_id, $level ) {
		if ( is_super_admin( $user_id ) )
			return true;

		$user_blogs = get_blogs_of_user( $user_id );

		$cache = wp_cache_get( 'pro_user_' . $user_id, 'support_system_pro_user' );

		if ( is_array( $cache ) )
			return $cache['is_pro_user'];

		$is_pro_user = false;
		foreach ( $user_blogs as $blog ) {

			if ( is_pro_site( $blog->userblog_id, $level ) ) {
				switch_to_blog( $blog->userblog_id );
				if ( user_can( $user_id, 'manage_options' ) )
					$is_pro_user = true;
				restore_current_blog();

				if ( $is_pro_user )
					break;
			}
		}

		wp_cache_set( 'pro_user_' . $user_id, array( 'user_id' => $user_id, 'is_pro_user' => $is_pro_user ), 'support_system_pro_user' );
		return $is_pro_user;

	}
}

add_action( 'plugins_loaded', 'support_system_init_pro_sites_integration', 100 );
function support_system_init_pro_sites_integration() {
	if ( class_exists( 'ProSites' ) ) {
		new Support_System_Pro_Sites_Integration();
	}
}