<?php
/**
 * Sensor: Yoast SEO
 *
 * Yoast SEO sensor file.
 *
 * @package Wsal
 * @since 3.2.0
 */

declare(strict_types=1);

namespace WSAL\WP_Sensors;

use WSAL\Controllers\Alert_Manager;
use WSAL\WP_Sensors\Helpers\Yoast_SEO_Helper;

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

/**
 * Support for Yoast SEO Plugin.
 *
 * @package Wsal
 * @subpackage Sensors
 */
if ( ! class_exists( '\WSAL\WP_Sensors\Yoast_SEO_Sensor' ) ) {

	/**
	 * The main sensor class.
	 */
	class Yoast_SEO_Sensor {

		/**
		 * Post ID.
		 *
		 * @var int
		 */
		private static $post_id = 0;

		/**
		 * Post Object.
		 *
		 * @var WP_Post
		 */
		private static $post;

		/**
		 * Possible scheme types and labels.
		 *
		 * @var array
		 */
		private static $schema_labels = array(
			'Article'                  => 'Article',
			'BlogPosting'              => 'Blog Post',
			'SocialMediaPosting'       => 'Social Media Posting',
			'NewsArticle'              => 'News Article',
			'AdvertiserContentArticle' => 'Advertiser Content Article',
			'SatiricalArticle'         => 'Satirical Article',
			'ScholarlyArticle'         => 'Scholarly Article',
			'TechArticle'              => 'Tech Article',
			'Report'                   => 'Report',
			'WebPage'                  => 'Web Page',
			'ItemPage'                 => 'Item Page',
			'AboutPage'                => 'About Page',
			'FAQPage'                  => 'FAQ Page',
			'QAPage'                   => 'QA Page',
			'ProfilePage'              => 'Profile Page',
			'ContactPage'              => 'Contact Page',
			'MedicalWebPage'           => 'Medical Web Page',
			'CollectionPage'           => 'Collection Page',
			'CheckoutPage'             => 'Checkout Page',
			'RealEstateListing'        => 'Real Estate Listing',
			'SearchResultsPage'        => 'Search Results Page',
			'_yoast_wpseo_bctitle'     => '',
		);

		/**
		 * Listening to events using hooks.
		 */
		public static function init() {
			if ( Yoast_SEO_Helper::is_wpseo_active() ) {
				// If user can edit post then hook this function.
				if ( current_user_can( 'edit_posts' ) ) {
					add_action( 'admin_init', array( __CLASS__, 'event_admin_init' ) );
				}

				// Yoast SEO option alerts.
				add_action( 'updated_option', array( __CLASS__, 'yoast_options_trigger' ), 10, 3 );

				// Yoast SEO Site option alerts.
				add_action( 'update_site_option', array( __CLASS__, 'yoast_site_options_trigger' ), 10, 3 );
			}
		}

		/**
		 * Loads all the plugin dependencies early.
		 *
		 * @return void
		 *
		 * @since 4.6.0
		 */
		public static function early_init() {
			add_filter(
				'wsal_event_objects',
				array( '\WSAL\WP_Sensors\Helpers\Yoast_SEO_Helper', 'wsal_yoast_seo_extension_add_custom_event_objects' )
			);

			if ( Yoast_SEO_Helper::is_wpseo_active() ) {
				// Yoast SEO blog option default change alerts.
				add_action(
					'add_option_wpseo',
					array( __CLASS__, 'yoast_blog_options_trigger' ),
					10,
					2
				);

				add_filter(
					'wsal_togglealerts_sub_category_events',
					array( '\WSAL\WP_Sensors\Helpers\Yoast_SEO_Helper', 'wsal_yoast_seo_extension_togglealerts_sub_category_events' )
				);

				add_filter(
					'wsal_togglealerts_sub_category_titles',
					array( '\WSAL\WP_Sensors\Helpers\Yoast_SEO_Helper', 'wsal_yoast_seo_extension_togglealerts_sub_category_titles' ),
					10,
					2
				);

				add_filter(
					'wsal_togglealerts_obsolete_events',
					array( '\WSAL\WP_Sensors\Helpers\Yoast_SEO_Helper', 'wsal_yoast_seo_extension_togglealerts_obsolete_events' )
				);
			}
		}

		/**
		 * Method: Admin Init Event.
		 */
		public static function event_admin_init() {
			// Check for settings change.
			self::check_seo_data_change();
		}

		/**
		 * Method: Get Post SEO Data.
		 *
		 * @param string $key – Meta Key.
		 * @return mixed
		 */
		private static function get_post_seo_data( $key = '' ) {
			// If empty key then return false.
			if ( empty( $key ) ) {
				return false;
			}

			return \WPSEO_Meta::get_value( $key, self::$post_id );
		}

		/**
		 * Get editor link.
		 *
		 * @param stdClass $post_id - Post id.
		 * @return array $editor_link - Name and value link.
		 */
		private static function get_editor_link( $post_id ) {
			$value       = get_edit_post_link( $post_id );
			$editor_link = array(
				'name'  => 'EditorLinkPost',
				'value' => $value,
			);
			return $editor_link;
		}

		/**
		 * Method: Detect Post SEO Data Change.
		 */
		private static function check_seo_data_change() {
			// Set filter input args.
			$filter_input_args = array(
				'post_ID'                          => FILTER_VALIDATE_INT,
				'yoast_wpseo_is_cornerstone'       => FILTER_VALIDATE_BOOLEAN,
				'yoast_wpseo_meta-robots-noindex'  => FILTER_VALIDATE_INT,
				'yoast_wpseo_meta-robots-nofollow' => FILTER_VALIDATE_INT,
				'yoast_wpseo_canonical'            => FILTER_VALIDATE_URL,
			);

			// Filter POST global array.
			$post_array = filter_input_array( INPUT_POST, $filter_input_args );

			if ( isset( $_POST['_wpnonce'] ) ) {
				$post_array['_wpnonce'] = \sanitize_text_field( \wp_unslash( $_POST['_wpnonce'] ) );
			}

			if ( isset( $_POST['action'] ) ) {
				$post_array['action'] = \sanitize_text_field( \wp_unslash( $_POST['action'] ) );
			}

			if ( isset( $_POST['yoast_wpseo_title'] ) ) {
				$post_array['yoast_wpseo_title'] = \sanitize_text_field( \wp_unslash( $_POST['yoast_wpseo_title'] ) );
			}

			if ( isset( $_POST['yoast_wpseo_metadesc'] ) ) {
				$post_array['yoast_wpseo_metadesc'] = \sanitize_text_field( \wp_unslash( $_POST['yoast_wpseo_metadesc'] ) );
			}

			if ( isset( $_POST['yoast_wpseo_focuskw'] ) ) {
				$post_array['yoast_wpseo_focuskw'] = \sanitize_text_field( \wp_unslash( $_POST['yoast_wpseo_focuskw'] ) );
			}

			if ( isset( $_POST['yoast_wpseo_meta-robots-adv'] ) ) {
				$post_array['yoast_wpseo_meta-robots-adv'] = \sanitize_text_field( \wp_unslash( $_POST['yoast_wpseo_meta-robots-adv'] ) );
			}

			if ( isset( $_POST['yoast_wpseo_schema_page_type'] ) ) {
				$post_array['yoast_wpseo_schema_page_type'] = \sanitize_text_field( \wp_unslash( $_POST['yoast_wpseo_schema_page_type'] ) );
			}

			if ( isset( $_POST['yoast_wpseo_schema_page_type'] ) ) {
				$post_array['yoast_wpseo_schema_page_type'] = \sanitize_text_field( \wp_unslash( $_POST['yoast_wpseo_schema_page_type'] ) );
			}

			if ( isset( $_POST['yoast_wpseo_schema_article_type'] ) ) {
				$post_array['yoast_wpseo_schema_article_type'] = \sanitize_text_field( \wp_unslash( $_POST['yoast_wpseo_schema_article_type'] ) );
			}

			if ( isset( $_POST['yoast_wpseo_bctitle'] ) ) {
				$post_array['yoast_wpseo_bctitle'] = \sanitize_text_field( \wp_unslash( $_POST['yoast_wpseo_bctitle'] ) );
			}

			if ( isset( $post_array['post_ID'] )
			&& 'editpost' === $post_array['action']
			&& isset( $post_array['_wpnonce'] )
			&& wp_verify_nonce( $post_array['_wpnonce'], 'update-post_' . $post_array['post_ID'] ) ) {
				self::$post_id = intval( $post_array['post_ID'] );
				self::$post    = get_post( self::$post_id );

				// Check SEO data changes and alert if changed.
				if ( isset( $post_array['yoast_wpseo_title'] ) ) {
					self::check_title_change( $post_array['yoast_wpseo_title'] ); // Title.
				}
				if ( isset( $post_array['yoast_wpseo_metadesc'] ) ) {
					self::check_desc_change( $post_array['yoast_wpseo_metadesc'] ); // Meta description.
				}
				if ( isset( $post_array['yoast_wpseo_meta-robots-noindex'] ) ) {
					self::check_robots_index_change( $post_array['yoast_wpseo_meta-robots-noindex'] ); // Meta Robots Index.
				}
				if ( isset( $post_array['yoast_wpseo_meta-robots-nofollow'] ) ) {
					self::check_robots_follow_change( $post_array['yoast_wpseo_meta-robots-nofollow'] ); // Meta Robots Follow.
				}
				if ( isset( $post_array['yoast_wpseo_meta-robots-adv'] ) ) {
					self::check_robots_advanced_change( $post_array['yoast_wpseo_meta-robots-adv'] ); // Meta Robots Advanced.
				}
				if ( isset( $post_array['yoast_wpseo_canonical'] ) ) {
					self::check_canonical_url_change( $post_array['yoast_wpseo_canonical'] ); // Canonical URL.
				}
				if ( isset( $post_array['yoast_wpseo_focuskw'] ) ) {
					self::check_focus_keys_change( $post_array['yoast_wpseo_focuskw'] ); // Focus keywords.
				}
				if ( isset( $post_array['yoast_wpseo_is_cornerstone'] ) ) {
					self::check_cornerstone_change( $post_array['yoast_wpseo_is_cornerstone'] ); // Cornerstone.
				}
				if ( isset( $post_array['yoast_wpseo_schema_page_type'] ) ) {
					self::check_schema_change( $post_array['yoast_wpseo_schema_page_type'], 'page_type' );
				}
				if ( isset( $post_array['yoast_wpseo_schema_article_type'] ) ) {
					self::check_schema_change( $post_array['yoast_wpseo_schema_article_type'], 'article_type' );
				}
				if ( isset( $post_array['yoast_wpseo_bctitle'] ) ) {
					self::check_breadcrumb_change( $post_array['yoast_wpseo_bctitle'] );
				}
			}
		}

		/**
		 * Method: Check SEO Title Change.
		 *
		 * @param string $title – Changed SEO Title.
		 */
		private static function check_title_change( $title ) {
			// Get old title value.

			$old_title = (string) self::get_post_seo_data( 'title' );
			$title     = (string) $title;

			// If old and new values are empty then don't log the alert.
			if ( empty( $old_title ) && empty( $title ) ) {
				return;
			}

			// Remove whitespaces at the ends of the titles.
			$old_title = trim( $old_title );
			$title     = trim( $title );

			// If title is changed then log alert.
			if ( $old_title !== $title ) {

				// Ensure default value is not passed as NULL.
				if ( ! empty( $old_title ) && empty( $title ) ) {
					if ( strpos( $old_title, '%%title%% %%page%% %%sep%% %%sitename%%' ) !== false ) {
						$title = '%%title%% %%page%% %%sep%% %%sitename%%';
					}
				}
				if ( empty( $old_title ) && ! empty( $title ) ) {
					if ( strpos( $title, '%%title%% %%page%% %%sep%% %%sitename%%' ) !== false ) {
						$old_title = '%%title%% %%page%% %%sep%% %%sitename%%';
					}
				}

				$editor_link = self::get_editor_link( self::$post_id );
				Alert_Manager::trigger_event(
					8801,
					array(
						'PostID'             => self::$post->ID,
						'PostType'           => self::$post->post_type,
						'PostTitle'          => self::$post->post_title,
						'PostStatus'         => self::$post->post_status,
						'PostDate'           => self::$post->post_date,
						'PostUrl'            => get_permalink( self::$post->ID ),
						'OldSEOTitle'        => $old_title,
						'NewSEOTitle'        => $title,
						$editor_link['name'] => $editor_link['value'],
					)
				);
			}
		}

		/**
		 * Method: Check SEO Meta Description Change.
		 *
		 * @param string $desc – Changed SEO Meta Description.
		 */
		private static function check_desc_change( $desc ) {
			// Get old desc value.
			$old_desc = esc_html( self::get_post_seo_data( 'metadesc' ) );
			$desc     = esc_html( $desc );

			// If old and new values are empty then don't log the alert.
			if ( empty( $old_desc ) && empty( $desc ) ) {
				return;
			}

			// If desc is changed then log alert.
			if ( trim( $old_desc ) !== trim( $desc ) ) {

				// Replace NULL with a nicer string.
				if ( empty( $old_desc ) ) {
					$old_desc = esc_html__( 'Not provided', 'wp-security-audit-log' );
				}

				$editor_link = self::get_editor_link( self::$post_id );
				Alert_Manager::trigger_event(
					8802,
					array(
						'PostID'             => self::$post->ID,
						'PostType'           => self::$post->post_type,
						'PostTitle'          => self::$post->post_title,
						'PostStatus'         => self::$post->post_status,
						'PostDate'           => self::$post->post_date,
						'PostUrl'            => get_permalink( self::$post->ID ),
						'old_desc'           => $old_desc,
						'new_desc'           => $desc,
						$editor_link['name'] => $editor_link['value'],
					)
				);
			}
		}

		/**
		 * Method: Check Meta Robots Index Change.
		 *
		 * @param string $index – Changed Meta Robots Index.
		 */
		private static function check_robots_index_change( $index ) {
			// Get old title value.
			$old_index = (int) self::get_post_seo_data( 'meta-robots-noindex' );

			if ( 1 === $old_index ) {
				$old_index = 'No';
			} else {
				$old_index = 'Yes';
			}

			if ( 1 === $index ) {
				$index = 'No';
			} else {
				$index = 'Yes';
			}

			// If setting is changed then log alert.
			if ( $old_index !== $index ) {
				$editor_link = self::get_editor_link( self::$post_id );
				Alert_Manager::trigger_event(
					8803,
					array(
						'PostID'             => self::$post->ID,
						'PostType'           => self::$post->post_type,
						'PostTitle'          => self::$post->post_title,
						'PostStatus'         => self::$post->post_status,
						'PostDate'           => self::$post->post_date,
						'PostUrl'            => get_permalink( self::$post->ID ),
						'OldStatus'          => $old_index,
						'NewStatus'          => $index,
						$editor_link['name'] => $editor_link['value'],
					)
				);
			}
		}

		/**
		 * Method: Check Meta Robots Follow Change.
		 *
		 * @param string $follow – Changed Meta Robots Follow.
		 */
		private static function check_robots_follow_change( $follow ) {
			// Get old title value.
			$old_follow = (int) self::get_post_seo_data( 'meta-robots-nofollow' );

			if ( 1 === $old_follow ) {
				$old_follow = 'disabled';
			} else {
				$old_follow = 'enabled';
			}

			if ( 1 === $follow ) {
				$follow = 'disabled';
			} else {
				$follow = 'enabled';
			}

			// If setting is changed then log alert.
			if ( $old_follow !== $follow ) {
				$editor_link = self::get_editor_link( self::$post_id );
				Alert_Manager::trigger_event(
					8804,
					array(
						'PostID'             => self::$post->ID,
						'PostType'           => self::$post->post_type,
						'PostTitle'          => self::$post->post_title,
						'PostStatus'         => self::$post->post_status,
						'PostDate'           => self::$post->post_date,
						'PostUrl'            => get_permalink( self::$post->ID ),
						'EventType'          => $follow,
						$editor_link['name'] => $editor_link['value'],
					)
				);
			}
		}

		/**
		 * Method: Check Meta Robots Advanced Change.
		 *
		 * @param array $advanced – Advanced array.
		 */
		private static function check_robots_advanced_change( $advanced ) {
			// Convert to string.
			if ( is_array( $advanced ) ) {
				$advanced = implode( ',', $advanced );
			}

			// Get old title value.
			$old_adv = self::get_post_seo_data( 'meta-robots-adv' );

			// If old and new values are empty then don't log the alert.
			if ( empty( $old_adv ) && ( empty( $advanced ) || '-' === $advanced ) ) {
				return;
			}

			// If setting is changed then log alert.
			if ( $old_adv !== $advanced ) {
				$editor_link = self::get_editor_link( self::$post_id );
				Alert_Manager::trigger_event(
					8805,
					array(
						'PostID'             => self::$post->ID,
						'PostType'           => self::$post->post_type,
						'PostTitle'          => self::$post->post_title,
						'PostStatus'         => self::$post->post_status,
						'PostDate'           => self::$post->post_date,
						'PostUrl'            => get_permalink( self::$post->ID ),
						'OldStatus'          => $old_adv,
						'NewStatus'          => $advanced,
						$editor_link['name'] => $editor_link['value'],
					)
				);
			}
		}

		/**
		 * Method: Check Canonical URL Change.
		 *
		 * @param string $canonical_url – Changed Canonical URL.
		 */
		private static function check_canonical_url_change( $canonical_url ) {
			// Get old title value.
			$old_url = self::get_post_seo_data( 'canonical' );

			// Check to see if both change value are empty.
			if ( empty( $old_url ) && empty( $canonical_url ) ) {
				return; // Return if both are empty.
			}

			// If title is changed then log alert.
			if ( $old_url !== $canonical_url ) {
				$editor_link = self::get_editor_link( self::$post_id );
				Alert_Manager::trigger_event(
					8806,
					array(
						'PostID'             => self::$post->ID,
						'PostType'           => self::$post->post_type,
						'PostTitle'          => self::$post->post_title,
						'PostStatus'         => self::$post->post_status,
						'PostDate'           => self::$post->post_date,
						'PostUrl'            => get_permalink( self::$post->ID ),
						'OldCanonicalUrl'    => $old_url,
						'NewCanonicalUrl'    => $canonical_url,
						$editor_link['name'] => $editor_link['value'],
					)
				);
			}
		}

		/**
		 * Method: Check Focus Keywords Change.
		 *
		 * @param string $focus_keys – Changed Focus Keywords.
		 */
		private static function check_focus_keys_change( $focus_keys ) {
			// Get old title value.
			$old_focus_keys = self::get_post_seo_data( 'focuskw' );

			// If old and new values are empty then don't log the alert.
			if ( empty( $old_focus_keys ) && empty( $focus_keys ) ) {
				return;
			}

			// If title is changed then log alert.
			if ( $old_focus_keys !== $focus_keys ) {

				// Replace NULL with a nicer string.
				if ( empty( $old_focus_keys ) ) {
					$old_focus_keys = esc_html__( 'Not provided', 'wp-security-audit-log' );
				}

				$editor_link = self::get_editor_link( self::$post_id );
				Alert_Manager::trigger_event(
					8807,
					array(
						'PostID'             => self::$post->ID,
						'PostType'           => self::$post->post_type,
						'PostTitle'          => self::$post->post_title,
						'PostStatus'         => self::$post->post_status,
						'PostDate'           => self::$post->post_date,
						'PostUrl'            => get_permalink( self::$post->ID ),
						'old_keywords'       => $old_focus_keys,
						'new_keywords'       => $focus_keys,
						$editor_link['name'] => $editor_link['value'],
					)
				);
			}
		}

		/**
		 * Method: Check Cornerstone Change.
		 *
		 * @param string $cornerstone – Changed Cornerstone.
		 */
		private static function check_cornerstone_change( $cornerstone ) {
			// Get old title value.
			$old_cornerstone = (int) self::get_post_seo_data( 'is_cornerstone' );
			$cornerstone     = (int) $cornerstone;

			if ( 1 === $cornerstone ) {
				$alert_status = 'enabled';
			} else {
				$alert_status = 'disabled';
			}

			// If setting is changed then log alert.
			if ( $old_cornerstone !== $cornerstone ) {
				$editor_link = self::get_editor_link( self::$post_id );
				Alert_Manager::trigger_event(
					8808,
					array(
						'PostID'             => self::$post->ID,
						'PostType'           => self::$post->post_type,
						'PostTitle'          => self::$post->post_title,
						'PostStatus'         => self::$post->post_status,
						'PostDate'           => self::$post->post_date,
						'PostUrl'            => get_permalink( self::$post->ID ),
						'EventType'          => $alert_status,
						$editor_link['name'] => $editor_link['value'],
					)
				);
			}
		}


		/**
		 * Method: Check Breadcrumb Change.
		 *
		 * @param string $breadcrumb – Changed Breadcrumb.
		 */
		private static function check_breadcrumb_change( $breadcrumb ) {
			// Get old title value.
			$old_breadcrumb = ( ! self::get_post_seo_data( 'bctitle' ) ) ? '' : self::get_post_seo_data( 'bctitle' );

			// If setting is changed then log alert.
			if ( $old_breadcrumb !== $breadcrumb ) {
				$editor_link = self::get_editor_link( self::$post_id );
				Alert_Manager::trigger_event(
					8850,
					array(
						'PostID'             => self::$post->ID,
						'PostType'           => self::$post->post_type,
						'PostTitle'          => self::$post->post_title,
						'PostStatus'         => self::$post->post_status,
						'PostDate'           => self::$post->post_date,
						'PostUrl'            => get_permalink( self::$post->ID ),
						'old_breadcrumb'     => $old_breadcrumb,
						'new_breadcrumb'     => $breadcrumb,
						$editor_link['name'] => $editor_link['value'],
					)
				);
			}
		}

		/**
		 * Method: Check Schema Change.
		 *
		 * @param string $schema – Changed Schema.
		 * @param string $type   – Page type.
		 */
		private static function check_schema_change( $schema, $type = 'page_type' ) {

			// Get old title value.
			$old_schema = ( 'page_type' === $type ) ? self::get_post_seo_data( 'schema_page_type' ) : self::get_post_seo_data( 'schema_article_type' );

			// If setting is changed then log alert.
			if ( $old_schema !== $schema ) {

				$event_code = ( 'page_type' === $type ) ? 8851 : 8852;

				$editor_link = self::get_editor_link( self::$post_id );
				Alert_Manager::trigger_event(
					$event_code,
					array(
						'PostID'             => self::$post->ID,
						'PostType'           => self::$post->post_type,
						'PostTitle'          => self::$post->post_title,
						'PostStatus'         => self::$post->post_status,
						'PostDate'           => self::$post->post_date,
						'PostUrl'            => get_permalink( self::$post->ID ),
						'old_type'           => ( $old_schema ) ? self::$schema_labels[ $old_schema ] : esc_html__( 'Default', 'wp-security-audit-log' ),
						'new_type'           => ( $schema ) ? self::$schema_labels[ $schema ] : esc_html__( 'Default', 'wp-security-audit-log' ),
						$editor_link['name'] => $editor_link['value'],
					)
				);
			}
		}

		/**
		 * Method: Yoast default blog options change trigger.
		 * Notes:
		 *    - To accomplish that, Yoast is taking the site, removes option (wpseo_ms) and sets the new one
		 *
		 *    @see Yoast-Network-Admin::handle_restore_site_request
		 *    - wp functions used do not triggering events @see WPSEO_Options::reset_ms_blog :
		 *    - delete_blog_option, update_blog_option
		 * Logic used here is - if add_option_wpseo is triggered (this method is called only then), and global $_POST is set with valid 'site_id' value and 'ms_defaults_set' (in $value parameter) == true - we know which site has been preset with the default options
		 *
		 * @param string $option – Option name.
		 * @param mixed  $value – Option old value.
		 */
		public static function yoast_blog_options_trigger( $option, $value ) {
			$site_id = ( isset( $_POST['wpseo_ms'] ) && ! empty( $_POST['wpseo_ms']['site_id'] ) ) ? (int) $_POST['wpseo_ms']['site_id'] : 0; // phpcs:ignore WordPress.Security.NonceVerification.Missing
			if ( $site_id && isset( $value['ms_defaults_set'] ) && true === $value['ms_defaults_set'] ) {
				self::yoast_setting_change_alert( 'site-default-options-change', $site_id, '' );
			}
		}

		/**
		 * Method: Yoast SEO options trigger.
		 *
		 * @param string $option – Option name.
		 * @param mixed  $old_value – Option old value.
		 * @param mixed  $new_value – Option new value.
		 */
		public static function yoast_site_options_trigger( $option, $old_value, $new_value ) {

			if ( 'wpseo_ms' === $option ) {

				$prefix_network = 'network-';
				$prefix_yoast   = 'allow_';

				$event_names = array(
					'keyword_analysis_active', // SEO analysis.
					'content_analysis_active', // Readability analysis.
					'enable_cornerstone_content', // Cornerstone Content.
					'enable_text_link_counter', // Text Link Counter.
					'enable_xml_sitemap', // XML Sitemaps.
					'enable_admin_bar_menu', // Admin bar menu.
					'disableadvanced_meta', // Advanced settings for authors.
					'tracking', // Usage tracking.
					'enable_headless_rest_endpoints', // REST enpoint.
					'enable_enhanced_slack_sharing', // Slack sharing.
				);

				foreach ( $event_names as $event_name ) {
					$yoast_name = $prefix_yoast . $event_name; // Yoast event names - starting with active-[YoastEventName].
					$wsal_name  = $prefix_network . $event_name; // internal use name - network-[YoastEventName].

					if ( isset( $old_value[ $yoast_name ] ) && isset( $new_value[ $yoast_name ] ) ) {
						if ( $old_value[ $yoast_name ] !== $new_value[ $yoast_name ] ) {

							$suffix = '-inactive';
							if ( ! $new_value[ $yoast_name ] ) {
								$suffix = '-active';
							}

							self::yoast_setting_switch_alert( $wsal_name . $suffix, $new_value[ $yoast_name ] );
						}
					}
				}
				if ( $old_value['access'] !== $new_value['access'] ) {
					self::yoast_setting_change_alert( 'site-access-change', $old_value['access'], $new_value['access'] );
				}
				// We are aware the variables are being fed in backwards here, however this appears to be the only way.
				// to get a reliable outcome. Issue https://github.com/WPWhiteSecurity/activity-log-yoast-seo/issues/63.
				if ( $old_value['defaultblog'] !== $new_value['defaultblog'] ) {
					self::yoast_setting_change_alert( 'site-default-seo-inherit-change', $new_value['defaultblog'], $old_value['defaultblog'] );
				}
			}
		}

		/**
		 * Method: Yoast SEO options trigger.
		 *
		 * @param string $option – Option name.
		 * @param mixed  $old_value – Option old value.
		 * @param mixed  $new_value – Option new value.
		 */
		public static function yoast_options_trigger( $option, $old_value, $new_value ) {

			// Detect the SEO option.
			if ( 'wpseo_titles' === $option || 'wpseo' === $option || 'wpseo_social' === $option ) {
				// WPSEO Title Alerts.
				if ( 'wpseo_titles' === $option ) {
					// Redirect attachment URLs to the attachment itself.
					if ( $old_value['disable-attachment'] !== $new_value['disable-attachment'] ) {
						self::yoast_setting_change_alert( 'disable-attachment', $old_value['disable-attachment'], $new_value['disable-attachment'] );
					}
					// Title Separator.
					if ( $old_value['separator'] !== $new_value['separator'] ) {
						self::yoast_setting_change_alert( 'separator', $old_value['separator'], $new_value['separator'] );
					}

					// Homepage Title.
					if ( $old_value['title-home-wpseo'] !== $new_value['title-home-wpseo'] ) {
						self::yoast_setting_change_alert( 'title-home-wpseo', $old_value['title-home-wpseo'], $new_value['title-home-wpseo'] );
					}

					// Homepage Meta Description.
					if ( $old_value['metadesc-home-wpseo'] !== $new_value['metadesc-home-wpseo'] ) {
						self::yoast_setting_change_alert( 'metadesc-home-wpseo', $old_value['metadesc-home-wpseo'], $new_value['metadesc-home-wpseo'] );
					}

					// Company or Person.
					if ( $old_value['company_or_person'] !== $new_value['company_or_person'] ) {
						self::yoast_setting_change_alert( 'company_or_person', $old_value['company_or_person'], $new_value['company_or_person'] );
					}

					// Author Archives.
					if ( $old_value['disable-author'] !== $new_value['disable-author'] ) {
						self::yoast_setting_switch_alert( 'disable-author', $new_value['disable-author'] );
					}

					if ( $old_value['noindex-author-wpseo'] !== $new_value['noindex-author-wpseo'] ) {
						self::yoast_setting_switch_alert( 'noindex-author-wpseo', $new_value['noindex-author-wpseo'] );
					}

					if ( $old_value['title-author-wpseo'] !== $new_value['title-author-wpseo'] ) {
						self::yoast_setting_change_alert( 'title-author-wpseo', $old_value['title-author-wpseo'], $new_value['title-author-wpseo'] );
					}

					if ( $old_value['metadesc-author-wpseo'] !== $new_value['metadesc-author-wpseo'] ) {
						self::yoast_setting_change_alert( 'metadesc-author-wpseo', $old_value['metadesc-author-wpseo'], $new_value['metadesc-author-wpseo'] );
					}

					// Date Archives.
					if ( $old_value['disable-date'] !== $new_value['disable-date'] ) {
						self::yoast_setting_switch_alert( 'disable-date', $new_value['disable-date'] );
					}

					if ( $old_value['noindex-archive-wpseo'] !== $new_value['noindex-archive-wpseo'] ) {
						self::yoast_setting_switch_alert( 'noindex-archive-wpseo', $new_value['noindex-archive-wpseo'] );
					}

					if ( $old_value['title-archive-wpseo'] !== $new_value['title-archive-wpseo'] ) {
						self::yoast_setting_change_alert( 'title-archive-wpseo', $old_value['title-archive-wpseo'], $new_value['title-archive-wpseo'] );
					}

					if ( $old_value['metadesc-archive-wpseo'] !== $new_value['metadesc-archive-wpseo'] ) {
						self::yoast_setting_change_alert( 'metadesc-archive-wpseo', $old_value['metadesc-archive-wpseo'], $new_value['metadesc-archive-wpseo'] );
					}

					$schemas = array(
						'schema-page-type-post',
						'schema-article-type-post',
						'schema-page-type-page',
						'schema-article-type-page',
						'schema-page-type-attachment',
						'schema-article-type-attachment',
					);

					foreach ( $schemas as $schema ) {
						if ( $old_value[ $schema ] !== $new_value[ $schema ] ) {
							self::yoast_setting_change_alert( $schema, $old_value[ $schema ], $new_value[ $schema ] );
						}
					}

					// Get public post types.
					$post_types = get_post_types( array( 'public' => true ) );

					// For each post type check show, title, and description changes.
					foreach ( $post_types as $type ) {
						if ( isset( $old_value[ "noindex-$type" ] ) ) {
							// Show Post Type in search results.
							if ( $old_value[ "noindex-$type" ] !== $new_value[ "noindex-$type" ] ) {
								self::yoast_setting_switch_alert( "noindex-$type", $new_value[ "noindex-$type" ] );
							}

							// Post Type Title Template.
							if ( $old_value[ "title-$type" ] !== $new_value[ "title-$type" ] ) {
								self::yoast_setting_change_alert( "title-$type", $old_value[ "title-$type" ], $new_value[ "title-$type" ] );
							}

							// Post Type Meta Description Template.
							if ( $old_value[ "metadesc-$type" ] !== $new_value[ "metadesc-$type" ] ) {
								self::yoast_setting_change_alert( "metadesc-$type", $old_value[ "metadesc-$type" ], $new_value[ "metadesc-$type" ] );
							}

							// Show Meta box.
							if ( $old_value[ "display-metabox-pt-$type" ] !== $new_value[ "display-metabox-pt-$type" ] ) {
								self::yoast_setting_switch_alert( "display-metabox-pt-$type", $new_value[ "display-metabox-pt-$type" ] );
							}
						}
					}

					// Get taxonomy types.
					$taxonomy_types = get_taxonomies( array( 'public' => true ) );

					// Lets check each and see if anything has been changes.
					foreach ( $taxonomy_types as $type ) {
						if ( isset( $old_value[ "noindex-tax-$type" ] ) ) {
							// Show Post Type in search results.
							if ( $old_value[ "noindex-tax-$type" ] !== $new_value[ "noindex-tax-$type" ] ) {
								self::yoast_setting_switch_alert( "noindex-tax-$type", $new_value[ "noindex-tax-$type" ] );
							}

							// Post Type Title Template.
							if ( $old_value[ "title-tax-$type" ] !== $new_value[ "title-tax-$type" ] ) {
								self::yoast_setting_change_alert( "title-tax-$type", $old_value[ "title-tax-$type" ], $new_value[ "title-tax-$type" ] );
							}

							// Post Type Meta Description Template.
							if ( $old_value[ "metadesc-tax-$type" ] !== $new_value[ "metadesc-tax-$type" ] ) {
								self::yoast_setting_change_alert( "metadesc-tax-$type", $old_value[ "metadesc-tax-$type" ], $new_value[ "metadesc-tax-$type" ] );
							}

							// Show Meta box.
							if ( $old_value[ "display-metabox-tax-$type" ] !== $new_value[ "display-metabox-tax-$type" ] ) {
								self::yoast_setting_switch_alert( "display-metabox-tax-$type", $new_value[ "display-metabox-tax-$type" ] );
							}
						}
					}
				}

				// Webmaster URL alerts.
				if ( 'wpseo' === $option ) {
					// SEO analysis.
					if ( isset( $old_value['keyword_analysis_active'] ) && isset( $new_value['keyword_analysis_active'] ) ) {
						if ( $old_value['keyword_analysis_active'] !== $new_value['keyword_analysis_active'] ) {
							self::yoast_setting_switch_alert( 'keyword_analysis_active', $new_value['keyword_analysis_active'] );
						}
					}

					// Readability analysis.
					if ( isset( $old_value['content_analysis_active'] ) && isset( $new_value['content_analysis_active'] ) ) {
						if ( $old_value['content_analysis_active'] !== $new_value['content_analysis_active'] ) {
							self::yoast_setting_switch_alert( 'content_analysis_active', $new_value['content_analysis_active'] );
						}
					}

					// Cornerstone Content.
					if ( isset( $old_value['enable_cornerstone_content'] ) && isset( $new_value['enable_cornerstone_content'] ) ) {
						if ( $old_value['enable_cornerstone_content'] !== $new_value['enable_cornerstone_content'] ) {
							self::yoast_setting_switch_alert( 'enable_cornerstone_content', $new_value['enable_cornerstone_content'] );
						}
					}

					// Text Link Counter.
					if ( isset( $old_value['enable_text_link_counter'] ) && isset( $new_value['enable_text_link_counter'] ) ) {
						if ( $old_value['enable_text_link_counter'] !== $new_value['enable_text_link_counter'] ) {
							self::yoast_setting_switch_alert( 'enable_text_link_counter', $new_value['enable_text_link_counter'] );
						}
					}

					// XML Sitemaps.
					if ( isset( $old_value['enable_xml_sitemap'] ) && isset( $new_value['enable_xml_sitemap'] ) ) {
						if ( $old_value['enable_xml_sitemap'] !== $new_value['enable_xml_sitemap'] ) {
							self::yoast_setting_switch_alert( 'enable_xml_sitemap', $new_value['enable_xml_sitemap'] );
						}
					}

					/**
					 * Ryte integration.
					 *
					 * NOTE: Reenamed in yoast plugin v13.2.
					 *
					 * @see: https://github.com/Yoast/wordpress-seo/pull/14123
					 */
					$integrations = array(
						'semrush_integration_active',
						'zapier_integration_active',
						'algolia_integration_active',
						'wincher_integration_active',
						'ryte_indexability',
					);

					foreach ( $integrations as $integration ) {
						if ( $old_value[ $integration ] !== $new_value[ $integration ] ) {
							self::yoast_setting_switch_alert( $integration, $new_value[ $integration ] );
						}
					}

					// Admin bar menu.
					if ( isset( $old_value['enable_admin_bar_menu'] ) && isset( $new_value['enable_admin_bar_menu'] ) ) {
						if ( $old_value['enable_admin_bar_menu'] !== $new_value['enable_admin_bar_menu'] ) {
							self::yoast_setting_switch_alert( 'enable_admin_bar_menu', $new_value['enable_admin_bar_menu'] );
						}
					}

					// Advanced settings for authors.
					if ( isset( $old_value['disableadvanced_meta'] ) && isset( $new_value['disableadvanced_meta'] ) ) {
						if ( $old_value['disableadvanced_meta'] !== $new_value['disableadvanced_meta'] ) {
							self::yoast_setting_switch_alert( 'disableadvanced_meta', $new_value['disableadvanced_meta'] );
						}
					}

					// Usage tracking.
					if ( isset( $old_value['tracking'] ) && isset( $new_value['tracking'] ) ) {
						if ( $old_value['tracking'] !== $new_value['tracking'] ) {
							self::yoast_setting_switch_alert( 'tracking', $new_value['tracking'] );
						}
					}

					// REST enpoint.
					if ( isset( $old_value['enable_headless_rest_endpoints'] ) && isset( $new_value['enable_headless_rest_endpoints'] ) ) {
						if ( $old_value['enable_headless_rest_endpoints'] !== $new_value['enable_headless_rest_endpoints'] ) {
							self::yoast_setting_switch_alert( 'enable_headless_rest_endpoints', $new_value['enable_headless_rest_endpoints'] );
						}
					}
					$search_engines = array(
						'baiduverify',
						'googleverify',
						'msverify',
						'yandexverify',
					);

					foreach ( $search_engines as $search_engine ) {
						if ( $old_value[ $search_engine ] !== $new_value[ $search_engine ] ) {
							self::yoast_setting_change_alert( $search_engine, $old_value[ $search_engine ], $new_value[ $search_engine ] );
						}
					}
				}

				// Social profile alerts.
				if ( 'wpseo_social' === $option ) {
					self::yoast_social_profile_setting_change_alert( $old_value, $new_value );
				}
			}

			if ( 'wpseo-premium-redirects-export-plain' === $option ) {
				self::yoast_redirects_change_alert( $option, $old_value, $new_value, 'plain' );
			} elseif ( 'wpseo-premium-redirects-export-regex' === $option ) {
				self::yoast_redirects_change_alert( $option, $old_value, $new_value, 'regex' );
			} elseif ( 'wpseo_redirect' === $option ) {
				self::yoast_redirects_system_change_alert( $option, $old_value, $new_value );
			}
		}

		/**
		 * Trigger an alert for redirect changes.
		 *
		 * @param string $option - Current option being changes.
		 * @param array  $old_value - Old value.
		 * @param array  $new_value - new value.
		 * @return void
		 */
		private static function yoast_redirects_system_change_alert( $option, $old_value, $new_value ) {
			$alert_code = 8858;
			$alert_args = array(
				'new_method' => ( 'off' === $new_value['disable_php_redirect'] ) ? esc_html__( 'PHP', 'wp-security-audit-log' ) : esc_html__( 'Web server', 'wp-security-audit-log' ),
				'old_method' => ( 'off' === $old_value['disable_php_redirect'] ) ? esc_html__( 'PHP', 'wp-security-audit-log' ) : esc_html__( 'Web server', 'wp-security-audit-log' ),
			);
			Alert_Manager::trigger_event( $alert_code, $alert_args );
		}

		/**
		 * Monitor and alert for changes related to Yoast redirects (Premium only)
		 *
		 * @param string $option - Option being changed.
		 * @param array  $old_value - Old value.
		 * @param array  $new_value - New Value.
		 * @param string $redirect_type - Redirection type.
		 *
		 * @return void
		 */
		private static function yoast_redirects_change_alert( $option, $old_value, $new_value, $redirect_type = 'plain' ) {
			$alert_args = null;
			$alert_code = null;
			$is_regex   = ( 'regex' === $redirect_type ) ? true : false;

			if ( count( $old_value ) !== count( $new_value ) ) {

				$compare_added_items = array_diff_assoc(
					array_map( 'serialize', $new_value ),
					array_map( 'serialize', $old_value )
				);
				$added_items         = array_map( 'unserialize', $compare_added_items );

				$compare_removed_items = array_diff_assoc(
					array_map( 'serialize', $old_value ),
					array_map( 'serialize', $new_value )
				);
				$removed_items         = array_map( 'unserialize', $compare_removed_items );

				if ( ! empty( $added_items ) ) {
					$alert_code                  = 8855;
					$alert_args['old_url']       = key( $added_items );
					$added_items                 = end( $added_items );
					$alert_args['new_url']       = ( isset( $added_items['url'] ) && ! empty( $added_items['url'] ) ) ? $added_items['url'] : esc_html__( 'Not applicable', 'wp-security-audit-log' );
					$alert_args['redirect_code'] = $added_items['type'];
					$alert_args['redirect_type'] = ( $is_regex ) ? 'regex' : 'plain';
				}

				if ( ! empty( $removed_items ) ) {
					$alert_code                  = 8857;
					$alert_args['old_url']       = key( $removed_items );
					$removed_items               = end( $removed_items );
					$alert_args['new_url']       = ( isset( $removed_items['url'] ) && ! empty( $added_items['url'] ) ) ? $removed_items['url'] : esc_html__( 'Not applicable', 'wp-security-audit-log' );
					$alert_args['redirect_code'] = $removed_items['type'];
					$alert_args['redirect_type'] = ( $is_regex ) ? 'regex' : 'plain';
				}
			}

			if ( count( $old_value ) === count( $new_value ) ) {
				$compare_modified_items = array_diff_assoc(
					array_map( 'serialize', $new_value ),
					array_map( 'serialize', $old_value )
				);
				$modified_items         = array_map( 'unserialize', $compare_modified_items );

				$compare_removed_items = array_diff_assoc(
					array_map( 'serialize', $old_value ),
					array_map( 'serialize', $new_value )
				);
				$removed_items         = array_map( 'unserialize', $compare_removed_items );

				if ( ! empty( $modified_items ) ) {
					$alert_code                      = 8856;
					$alert_args['redirect_type']     = ( $is_regex ) ? 'regex' : 'plain';
					$alert_args['old_url']           = ( key( $removed_items ) !== key( $modified_items ) ) ? key( $removed_items ) : esc_html__( 'Not applicable', 'wp-security-audit-log' );
					$alert_args['new_old_url']       = ( key( $modified_items ) !== key( $removed_items ) ) ? key( $modified_items ) : esc_html__( 'Not applicable', 'wp-security-audit-log' );
					$modified_items                  = end( $modified_items );
					$removed_items                   = end( $removed_items );
					$alert_args['old_new_url']       = ( isset( $removed_items['url'] ) && ! empty( $removed_items['url'] ) && $modified_items['url'] !== $removed_items['url'] ) ? $removed_items['url'] : esc_html__( 'Not applicable', 'wp-security-audit-log' );
					$alert_args['new_new_url']       = ( isset( $modified_items['url'] ) && ! empty( $added_items['url'] ) && $modified_items['url'] !== $removed_items['url'] ) ? $modified_items['url'] : esc_html__( 'Not applicable', 'wp-security-audit-log' );
					$alert_args['new_redirect_code'] = ( $removed_items['type'] !== $modified_items['type'] ) ? $modified_items['type'] : esc_html__( 'Not applicable', 'wp-security-audit-log' );
					$alert_args['old_redirect_code'] = ( $modified_items['type'] !== $removed_items['type'] ) ? $removed_items['type'] : esc_html__( 'Not applicable', 'wp-security-audit-log' );
				}
			}

			if ( ! empty( $alert_code ) ) {
				Alert_Manager::trigger_event( $alert_code, $alert_args );
			}
		}

		/**
		 * Method: Trigger Yoast Setting Change Alerts.
		 *
		 * @param string $key – Setting key.
		 * @param string $old_value – Old setting value.
		 * @param string $new_value – New setting value.
		 */
		private static function yoast_setting_change_alert( $key, $old_value, $new_value ) {
			// Return if key is empty.
			if ( empty( $key ) ) {
				return;
			}

			// Return if both old and new values are empty.
			if ( empty( $old_value ) && empty( $new_value ) ) {
				return;
			}

			// Alert arguments.
			$alert_args = array(
				'old' => $old_value, // Old value.
				'new' => $new_value, // New value.
			);

			// Find title-* in the key.
			if ( false !== strpos( $key, 'title-' ) ) {
				// Confirm if this is a taxonomy or not.
				if ( false !== strpos( $key, 'title-tax-' ) ) {
					$seo_post_type = self::create_tidy_name( $key );

					// Set alert meta data.
					$alert_args['SEOPostType'] = $seo_post_type;
				} elseif ( false !== strpos( $key, 'title-author-' ) || false !== strpos( $key, 'title-archive-' ) ) {
					$seo_post_type = self::create_tidy_name( $key );

					// Set alert meta data.
					$alert_args['archive_type'] = $seo_post_type;
				} else {
					$seo_post_type  = self::create_tidy_name( $key );
					$seo_post_type .= 's';

					// Set alert meta data.
					$alert_args['SEOPostType'] = $seo_post_type;
				}
			}

			// Find metadesc-* in the key.
			if ( false !== strpos( $key, 'metadesc-' ) ) {
				// Confirm if this is a taxonomy or not.
				if ( false !== strpos( $key, 'metadesc-tax-' ) ) {
					$seo_post_type = self::create_tidy_name( $key );
					// Set alert meta data.
					$alert_args['SEOPostType'] = $seo_post_type;
				} elseif ( false !== strpos( $key, 'metadesc-author-' ) || false !== strpos( $key, 'metadesc-archive-' ) ) {
					$seo_post_type  = self::create_tidy_name( $key );
					$seo_post_type .= 's';
					// Set alert meta data.
					$alert_args['archive_type'] = $seo_post_type;
				} else {
					$seo_post_type  = self::create_tidy_name( $key );
					$seo_post_type .= 's';

					// Set alert meta data.
					$alert_args['SEOPostType'] = $seo_post_type;
				}
			}

			// Set alert code to null initially.
			$alert_code = null;

			// Detect alert code for setting.
			switch ( $key ) {
				case 'separator':
					$alert_code = 8809;
					if ( class_exists( '\WPSEO_Option_Titles' ) ) {
						$titles               = \WPSEO_Option_Titles::get_instance();
						$available_seperators = $titles->get_separator_options();
						$alert_args['old']    = $available_seperators[ $alert_args['old'] ];
						$alert_args['new']    = $available_seperators[ $alert_args['new'] ];
					}
					break;

				case 'metadesc-archive-wpseo':
				case 'metadesc-author-wpseo':
					$alert_code = 8836;
					break;

				case 'company_or_person':
					$alert_code        = 8812;
					$alert_args['old'] = ucwords( $alert_args['old'] );
					$alert_args['new'] = ucwords( $alert_args['new'] );
					break;

				case strpos( $key, 'title-archive-' ):
				case strpos( $key, 'title-author-' ):
					$alert_code = 8835;
					break;

				case strpos( $key, 'title-tax-' ):
					$alert_code = 8831;
					break;

				case strpos( $key, 'title-' ):
					$alert_code = 8814;
					break;

				case strpos( $key, 'metadesc-tax-' ):
					$alert_code        = 8832;
					$alert_args['old'] = ( ! empty( $alert_args['old'] ) ) ? $alert_args['old'] : esc_html__( 'Not provided', 'wp-security-audit-log' );
					$alert_args['new'] = ( ! empty( $alert_args['new'] ) ) ? $alert_args['new'] : esc_html__( 'Not provided', 'wp-security-audit-log' );
					break;

				case strpos( $key, 'metadesc-' ):
					$alert_code        = 8822;
					$alert_args['old'] = ( ! empty( $alert_args['old'] ) ) ? $alert_args['old'] : esc_html__( 'Not provided', 'wp-security-audit-log' );
					$alert_args['new'] = ( ! empty( $alert_args['new'] ) ) ? $alert_args['new'] : esc_html__( 'Not provided', 'wp-security-audit-log' );
					break;

				case 'disable-attachment':
					$alert_code              = 8826;
					$alert_args['EventType'] = $new_value ? 'enabled' : 'disabled';
					break;

				case 'site-access-change':
					$alert_code        = 8838;
					$alert_args['old'] = ucwords( $alert_args['old'] );
					$alert_args['new'] = ucwords( $alert_args['new'] );
					break;

				case 'site-default-seo-inherit-change':
					$alert_code        = 8839;
					$alert_args['old'] = ( ! empty( $alert_args['old'] ) ) ? get_blog_details( $alert_args['old'] )->blogname : esc_html__( 'None', 'wp-security-audit-log' );
					$alert_args['new'] = ( ! empty( $alert_args['new'] ) ) ? get_blog_details( $alert_args['new'] )->blogname : esc_html__( 'None', 'wp-security-audit-log' );
					break;

				case 'site-default-options-change':
					$alert_code        = 8840;
					$alert_args['old'] = get_blog_details( $alert_args['old'] )->blogname . ' / ' . $alert_args['old'];
					$alert_args['new'] = '';
					break;

				case 'baiduverify':
				case 'googleverify':
				case 'msverify':
				case 'yandexverify':
					$alert_code                       = 8841;
					$alert_args['search_engine_type'] = ucwords( str_replace( 'verify', '', $key ) );

					if ( empty( $alert_args['old'] ) && ! empty( $alert_args['new'] ) ) {
						$event_type = 'added';
					} elseif ( empty( $alert_args['new'] ) && ! empty( $alert_args['old'] ) ) {
						$event_type = 'removed';
					} else {
						$event_type = 'modified';
					}

					$alert_args['EventType'] = $event_type;
					$alert_args['old']       = ( empty( $alert_args['old'] ) ) ? esc_html__( 'Not provided', 'wp-security-audit-log' ) : $alert_args['old'];
					$alert_args['new']       = ( empty( $alert_args['new'] ) ) ? esc_html__( 'Not provided', 'wp-security-audit-log' ) : $alert_args['new'];
					break;

				case 'schema-page-type-post':
				case 'schema-page-type-page':
				case 'schema-page-type-attachment':
					$alert_code                = 8853;
					$alert_args['SEOPostType'] = ucwords( str_replace( 'schema-page-type-', '', $key ) );
					$alert_args['old_type']    = ( $alert_args['old'] ) ? self::$schema_labels[ $alert_args['old'] ] : esc_html__( 'Default', 'wp-security-audit-log' );
					$alert_args['new_type']    = ( $alert_args['new'] ) ? self::$schema_labels[ $alert_args['new'] ] : esc_html__( 'Default', 'wp-security-audit-log' );
					break;

				case 'schema-article-type-page':
				case 'schema-article-type-post':
				case 'schema-article-type-attachment':
					$alert_code                = 8854;
					$alert_args['SEOPostType'] = ucwords( str_replace( 'schema-article-type-', '', $key ) );
					$alert_args['old_type']    = ( $alert_args['old'] ) ? self::$schema_labels[ $alert_args['old'] ] : esc_html__( 'Default', 'wp-security-audit-log' );
					$alert_args['new_type']    = ( $alert_args['new'] ) ? self::$schema_labels[ $alert_args['new'] ] : esc_html__( 'Default', 'wp-security-audit-log' );
					break;

				default:
					break;
			}

			// Trigger the alert.
			if ( ! empty( $alert_code ) ) {
				Alert_Manager::trigger_event( $alert_code, $alert_args );
			}
		}

		/**
		 * Method: Trigger Yoast Enable/Disable Setting Alerts.
		 *
		 * @param string $key ��� Setting index to alert.
		 * @param mixed  $new_value – Setting new value.
		 */
		private static function yoast_setting_switch_alert( $key, $new_value ) {
			// If key is empty, then return.
			if ( empty( $key ) ) {
				return;
			}

			// Check and set status.
			$status = (int) $new_value;

			// Alert arguments.
			$alert_args = array();

			// Find noindex-* in the key.
			if ( false !== strpos( $key, 'noindex-' ) ) {
				// Check if its a taxonomy setting.
				if ( false !== strpos( $key, 'noindex-tax-' ) ) {
					$seo_post_type = self::create_tidy_name( $key );
					// Set alert meta data.
					$alert_args['SEOPostType'] = $seo_post_type;
					$status                    = 1 === $status ? 0 : 1;
				} else {
					$seo_post_type = self::create_tidy_name( $key );

					// Set alert meta data.
					$alert_args['SEOPostType'] = $seo_post_type;
					$status                    = 1 === $status ? 0 : 1;
				}
			}

			// Find display-metabox-pt-* in the key.
			if ( false !== strpos( $key, 'display-metabox-tax-' ) ) {
				$seo_post_type = self::create_tidy_name( $key );

				// Set alert meta data.
				$alert_args['SEOPostType'] = $seo_post_type;
			} else {
				$seo_post_type = self::create_tidy_name( $key );

				// Set alert meta data.
				$alert_args['SEOPostType'] = $seo_post_type;
			}

			$alert_args['EventType'] = 1 === $status ? 'enabled' : 'disabled';

			// Find network-* in the key.
			if ( false !== strpos( $key, 'network-' ) ) {
				$event_key = substr( $key, strpos( $key, '-' ) + 1 );

				$event_key = substr( $event_key, 0, strrpos( $event_key, '-' ) );

				switch ( $event_key ) {
					default:
					case 'keyword_analysis_active':
						$feature_name = esc_html__( 'SEO Analysis', 'wp-security-audit-log' );
						break;
					case 'content_analysis_active':
						$feature_name = esc_html__( 'Readability Analysis', 'wp-security-audit-log' );
						break;
					case 'enable_cornerstone_content':
						$feature_name = esc_html__( 'Cornerstone content', 'wp-security-audit-log' );
						break;
					case 'enable_text_link_counter':
						$feature_name = esc_html__( 'Text link counter', 'wp-security-audit-log' );
						break;
					case 'enable_xml_sitemap':
						$feature_name = esc_html__( 'XML sitemap', 'wp-security-audit-log' );
						break;
					case 'enable_admin_bar_menu':
						$feature_name = esc_html__( 'Admin bar menu', 'wp-security-audit-log' );
						break;
					case 'disableadvanced_meta':
						$feature_name = esc_html__( 'Security: advanced or schema settings for authors', 'wp-security-audit-log' );
						break;
					case 'tracking':
						$feature_name = esc_html__( 'Usage tracking', 'wp-security-audit-log' );
						break;
					case 'enable_headless_rest_endpoints':
						$feature_name = esc_html__( 'REST API: Head endpoint', 'wp-security-audit-log' );
						break;
					case 'enable_enhanced_slack_sharing':
						$feature_name = esc_html__( 'Slack sharing', 'wp-security-audit-log' );
						break;
				}

				// Set alert meta data.
				$alert_args['feature_name'] = $feature_name;
				$alert_args['EventType']    = 1 === $status ? 'disabled' : 'enabled';
			}

			// Set alert code to NULL initially.
			$alert_code = null;

			// Add switch case to set the alert code.
			switch ( $key ) {
				case 'noindex-author-wpseo':
				case 'noindex-archive-wpseo':
					$alert_code   = 8834;
					$archive_type = self::create_tidy_name( $key );
					// If this is the "date archive" setting, update archive type to something more descriptive.
					if ( 'Archive' === $archive_type ) {
						$archive_type = esc_html__( 'Date', 'wp-security-audit-log' );
					}
					// Set alert meta data.
					$alert_args['archive_type'] = $archive_type;
					break;

				case strpos( $key, 'noindex-tax-' ):
					$alert_code = 8830;
					break;

				case strpos( $key, 'noindex-' ):
					$alert_code = 8813;
					break;

				case 'keyword_analysis_active':
					$alert_code = 8815;
					break;

				case 'content_analysis_active':
					$alert_code = 8816;
					break;

				case 'enable_cornerstone_content':
					$alert_code = 8817;
					break;

				case 'enable_text_link_counter':
					$alert_code = 8818;
					break;

				case 'enable_xml_sitemap':
					$alert_code = 8819;
					break;

				case ( false !== strpos( $key, 'network-' ) && false !== strpos( $key, '-inactive' ) ):
					$alert_code = 8842;
					break;

				case ( false !== strpos( $key, 'network-' ) && false !== strpos( $key, '-active' ) ):
					$alert_code = 8843;
					break;

				// renamed to ryte_integration. see: https://github.com/Yoast/wordpress-seo/pull/14123.
				case 'onpage_indexability':
				case 'ryte_indexability':
					$alert_code         = 8820;
					$alert_args['type'] = ucfirst( str_replace( '_indexability', '', $key ) );
					break;

				case 'semrush_integration_active':
				case 'zapier_integration_active':
				case 'algolia_integration_active':
				case 'wincher_integration_active':
					$alert_code         = 8820;
					$alert_args['type'] = ucfirst( str_replace( '_integration_active', '', $key ) );
					break;

				case 'enable_admin_bar_menu':
					$alert_code = 8821;
					break;

				case strpos( $key, 'display-metabox-pt-' ):
					$alert_code = 8824;
					break;

				case strpos( $key, 'display-metabox-tax-' ):
					$alert_code = 8837;
					// Avoid false reporting for post_format metabox.
					if ( 'display-metabox-tax-post_format' === $key ) {
						$alert_code = null;
					}
					break;

				case strpos( $key, 'disableadvanced_meta' ):
					$alert_code = 8825;
					break;

				case strpos( $key, 'tracking' ):
					$alert_code = 8827;
					break;

				case strpos( $key, 'enable_headless_rest_endpoints' ):
					$alert_code = 8828;
					break;

				case 'disable-author':
				case 'disable-date':
					$alert_code   = 8833;
					$archive_type = str_replace( 'disable-', '', $key );
					$archive_type = ucfirst( $archive_type );
					// Set alert meta data.
					$alert_args['archive_type'] = $archive_type;
					// Reverse logic for enabled/disabled.
					$alert_args['EventType'] = $new_value ? 'disabled' : 'enabled';
					break;

				default:
					break;
			}

			// Trigger the alert.
			if ( ! empty( $alert_code ) ) {
				Alert_Manager::trigger_event( $alert_code, $alert_args );
			}
		}

		/**
		 * Method: Trigger Yoast Social profile settings alerts.
		 *
		 * @param mixed $old_value – Setting old value.
		 * @param mixed $new_value – Setting new value.
		 */
		private static function yoast_social_profile_setting_change_alert( $old_value, $new_value ) {

			// Array of keys we want to look for.
			$profiles_to_monitor = array(
				'facebook_site',
				'instagram_url',
				'linkedin_url',
				'pinterest_url',
				'twitter_site',
				'youtube_url',
				'wikipedia_url',
			);

			foreach ( $old_value as $social_profile => $value ) {

				if ( in_array( $social_profile, $profiles_to_monitor, true ) && $old_value[ $social_profile ] !== $new_value[ $social_profile ] ) {
					$alert_code = 8829;
					$event_type = self::determine_social_event_type( $old_value[ $social_profile ], $new_value[ $social_profile ] );
					$alert_args = array(
						'social_profile' => ucwords( substr( $social_profile, 0, strpos( $social_profile, '_' ) ) ),
						'old_url'        => empty( $old_value[ $social_profile ] ) ? ' ' : $old_value[ $social_profile ], // The empty string is intentional.
						'new_url'        => empty( $new_value[ $social_profile ] ) ? ' ' : $new_value[ $social_profile ], // The empty string is intentional.
						'EventType'      => $event_type,
					);
					Alert_Manager::trigger_event( $alert_code, $alert_args );
				}
			}

			// Facebook social settings.
			if ( $new_value['opengraph'] !== $old_value['opengraph'] ) {
				$alert_code = 8844;
				$alert_args = array(
					'EventType' => ( ! $new_value['opengraph'] ) ? 'disabled' : 'enabled',
				);
				Alert_Manager::trigger_event( $alert_code, $alert_args );
			}

			if ( $new_value['og_default_image'] !== $old_value['og_default_image'] ) {
				$alert_code = 8845;
				$alert_args = array(
					'image_name' => ( empty( $new_value['og_default_image_id'] ) ) ? esc_html__( 'None supplied', 'wsal-yoast' ) : wp_basename( $new_value['og_default_image'] ),
					'image_path' => ( empty( $new_value['og_default_image'] ) ) ? esc_html__( 'None supplied', 'wsal-yoast' ) : dirname( $new_value['og_default_image'] ),
					'old_image'  => ( empty( $old_value['og_default_image'] ) ) ? esc_html__( 'None supplied', 'wsal-yoast' ) : wp_basename( $old_value['og_default_image'] ),
					'old_path'   => ( empty( $old_value['og_default_image'] ) ) ? esc_html__( 'None supplied', 'wsal-yoast' ) : dirname( $old_value['og_default_image'] ),
				);
				Alert_Manager::trigger_event( $alert_code, $alert_args );
			}

			if ( $new_value['twitter'] !== $old_value['twitter'] ) {
				$alert_code = 8846;
				$alert_args = array(
					'EventType' => ( ! $new_value['twitter'] ) ? 'disabled' : 'enabled',
				);
				Alert_Manager::trigger_event( $alert_code, $alert_args );
			}

			if ( $new_value['twitter_card_type'] !== $old_value['twitter_card_type'] ) {
				$alert_code = 8847;
				$alert_args = array(
					'new_setting' => $new_value['twitter_card_type'],
					'old_setting' => $old_value['twitter_card_type'],
				);
				Alert_Manager::trigger_event( $alert_code, $alert_args );
			}

			if ( $new_value['pinterestverify'] !== $old_value['pinterestverify'] ) {
				$alert_code = 8848;
				$alert_args = array(
					'new_value' => ( empty( $new_value['pinterestverify'] ) ) ? esc_html__( 'None supplied', 'wsal-yoast' ) : $new_value['pinterestverify'],
					'old_value' => ( empty( $old_value['pinterestverify'] ) ) ? esc_html__( 'None supplied', 'wsal-yoast' ) : $old_value['pinterestverify'],
				);
				Alert_Manager::trigger_event( $alert_code, $alert_args );
			}
		}

		/**
		 * Helper function to check if a profile was added, removed or modified.
		 *
		 * @param  string $old_value Old profile value.
		 * @param  string $new_value New profile value.
		 * @return string            Our determination of whats happened
		 */
		private static function determine_social_event_type( $old_value, $new_value ) {
			if ( ! empty( $old_value ) && empty( $new_value ) ) {
				return 'removed';
			} elseif ( empty( $old_value ) && ! empty( $new_value ) ) {
				return 'added';
			} else {
				return 'modified';
			}
		}

		/**
		 * Helper function to strip a string of any unwanted compontent.
		 *
		 * @param  string $text_to_strip String we want to work on.
		 * @return string $tidied_text   The actual string we want.
		 */
		private static function create_tidy_name( $text_to_strip ) {
			$tidied_text = null;

			// Array of string we want to look for.
			$strings_to_remove = array(
				'title-',
				'tax-',
				'-wpseo',
				'metadesc-',
				'noindex-',
				'display-',
				'metabox-',
				'pt-',
				'disable-',
			);

			if ( ! empty( $text_to_strip ) ) {
				$tidied_text = str_replace( $strings_to_remove, '', $text_to_strip );
				$tidied_text = ucfirst( $tidied_text );

				// If this is the "date archive" setting, update archive type to something more descriptive.
				if ( 'Archive' === $tidied_text ) {
					$tidied_text = esc_html__( 'Date', 'wp-security-audit-log' );
				}

				// If left unchanged, the alert reads "Categorys". The 's' is missing as its added later.
				if ( 'Category' === $tidied_text ) {
					$tidied_text = esc_html__( 'Categories', 'wp-security-audit-log' );
				}

				return $tidied_text;
			}
		}
	}
}
