<?php
/**
 * The admin-panel specific functionality of the plugin.
 *
 *
 * @since      1.0.0
 * @package    LiteSpeed_Cache
 * @subpackage LiteSpeed_Cache/admin
 * @author     LiteSpeed Technologies <info@litespeedtech.com>
 */
namespace LiteSpeed;

defined( 'WPINC' ) || exit;

class Admin extends Instance {
	const PAGE_EDIT_HTACCESS = 'litespeed-edit-htaccess';

	protected static $_instance;
	private $__cfg;// cfg instance
	private $display;

	/**
	 * Initialize the class and set its properties.
	 * Run in hook `after_setup_theme` when is_admin()
	 *
	 * @since    1.0.0
	 */
	protected function __construct() {
		// Define LSCWP_MU_PLUGIN if is mu-plugins
		if ( defined( 'WPMU_PLUGIN_DIR' ) && dirname( LSCWP_DIR ) == WPMU_PLUGIN_DIR ) {
			define( 'LSCWP_MU_PLUGIN', true );
		}

		// Additional litespeed assets on admin display
		// Also register menu
		$this->display = Admin_Display::get_instance();

		$this->__cfg = Conf::get_instance();

		// initialize admin actions
		add_action( 'admin_init', array( $this, 'admin_init' ) );
		// add link to plugin list page
		add_filter( 'plugin_action_links_' . LSCWP_BASENAME, array( $this->display, 'add_plugin_links' ) );

		if ( defined( 'LITESPEED_ON' ) ) {
			// register purge_all actions
			$purge_all_events = Conf::val( Base::O_PURGE_HOOK_ALL );

			// purge all on upgrade
			if ( Conf::val( Base::O_PURGE_ON_UPGRADE ) ) {
				$purge_all_events[] = 'upgrader_process_complete';
				$purge_all_events[] = 'admin_action_do-plugin-upgrade';
			}
			foreach ( $purge_all_events as $event ) {
				// Don't allow hook to update_option bcos purge_all will cause infinite loop of update_option
				if ( in_array( $event, array( 'update_option' ) ) ) {
					continue;
				}
				add_action( $event, __NAMESPACE__ . '\Purge::purge_all' );
			}
			// add_filter( 'upgrader_pre_download', 'Purge::filter_with_purge_all' );
		}
	}

	/**
	 * Callback that initializes the admin options for LiteSpeed Cache.
	 *
	 * @since 1.0.0
	 * @access public
	 */
	public function admin_init() {
		Control::set_nocache( 'Admin page' );

		$this->_proceed_admin_action();

		// Terminate if user doesn't have the access to settings
		if( is_network_admin() ) {
			$capability = 'manage_network_options';
		}
		else {
			$capability = 'manage_options';
		}
		if ( ! current_user_can($capability) ) {
			return;
		}

		// Save setting from admin settings page
		// NOTE: cli will call `validate_plugin_settings` manually. Cron activation doesn't need to validate

		// Add privacy policy
		// @since 2.2.6
		if ( function_exists( 'wp_add_privacy_policy_content' ) ) {
			wp_add_privacy_policy_content( Core::PLUGIN_NAME, Doc::privacy_policy() );
		}

		do_action( 'litspeed_after_admin_init' );

		if ( Router::esi_enabled() ) {
			add_action( 'in_widget_form', array( $this->display, 'show_widget_edit' ), 100, 3 );
			add_filter( 'widget_update_callback', __NAMESPACE__ . '\Admin_Settings::validate_widget_save', 10, 4 );
		}
	}

	/**
	 * Run litespeed admin actions
	 *
	 * @since 1.1.0
	 */
	private function _proceed_admin_action() {
		// handle actions
		switch ( Router::get_action() ) {

			// Save htaccess
			case Router::ACTION_SAVE_HTACCESS:
				Htaccess::get_instance()->htaccess_editor_save();
				break;

			case Router::ACTION_SAVE_SETTINGS:
				Admin_Settings::get_instance()->save( $_POST );
				break;


			// Save network settings
			case Router::ACTION_SAVE_SETTINGS_NETWORK:
				Admin_Settings::get_instance()->network_save( $_POST );
				break;

			default:
				break;
		}

	}

	/**
	 * Clean up the input string of any extra slashes/spaces.
	 *
	 * @since 1.0.4
	 * @access public
	 * @param string $input The input string to clean.
	 * @return string The cleaned up input.
	 */
	public static function cleanup_text( $input ) {
		if ( is_array( $input ) ) {
			return array_map( __CLASS__ . '::cleanup_text', $input );
		}

		return stripslashes( trim( $input ) );
	}

	/**
	 * After a LSCWP_CTRL action, need to redirect back to the same page
	 * without the nonce and action in the query string.
	 *
	 * @since 1.0.12
	 * @access public
	 * @global string $pagenow
	 */
	public static function redirect( $url = false ) {
		global $pagenow;

		if ( ! empty( $_GET[ '_litespeed_ori' ] ) ) {
			wp_redirect( $_SERVER[ 'HTTP_REFERER' ] );
			exit;
		}

		$qs = '';
		if ( ! $url ) {
			if ( ! empty( $_GET ) ) {
				if ( isset( $_GET[ Router::ACTION ] ) ) {
					unset( $_GET[ Router::ACTION ] );
				}
				if ( isset( $_GET[ Router::NONCE ] ) ) {
					unset( $_GET[ Router::NONCE ] );
				}
				if ( isset( $_GET[ Router::TYPE ] ) ) {
					unset( $_GET[ Router::TYPE ] );
				}
				if ( isset( $_GET[ 'litespeed_i' ] ) ) {
					unset( $_GET[ 'litespeed_i' ] );
				}
				if ( ! empty( $_GET ) ) {
					$qs = '?' . http_build_query( $_GET );
				}
			}
			if ( is_network_admin() ) {
				$url = network_admin_url( $pagenow . $qs );
			}
			else {
				$url = admin_url( $pagenow . $qs );
			}
		}

		wp_redirect( $url );
		exit;
	}
}
