<?php
/**
 * MainWP Deprecated Hooks
 *
 * Init mainwp deprecated hooks
 *
 * @package     MainWP/Dashboard
 */

namespace MainWP\Dashboard;

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

/**
 * Class MainWP_Deprecated_Hooks
 *
 * @package MainWP\Dashboard
 */
class MainWP_Deprecated_Hooks { // phpcs:ignore Generic.Classes.OpeningBraceSameLine.ContentAfterBrace -- NOSONAR.

    /**
     * Protected static variable to hold the single instance of the class.
     *
     * @static
     *
     * @var mixed Default null
     */
    protected static $instance = null;

    /**
     * Array of deprecated filters. Format of 'old' => 'new'.
     *
     * @var array
     */
    public $deprecated_filters = array(
        'mainwp-getsites'                  => 'mainwp_getsites',
        'mainwp-getdbsites'                => 'mainwp_getdbsites',
        'mainwp-getgroups'                 => 'mainwp_getgroups',
        'mainwp-activated-check'           => 'mainwp_activated_check',
        'mainwp-extension-available-check' => '',
        'mainwp-manager-getextensions'     => 'mainwp_manager_getextensions',
        'mainwp-extension-enabled-check'   => 'mainwp_extension_enabled_check',
    );

    /**
     * Array of deprecated actions. Format of 'old' => 'new'.
     *
     * @var array
     */
    public $deprecated_actions = array(
        'mainwp_activate_extention'    => 'mainwp_activate_extension',
        'mainwp_deactivate_extention'  => 'mainwp_deactivate_extension',
        'mainwp-pageheader-sites'      => 'mainwp_pageheader_sites',
        'mainwp-pagefooter-sites'      => 'mainwp_pagefooter_sites',
        'mainwp-pageheader-extensions' => 'mainwp_pageheader_extensions',
        'mainwp-pagefooter-extensions' => 'mainwp_pagefooter_extensions',
    );

    /**
     * Array of versions of deprecated hooks.
     *
     * @var array
     */
    public $deprecated_version = array(
        'mainwp-getsites'                  => '4.1',
        'mainwp-getdbsites'                => '4.1',
        'mainwp-activated'                 => '4.1',
        'mainwp-activated-check'           => '4.1',
        'mainwp-extension-available-check' => '4.1',
        'mainwp-getgroups'                 => '4.1',
        'mainwp-manager-getextensions'     => '4.1',
        'mainwp_activate_extention'        => '4.1',
        'mainwp_deactivate_extention'      => '4.1',
        'mainwp-extension-enabled-check'   => '4.1',
        'mainwp-pageheader-sites'          => '4.1',
        'mainwp-pagefooter-sites'          => '4.1',
        'mainwp-pageheader-extensions'     => '4.1',
        'mainwp-pagefooter-extensions'     => '4.1',
        'mainwp-pageheader-post'           => '4.1.5.1', // NOSONAR - no IP.
        'mainwp-pagefooter-post'           => '4.1.5.1', // NOSONAR - no IP.
        'mainwp-pageheader-page'           => '4.1.5.1', // NOSONAR - no IP.
    );

    /**
     * Method instance()
     *
     * @static
     * @return class instance
     */
    public static function instance() {
        if ( is_null( static::$instance ) ) {
            static::$instance = new self();
        }

        return static::$instance;
    }

    /**
     * MainWP_Deprecated_Hooks constructor.
     *
     * Run each time the class is called.
     */
    public function __construct() {
    }

    /**
     * Method get_class_name()
     *
     * Get Class Name.
     *
     * @return object
     */
    public static function get_class_name() {
        return __CLASS__;
    }

    /**
     * Get old hooks to map to replacement hook.
     *
     * @param  string $old_hook Old hook name.
     * @return array
     */
    public function get_replacement_hooks( $old_hook ) {
        if ( isset( $this->deprecated_filters[ $old_hook ] ) ) {
            return $this->deprecated_filters[ $old_hook ];
        }
        if ( isset( $this->deprecated_actions[ $old_hook ] ) ) {
            return $this->deprecated_actions[ $old_hook ];
        }
        return false;
    }

    /**
     * Get deprecated version.
     *
     * @param string $old_hook Old hook name.
     * @return string
     */
    protected function get_deprecated_version( $old_hook ) {
        return ! empty( $this->deprecated_version[ $old_hook ] ) ? $this->deprecated_version[ $old_hook ] : MAINWP_VERSION;
    }

    /**
     * If the filter is Deprecated, display a deprecated notice.
     */
    public static function maybe_handle_deprecated_hook() {
        $current_hook = current_filter();
        $new_hook     = static::instance()->get_replacement_hooks( $current_hook );
        if ( false !== $new_hook ) {
            static::instance()->deprecated_message( $current_hook, $new_hook );
        }
    }

    /**
     * Display a deprecated notice for old hooks.
     *
     * @param string $old_hook Old hook.
     * @param string $new_hook New hook.
     * @param string $message message.
     */
    public function deprecated_message( $old_hook, $new_hook, $message = null ) {
        $version = esc_html( $this->get_deprecated_version( $old_hook ) );

        $is_ajax = function_exists( 'wp_doing_ajax' ) ? wp_doing_ajax() : defined( 'DOING_AJAX' );

        // @codingStandardsIgnoreStart
        if ( $is_ajax ) {
            do_action( 'deprecated_hook_run', $old_hook, $new_hook, $version, $message );
            $log_string = "{$old_hook} is deprecated since version {$version}";
            $log_string .= $new_hook ? "! Use {$new_hook} instead." : ' with no alternative available.';
            error_log( $log_string );
        } else {
            _deprecated_hook( $old_hook, $version, $new_hook, $message );
        }
        // @codingStandardsIgnoreEnd
    }
}
