<?php

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

if( ! class_exists('acf_options_page') ) :

class acf_options_page {
	
	/** @var array Contains an array of optiions page settings */
	var $pages = array();
	
	
	/*
	*  __construct
	*
	*  Initialize filters, action, variables and includes
	*
	*  @type	function
	*  @date	23/06/12
	*  @since	5.0.0
	*
	*  @param	n/a
	*  @return	n/a
	*/
	
	function __construct() {
		
		/* do nothing */
		
	}
	
	
	/*
	*  validate_page
	*
	*  description
	*
	*  @type	function
	*  @date	28/2/17
	*  @since	5.5.8
	*
	*  @param	$post_id (int)
	*  @return	$post_id (int)
	*/
	
	function validate_page( $page ) {
		
		// default
		if( empty($page) ) {
			
			$page_title =  __('Options', 'acf');
			$page = array(
				'page_title'	=> $page_title,
				'menu_title'	=> $page_title,
				'menu_slug' 	=> 'acf-options'
			);
		
		// string		
		} elseif( is_string($page) ) {
		
			$page_title = $page;
			$page = array(
				'page_title'	=> $page_title,
				'menu_title'	=> $page_title
			);
		}
		
		
		// defaults
		$page = wp_parse_args($page, array(
			'page_title' 		=> '',
			'menu_title'		=> '',
			'menu_slug' 		=> '',
			'capability'		=> 'edit_posts',
			'parent_slug'		=> '',
			'position'			=> false,
			'icon_url'			=> false,
			'redirect'			=> true,
			'post_id'			=> 'options',
			'autoload'			=> false,
			'update_button'		=> __('Update', 'acf'),
			'updated_message'	=> __("Options Updated", 'acf'),
		));
		
		
		// ACF4 compatibility
		$migrate = array(
			'title' 	=> 'page_title',
			'menu'		=> 'menu_title',
			'slug'		=> 'menu_slug',
			'parent'	=> 'parent_slug'
		);
		
		foreach( $migrate as $old => $new ) {
			if( !empty($page[$old]) ) {
				$page[ $new ] = $page[ $old ];
			}
		}
		
		
		// page_title (allows user to define page with just page_title or title)
		if( empty($page['menu_title']) ) {
			$page['menu_title'] = $page['page_title'];
		}
		
		
		// menu_slug
		if( empty($page['menu_slug']) ) {
			$page['menu_slug'] = 'acf-options-' . sanitize_title( $page['menu_title'] );
		}
		
		
		// filter
		$page = apply_filters('acf/validate_options_page', $page);
		
		
		// return
		return $page;
		
	}
	
	
	/*
	*  add_page
	*
	*  This function will store an options page settings
	*
	*  @type	function
	*  @date	9/6/17
	*  @since	5.6.0
	*
	*  @param	$page (array)
	*  @return	n/a
	*/
	
	function add_page( $page ) {
		
		// validate
		$page = $this->validate_page( $page );
		$slug = $page['menu_slug'];
		
		
		// bail ealry if already exists
		if( isset($this->pages[$slug]) ) return false;
		
		
		// append
		$this->pages[$slug] = $page;
		
		
		// return
		return $page;
		
	}
	
	
	/*
	*  add_sub_page
	*
	*  description
	*
	*  @type	function
	*  @date	9/6/17
	*  @since	5.6.0
	*
	*  @param	$post_id (int)
	*  @return	$post_id (int)
	*/
	
	function add_sub_page( $page ) {
		
		// validate
		$page = $this->validate_page( $page );
		
		
		// default parent
		if( !$page['parent_slug'] ) {
			$page['parent_slug'] = 'acf-options';
		}
		
		
		// create default parent if not yet exists
		if( $page['parent_slug'] == 'acf-options' && !$this->get_page('acf-options') ) {
			
			$this->add_page( '' );
			
		}
			
		
		// return
		return $this->add_page( $page );
		
	}
	
	
	/*
	*  update_page
	*
	*  This function will update an options page settings
	*
	*  @type	function
	*  @date	9/6/17
	*  @since	5.6.0
	*
	*  @param	$slug (string)
	*  @param	$data (array)
	*  @return	(array)
	*/
	
	function update_page( $slug = '', $data = array() ) {
		
		// vars
		$page = $this->get_page( $slug );
		
		
		// bail early if no page
		if( !$page ) return false;
		
		
		// loop
		$page = array_merge( $page, $data );
		
		
		// set
		$this->pages[ $slug ] = $page;
		
		
		// return
		return $page;
		
	}
	
	
	/*
	*  get_page
	*
	*  This function will return an options page settings
	*
	*  @type	function
	*  @date	6/07/2016
	*  @since	5.4.0
	*
	*  @param	$slug (string)
	*  @return	(mixed)
	*/
	
	function get_page( $slug ) {
		
		return isset( $this->pages[$slug] ) ? $this->pages[$slug] : null;
		
	}
	
	
	/*
	*  get_pages
	*
	*  This function will return all options page settings
	*
	*  @type	function
	*  @date	6/07/2016
	*  @since	5.4.0
	*
	*  @param	$slug (string)
	*  @return	(mixed)
	*/
	
	function get_pages() {
		
		return $this->pages;
		
	}
    
}


/*
*  acf_options_page
*
*  This function will return the options page instance
*
*  @type	function
*  @date	9/6/17
*  @since	5.6.0
*
*  @param	n/a
*  @return	(object)
*/

function acf_options_page() {
	
	global $acf_options_page;
	
	if( !isset($acf_options_page) ) {
		
		$acf_options_page = new acf_options_page();
		
	}
	
	return $acf_options_page;
	
}


// remove Options Page add-on conflict
unset($GLOBALS['acf_options_page']);


// initialize
acf_options_page();


endif; // class_exists check


/*
*  acf_add_options_page
*
*  alias of acf_options_page()->add_page()
*
*  @type	function
*  @date	24/02/2014
*  @since	5.0.0
*
*  @param	$page (mixed)
*  @return	(array)
*/

if( !function_exists('acf_add_options_page') ):

function acf_add_options_page( $page = '' ) {
	
	return acf_options_page()->add_page( $page );
	
}

endif;


/*
*  acf_add_options_sub_page
*
*  alias of acf_options_page()->add_sub_page()
*
*  @type	function
*  @date	24/02/2014
*  @since	5.0.0
*
*  @param	$page (mixed)
*  @return	(array)
*/

if( !function_exists('acf_add_options_sub_page') ):

function acf_add_options_sub_page( $page = '' ) {
	
	return acf_options_page()->add_sub_page( $page );
	
}

endif;


/*
*  acf_update_options_page
*
*  alias of acf_options_page()->update_page()
*
*  @type	function
*  @date	24/02/2014
*  @since	5.0.0
*
*  @param	$slug (string)
*  @param	$page (mixed)
*  @return	(array)
*/

if( !function_exists('acf_update_options_page') ):

function acf_update_options_page( $slug = '', $data = array() ) {
	
	return acf_options_page()->update_page( $slug, $data );
	
}

endif;


/*
*  acf_get_options_page
*
*  This function will return an options page settings
*
*  @type	function
*  @date	24/02/2014
*  @since	5.0.0
*
*  @param	$slug (string)
*  @return	(array)
*/

if( !function_exists('acf_get_options_page') ):

function acf_get_options_page( $slug ) {
	
	// vars
	$page = acf_options_page()->get_page( $slug );
	
	
	// bail early if no page
	if( !$page ) return false;
	
	
	// filter
	$page = apply_filters('acf/get_options_page', $page, $slug);
	
	
	// return
	return $page;
	
}

endif;


/*
*  acf_get_options_pages
*
*  This function will return all options page settings
*
*  @type	function
*  @date	24/02/2014
*  @since	5.0.0
*
*  @param	n/a
*  @return	(array)
*/

if( !function_exists('acf_get_options_pages') ):

function acf_get_options_pages() {
	
	// global
	global $_wp_last_utility_menu;
	
	
	// vars
	$pages = acf_options_page()->get_pages();
	
	
	// bail early if no pages
	if( empty($pages) ) return false;
	
	
	// apply filter to each page
	foreach( $pages as $slug => &$page ) {
		
		$page = acf_get_options_page( $slug );
	
	}
	
	
	// calculate parent => child redirectes
	foreach( $pages as $slug => &$page ) {
			
		// bail early if is child
		if( $page['parent_slug'] ) continue;
		
		
		// add missing position
		if( !$page['position']) {
			
			$_wp_last_utility_menu++;
			$page['position'] = $_wp_last_utility_menu;
			
		}
		
		
		// bail early if no redirect
		if( !$page['redirect'] ) continue;
		
		
		// vars
		$parent = $page['menu_slug'];
		$child = '';
		
		
		// update children
		foreach( $pages as &$sub_page ) {
			
			// bail early if not child of this parent
			if( $sub_page['parent_slug'] !== $parent ) continue;
			
			
			// set child (only once)
			if( !$child ) {
				$child = $sub_page['menu_slug'];
			}
			
			
			// update parent_slug to the first child
			$sub_page['parent_slug'] = $child;
			
		}
		
		
		// finally update parent menu_slug
		if( $child ) {
			$page['menu_slug'] = $child;
		}
		
	}	
	
	
	// filter
	$pages = apply_filters('acf/get_options_pages', $pages);
	
	
	// return
	return $pages;
	
}

endif;


/*
*  acf_set_options_page_title
*
*  This function is used to customize the options page admin menu title
*
*  @type	function
*  @date	13/07/13
*  @since	4.0.0
*
*  @param	$title (string)
*  @return	n/a
*/

if( ! function_exists('acf_set_options_page_title') ):

function acf_set_options_page_title( $title = 'Options' ) {
	
	acf_update_options_page('acf-options', array(
		'page_title'	=> $title,
		'menu_title'	=> $title
	));
	
}

endif;


/*
*  acf_set_options_page_menu
*
*  This function is used to customize the options page admin menu name
*
*  @type	function
*  @date	13/07/13
*  @since	4.0.0
*
*  @param	$title (string)
*  @return	n/a
*/

if( ! function_exists('acf_set_options_page_menu') ):

function acf_set_options_page_menu( $title = 'Options' ) {
	
	acf_update_options_page('acf-options', array(
		'menu_title'	=> $title
	));
	
}

endif;


/*
*  acf_set_options_page_capability
*
*  This function is used to customize the options page capability. Defaults to 'edit_posts'
*
*  @type	function
*  @date	13/07/13
*  @since	4.0.0
*
*  @param	$title (string)
*  @return	n/a
*/

if( ! function_exists('acf_set_options_page_capability') ):

function acf_set_options_page_capability( $capability = 'edit_posts' ) {
	
	acf_update_options_page('acf-options', array(
		'capability'	=> $capability
	));
	
}

endif;


/*
*  register_options_page()
*
*  This is an old function which is now referencing the new 'acf_add_options_sub_page' function
*
*  @type	function
*  @since	3.0.0
*  @date	29/01/13
*
*  @param	{string}	$title
*  @return	N/A
*/

if( ! function_exists('register_options_page') ):

function register_options_page( $page = '' ) {

	acf_add_options_sub_page( $page );
	
}

endif;

?>