<?php

namespace um\core;



// Exit if accessed directly

if ( ! defined( 'ABSPATH' ) ) exit;



if ( ! class_exists( 'um\core\Rewrite' ) ) {





	/**

	 * Class Rewrite

	 * @package um\core

	 */

	class Rewrite {





		/**

		 * Rewrite constructor.

		 */

		function __construct() {

			//add rewrite rules

			add_filter( 'query_vars', array(&$this, 'query_vars'), 10, 1 );

			add_filter( 'rewrite_rules_array', array( &$this, '_add_rewrite_rules' ), 10, 1 );

			add_action( 'init', array( &$this, 'rewrite_rules'), 100000000 );





			add_action( 'template_redirect', array( &$this, 'redirect_author_page'), 9999 );

			add_action( 'template_redirect', array( &$this, 'locate_user_profile'), 9999 );

		}





		/**

		 * Modify global query vars

		 *

		 * @param $public_query_vars

		 *

		 * @return array

		 */

		function query_vars( $public_query_vars ) {

			$public_query_vars[] = 'um_user';

			$public_query_vars[] = 'um_tab';

			$public_query_vars[] = 'profiletab';

			$public_query_vars[] = 'subnav';



			$public_query_vars[] = 'um_page';

			$public_query_vars[] = 'um_action';

			$public_query_vars[] = 'um_field';

			$public_query_vars[] = 'um_form';

			$public_query_vars[] = 'um_resource';

			$public_query_vars[] = 'um_method';

			$public_query_vars[] = 'um_verify';



			return $public_query_vars;

		}





		/**

		 * Add UM rewrite rules

		 *

		 * @param $rules

		 *

		 * @return array

		 */

		function _add_rewrite_rules( $rules ) {

			$newrules = array();



			$newrules['um-api/([^/]+)/([^/]+)/([^/]+)/([^/]+)/?$'] = 'index.php?um_page=api&um_action=$matches[1]&um_resource=$matches[2]&um_method=$matches[3]&um_verify=$matches[4]';

			$newrules['um-download/([^/]+)/([^/]+)/([^/]+)/([^/]+)/?$'] = 'index.php?um_action=download&um_form=$matches[1]&um_field=$matches[2]&um_user=$matches[3]&um_verify=$matches[4]';



			if ( isset( UM()->config()->permalinks['user'] ) ) {



				$user_page_id = UM()->config()->permalinks['user'];

				$user = get_post( $user_page_id );



				if ( isset( $user->post_name ) ) {



					$user_slug = $user->post_name;



					$add_lang_code = '';

					$language_code = '';



					if ( function_exists('icl_object_id') || function_exists('icl_get_current_language') ) {



						if ( function_exists('icl_get_current_language') ) {

							$language_code = icl_get_current_language();

						} elseif( function_exists('icl_object_id') && defined('ICL_LANGUAGE_CODE') ) {

							$language_code = ICL_LANGUAGE_CODE;

						}



						// User page translated slug

						$lang_post_id = icl_object_id( $user->ID, 'post', FALSE, $language_code );

						$lang_post_obj = get_post( $lang_post_id );

						if( isset( $lang_post_obj->post_name ) ){

							$user_slug = $lang_post_obj->post_name;

						}



						if(  $language_code != icl_get_default_language() ){

							$add_lang_code = $language_code;

						}



					}



					$newrules[ $user_slug.'/([^/]+)/?$' ] = 'index.php?page_id='.$user_page_id.'&um_user=$matches[1]&lang='.$add_lang_code;

				}

			}



			if ( isset( UM()->config()->permalinks['account'] ) ) {



				$account_page_id = UM()->config()->permalinks['account'];

				$account = get_post( $account_page_id );



				if ( isset( $account->post_name ) ) {



					$account_slug = $account->post_name;



					$add_lang_code = '';

					$language_code = '';



					if ( function_exists('icl_object_id') || function_exists('icl_get_current_language') ) {



						if ( function_exists('icl_get_current_language') ){

							$language_code = icl_get_current_language();

						} elseif( function_exists('icl_object_id') && defined('ICL_LANGUAGE_CODE') ) {

							$language_code = ICL_LANGUAGE_CODE;

						}



						// Account page translated slug

						$lang_post_id = icl_object_id( $account->ID, 'post', FALSE, $language_code );

						$lang_post_obj = get_post( $lang_post_id );

						if ( isset( $lang_post_obj->post_name ) ){

							$account_slug = $lang_post_obj->post_name;

						}



						if ( $language_code != icl_get_default_language() ) {

							$add_lang_code = $language_code;

						}



					}



					$newrules[ $account_slug.'/([^/]+)?$' ] = 'index.php?page_id='.$account_page_id.'&um_tab=$matches[1]&lang='.$add_lang_code;



				}



			}



			return $newrules + $rules;

		}





		/**

		 * Setup rewrite rules

		 */

		function rewrite_rules() {



			if ( isset( UM()->config()->permalinks['user'] ) && isset( UM()->config()->permalinks['account'] ) ) {



				/**

				 * UM hook

				 *

				 * @type filter

				 * @title um_rewrite_flush_rewrite_rules

				 * @description Enable flushing rewrite rules

				 * @input_vars

				 * [{"var":"$stop_flush","type":"bool","desc":"Stop flushing rewrite rules"}]

				 * @change_log

				 * ["Since: 2.0"]

				 * @usage

				 * <?php add_filter( 'um_rewrite_flush_rewrite_rules', 'function_name', 10, 1 ); ?>

				 * @example

				 * <?php

				 * add_filter( 'um_rewrite_flush_rewrite_rules', 'my_rewrite_flush_rewrite_rules', 10, 1 );

				 * function my_rewrite_flush_rewrite_rules( $stop_flush ) {

				 *     // your code here

				 *     return $stop_flush;

				 * }

				 * ?>

				 */

				if ( ! apply_filters( 'um_rewrite_flush_rewrite_rules', UM()->options()->get( 'um_flush_stop' ) ) ) {

					flush_rewrite_rules( true );

				}



			}



		}





		/**

		 * Author page to user profile redirect

		 */

		function redirect_author_page() {

			if ( UM()->options()->get( 'author_redirect' ) && is_author() ) {

				$id = get_query_var( 'author' );

				um_fetch_user( $id );

				exit( wp_redirect( um_user_profile_url() ) );

			}

		}





		/**

		 * Locate/display a profile

		 */

		function locate_user_profile() {

			global $post;



			if ( um_queried_user() && um_is_core_page('user') ) {



				if ( UM()->options()->get( 'permalink_base' ) == 'user_login' ) {



					$user_id = username_exists( um_queried_user() );



					//Try

					if ( ! $user_id ) {

						$permalink_base = UM()->options()->get( 'permalink_base' );



						// Search by Profile Slug

						$args = array(

							"fields" => 'ids',

							'meta_query' => array(

								array(

									'key'		=>  'um_user_profile_url_slug_'.$permalink_base,

									'value'		=> strtolower( um_queried_user() ),

									'compare'	=> '='

								)

							),

							'number'    => 1

						);





						$ids = new \WP_User_Query( $args );

						if ( $ids->total_users > 0 ) {

							$user_id = current( $ids->get_results() );

						}

					}



					// Try nice name

					if ( !$user_id ) {

						$slug = um_queried_user();

						$slug = str_replace('.','-',$slug);

						$the_user = get_user_by( 'slug', $slug );

						if ( isset( $the_user->ID ) ){

							$user_id = $the_user->ID;

						}



						if ( ! $user_id )

							$user_id = UM()->user()->user_exists_by_email_as_username( um_queried_user() );



						if ( ! $user_id )

							$user_id = UM()->user()->user_exists_by_email_as_username( $slug );



					}



				}



				if ( UM()->options()->get( 'permalink_base' ) == 'user_id' ) {

					$user_id = UM()->user()->user_exists_by_id( um_queried_user() );



				}



				if ( in_array( UM()->options()->get( 'permalink_base' ), array('name','name_dash','name_dot','name_plus') ) ) {

					$user_id = UM()->user()->user_exists_by_name( um_queried_user() );



				}



				/** USER EXISTS SET USER AND CONTINUE **/



				if ( $user_id ) {



					um_set_requested_user( $user_id );



					/**

					 * UM hook

					 *

					 * @type action

					 * @title um_access_profile

					 * @description Action on user access profile

					 * @input_vars

					 * [{"var":"$user_id","type":"int","desc":"User ID"}]

					 * @change_log

					 * ["Since: 2.0"]

					 * @usage add_action( 'um_access_profile', 'function_name', 10, 1 );

					 * @example

					 * <?php

					 * add_action( 'um_access_profile', 'my_access_profile', 10, 1 );

					 * function my_access_profile( $user_id ) {

					 *     // your code here

					 * }

					 * ?>

					 */

					do_action( 'um_access_profile', $user_id );



				} else {



					exit( wp_redirect( um_get_core_page( 'user' ) ) );



				}



			} else if ( um_is_core_page( 'user' ) ) {



				if ( is_user_logged_in() ) { // just redirect to their profile



					$query = UM()->permalinks()->get_query_array();



					$url = um_user_profile_url( um_user( 'ID' ) );



					if ( $query ) {

						foreach ( $query as $key => $val ) {

							$url = add_query_arg( $key, $val, $url );

						}

					}



					exit( wp_redirect( $url ) );

				} else {



					/**

					 * UM hook

					 *

					 * @type filter

					 * @title um_locate_user_profile_not_loggedin__redirect

					 * @description Change redirect URL from user profile for not logged in user

					 * @input_vars

					 * [{"var":"$url","type":"string","desc":"Redirect URL"}]

					 * @change_log

					 * ["Since: 2.0"]

					 * @usage

					 * <?php add_filter( 'um_locate_user_profile_not_loggedin__redirect', 'function_name', 10, 1 ); ?>

					 * @example

					 * <?php

					 * add_filter( 'um_locate_user_profile_not_loggedin__redirect', 'my_user_profile_not_loggedin__redirect', 10, 1 );

					 * function my_user_profile_not_loggedin__redirect( $url ) {

					 *     // your code here

					 *     return $url;

					 * }

					 * ?>

					 */

					$redirect_to = apply_filters( 'um_locate_user_profile_not_loggedin__redirect', home_url() );

					if ( ! empty( $redirect_to ) ){

						exit( wp_redirect( $redirect_to ) );

					}



				}



			}



		}



	}

}