Current File : /home/digitaw/www/wp-content/plugins/simple-history/dropins/class-tools-menu-dropin.php
<?php
namespace Simple_History\Dropins;

use Simple_History\Simple_History;
use Simple_History\Helpers;
use Simple_History\Menu_Page;
use Simple_History\Services\Admin_Pages;

/**
 * Dropin Name: Tools Menu
 * Dropin Description: Adds the Export & Tools menu page with tabbed interface for various tools
 * Dropin URI: https://simple-history.com/
 * Author: Pär Thernström
 */
class Tools_Menu_Dropin extends Dropin {
	/** @var string Slug for the tools menu. */
	const MENU_SLUG = 'simple_history_tools';

	/** @var string Slug for the main tools tab. */
	const TOOLS_TAB_SLUG = 'simple_history_tools_tab_main';

	/** @var Menu_Page|null The main Tools tab menu page object. */
	private static $tools_main_tab = null;

	/**
	 * @inheritdoc
	 */
	public function loaded() {
		add_action( 'admin_menu', array( $this, 'add_menu' ), 25 );
		add_action( 'admin_menu', array( $this, 'add_tools_tabs' ), 26 );
		// Hook very early to redirect before WordPress processes the admin page.
		add_action( 'admin_init', array( $this, 'redirect_old_export_url' ), 0 );
	}

	/**
	 * Add Tools menu page.
	 */
	public function add_menu() {
		if ( ! Helpers::setting_show_as_menu_page() ) {
			return;
		}

		// Add page using new menu manager.
		$admin_page_location = Helpers::get_menu_page_location();

		$tools_menu_page = ( new Menu_Page() )
			->set_page_title( _x( 'Simple History Export & Tools', 'tools page title', 'simple-history' ) )
			->set_menu_slug( self::MENU_SLUG )
			->set_callback( [ $this, 'output_tools_page' ] )
			->set_icon( 'build' )
			->set_order( 3 )
			->set_redirect_to_first_child_on_load();

		// Set different options depending on location.
		if ( in_array( $admin_page_location, [ 'top', 'bottom' ], true ) ) {
			$tools_menu_page
				->set_menu_title( _x( 'Export & Tools', 'tools menu name', 'simple-history' ) )
				->set_parent( Simple_History::MENU_PAGE_SLUG )
				->set_location( 'submenu' );
		} elseif ( in_array( $admin_page_location, [ 'inside_dashboard', 'inside_tools' ], true ) ) {
			// If main page is shown as child to tools or dashboard then tools page is shown as a tab on the settings page.
			$tools_menu_page
				->set_menu_title( _x( 'Export & Tools', 'tools menu name', 'simple-history' ) )
				->set_parent( Simple_History::SETTINGS_MENU_PAGE_SLUG );
		}

		$tools_menu_page->add();

		// Add a hidden redirect page for backwards compatibility with old Export URLs.
		// This prevents permission errors when accessing the old slug.
		// Using empty string instead of null to avoid PHP 8.x deprecation warnings.
		add_submenu_page(
			'', // Empty string parent makes it hidden from menus.
			'Export (Redirect)',
			'Export (Redirect)',
			Helpers::get_view_history_capability(), // phpcs:ignore WordPress.WP.Capabilities.Undetermined -- Filterable, defaults to 'read'.
			'simple_history_export_history',
			[ $this, 'redirect_old_export_url' ]
		);
	}

	/**
	 * Get the main Tools tab menu page object.
	 *
	 * @return Menu_Page|null
	 */
	public static function get_tools_main_tab() {
		return self::$tools_main_tab;
	}

	/**
	 * Add tabs to Tools menu.
	 */
	public function add_tools_tabs() {
		if ( ! Helpers::setting_show_as_menu_page() ) {
			return;
		}

		$admin_page_location = Helpers::get_menu_page_location();

		// Only add the intermediate "Tools" tab when location is 'top' or 'bottom'.
		// When inside dashboard/tools, subtabs are added directly to the Tools page.
		if ( in_array( $admin_page_location, [ 'top', 'bottom' ], true ) ) {
			// Add main "Tools" tab that will redirect to first subtab.
			self::$tools_main_tab = ( new Menu_Page() )
				->set_menu_slug( self::TOOLS_TAB_SLUG )
				->set_parent( self::MENU_SLUG )
				->set_redirect_to_first_child_on_load()
				->set_order( 1 )
				->add();

			// Add "Overview" subtab with welcome text.
			( new Menu_Page() )
				->set_menu_title( _x( 'Overview', 'tools overview subtab name', 'simple-history' ) )
				->set_page_title( _x( 'Tools Overview', 'tools overview subtab title', 'simple-history' ) )
				->set_menu_slug( 'simple_history_tools_subtab_overview' )
				->set_parent( self::$tools_main_tab )
				->set_callback( [ $this, 'output_tools_intro' ] )
				->set_order( 1 )
				->add();
		} else {
			// When inside dashboard/tools, add subtabs directly to the Tools menu page.
			( new Menu_Page() )
				->set_menu_title( _x( 'Overview', 'tools overview subtab name', 'simple-history' ) )
				->set_page_title( _x( 'Tools Overview', 'tools overview subtab title', 'simple-history' ) )
				->set_menu_slug( 'simple_history_tools_subtab_overview' )
				->set_parent( self::MENU_SLUG )
				->set_callback( [ $this, 'output_tools_intro' ] )
				->set_order( 1 )
				->add();
		}
	}

	/**
	 * Output for the Tools intro subtab.
	 */
	public function output_tools_intro() {
		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
		echo Admin_Pages::header_output();
		?>
		<div class="wrap">
			<?php
			echo wp_kses(
				Helpers::get_settings_section_title_output(
					__( 'Tools Overview', 'simple-history' ),
					'dashboard'
				),
				array(
					'span' => array(
						'class' => array(),
					),
				)
			);
			?>

			<p><?php echo esc_html_x( 'Here you can access various tools to manage and work with your history data.', 'tools intro', 'simple-history' ); ?></p>

			<h3><?php echo esc_html__( 'Available Tools', 'simple-history' ); ?></h3>
			<ul>
				<li><strong><?php echo esc_html__( 'Export', 'simple-history' ); ?></strong> - <?php echo esc_html__( 'Export your history data to CSV, JSON, or HTML format.', 'simple-history' ); ?></li>
				<li><strong><?php echo esc_html__( 'Backfill', 'simple-history' ); ?></strong> - <?php echo esc_html__( 'Generate history entries from existing WordPress data like posts, pages, and users.', 'simple-history' ); ?></li>
			</ul>
		</div>
		<?php
	}

	/**
	 * Output for the tools page.
	 * This will automatically redirect to the first child tab.
	 * This callback should rarely be called due to redirect_to_first_child_on_load().
	 */
	public function output_tools_page() {
		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
		echo Admin_Pages::header_output();
		// No content needed here - redirect_to_first_child_on_load() should handle navigation.
	}

	/**
	 * Redirect old Export menu URLs to new Tools > Tools tab > Export subtab.
	 * Provides backwards compatibility for bookmarks and old links.
	 * Used as both an admin_init hook and a page callback for the hidden redirect page.
	 */
	public function redirect_old_export_url() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Safe: nonce not required for this redirect.
		$page = sanitize_key( wp_unslash( $_GET['page'] ?? '' ) );

		// Check for old export page slug.
		if ( $page === 'simple_history_export_history' ) {
			$new_url = admin_url( 'admin.php?page=' . self::MENU_SLUG . '&selected-tab=' . self::TOOLS_TAB_SLUG . '&selected-sub-tab=simple_history_tools_export' );
			wp_safe_redirect( $new_url );
			exit;
		}
	}
}