<?php

/**
 * Admin menu controller for Types.
 *
 * All Types pages, menus, submenus and whatnot need to be registered here. One of the main goals is to avoid
 * loading specific page controllers unless their page is actually being loaded. All page slugs in Types *must*
 * be defined here as constants PAGE_NAME_*.
 *
 * @since 2.0
 */
final class Types_Admin_Menu {

	/** Temporary slug compatible with the legacy code. */
	const MENU_SLUG = 'wpcf';


	// All (non-legacy) page slugs.
	const PAGE_NAME_FIELD_CONTROL = 'types-field-control';
	const PAGE_NAME_HELPER        = 'types-helper'; // hidden page
	const PAGE_NAME_DASHBOARD     = 'types-dashboard';


	private static $instance;


	public static function get_instance() {
		if( null == self::$instance ) {
			self::$instance = new self();
		}
		return self::$instance;
	}


	public static function initialize() {
		self::get_instance();
	}



	private function __construct() {
		// Priority is hardcoded by filter documentation.
		add_filter( 'toolset_filter_register_menu_pages', array( $this, 'on_admin_menu' ), 10 );

		// Load Dashboard
		Types_Page_Dashboard::get_instance();
	}


	private function __clone() { }


	/**
	 * Add all Types submenus and jumpstart a specific page controller if needed.
	 *
	 * Toolset shared menu usage is described here:
	 * @link https://git.onthegosystems.com/toolset/toolset-common/wikis/toolset-shared-menu
	 *
	 * @param array $pages Array of menu item definitions.
	 * @return array Updated item definition array.
	 * @since 2.0
	 */
	public function on_admin_menu( $pages ) {
		// Add legacy pages
		$pages = wpcf_admin_toolset_register_menu_pages( $pages );

		$page_name = wpcf_getget( 'page' );
		if( !empty( $page_name ) ) {
			$pages = $this->maybe_add_ondemand_submenu( $pages, $page_name );
		}
		return $pages;
	}


	/**
	 * Check if an on-demand submenu should be added, and jumpstart it's controller if needed.
	 *
	 * On-demand submenu means that the submenu isn't displayed normally, it appears only when its page is loaded.
	 *
	 * Note: All page controllers should inherit from Types_Page_Abstract.
	 *
	 * @param array $pages Array of menu item definitions.
	 * @param string $page_name
	 * @return array Updated item definition array.
	 * @since 2.0
	 */
	private function maybe_add_ondemand_submenu( $pages, $page_name ) {
		$page = null;
		switch( $page_name ) {
			case self::PAGE_NAME_FIELD_CONTROL:
				$page = Types_Page_Field_Control::get_instance();
				break;
			case self::PAGE_NAME_HELPER:
				Types_Page_Hidden_Helper::get_instance();
				break;
		}

		if( $page instanceof Types_Page_Abstract ) {

			// Jumpstart the page controller.
			try {
				$page->prepare();
			} catch( Exception $e ) {
				wp_die( $e->getMessage() );
			}

			$pages[ $page_name ] = array(
				'slug' => $page_name,
				'menu_title' => $page->get_title(),
				'page_title' => $page->get_title(),
				'callback' => $page->get_render_callback(),
				'load_hook' => $page->get_load_callback(),
				'capability' => $page->get_required_capability(),
				'contextual_help_hook' => array( Types_Asset_Help_Tab_Loader::get_instance(), 'add_help_tab' )
			);

			// todo we might need to handle adding URL parameters to submenu URLs in some standard way, it's common scenario for ondemand submenus

		}

		return $pages;
	}

}