<?php
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}
use W3TC\Dispatcher;
// phpcs:disable WordPress.NamingConventions.PrefixAllGlobals
if ( ! class_exists( 'PPW_Cache_Services' ) ) {
	/**
	 * Class PPW_Free_Handle_Cache
	 */
	class PPW_Cache_Services {

		public function __construct() {
			if ( ! function_exists( 'is_plugin_active' ) ) {
				include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
			}
		}

		/**
		 * Handle cache for page/post have password type is role with Super Cache plugin
		 *
		 * @param $new_role_password
		 * @param $id
		 * @param $current_roles_password
		 * @param $current_global_passwords
		 * @deprecated
		 */
		function handle_cache_for_password_type_role_with_super_cache( $new_role_password, $id, $current_roles_password, $current_global_passwords ) {
			if ( ! is_plugin_active( 'wp-super-cache/wp-cache.php' ) ) {
				return;
			}

			if ( ! empty( $new_role_password ) ) {
				$uri = $this->get_uri_by_post_id( $id );
				global $cache_rejected_uri;
				if ( ! in_array( '/' . $uri, $cache_rejected_uri ) ) {
					$this->add_page_post_to_list_not_cache_for_super_cache( $id, $uri, $cache_rejected_uri );
				}
			} else {
				if ( ! empty( $current_global_passwords ) ) {
					return;
				}

				$result = array_values( $current_roles_password );
				$result = array_filter( $result, 'strlen' );
				if ( empty( $result ) ) {
					$this->remove_page_post_to_list_not_cache_for_super_cache( $id );
				}
			}
		}

		/**
		 * Handle cache for page/post have password type is global with Super Cache plugin
		 *
		 * @param $new_global_passwords
		 * @param $id
		 * @param $current_roles_password
		 * @deprecated
		 */
		function handle_cache_for_password_type_global_with_super_cache( $new_global_passwords, $id, $current_roles_password ) {
			if ( ! is_plugin_active( 'wp-super-cache/wp-cache.php' ) ) {
				return;
			}

			if ( ! empty( $new_global_passwords ) ) {
				$uri = $this->get_uri_by_post_id( $id );
				global $cache_rejected_uri;
				if ( ! in_array( '/' . $uri, $cache_rejected_uri ) ) {
					$this->add_page_post_to_list_not_cache_for_super_cache( $id, $uri, $cache_rejected_uri );
				}
			} else {
				$result = array_values( $current_roles_password );
				$result = array_filter( $result, 'strlen' );
				if ( empty( $result ) ) {
					$this->remove_page_post_to_list_not_cache_for_super_cache( $id );
				}
			}
		}

		/**
		 * Add page or post to list not cache of WP Super Cache plugin
		 *
		 * @param $post_id
		 * @param $uri
		 * @param $cache_rejected_uri
		 * @deprecated
		 */
		function add_page_post_to_list_not_cache_for_super_cache( $post_id, $uri, $cache_rejected_uri ) {
			// 1. Add URI to list not cache
			global $wp_cache_config_file;
			array_push( $cache_rejected_uri, '/' . $uri );
			$all_uri = array_map( function ( $key, $cache ) {
				return " $key => '$cache'";
			}, array_keys( $cache_rejected_uri ), $cache_rejected_uri );
			$all_uri = implode( ',', $all_uri );
			$text    = "array($all_uri )";
			wp_cache_replace_line( '^ *\$cache_rejected_uri', "\$cache_rejected_uri = $text;", $wp_cache_config_file );

			// 3. Clear cache by post_id
			wp_cache_post_edit( $post_id );
		}

		/**
		 * Remove page or post in list not cache of WP Super Cache plugin
		 *
		 * @param $post_id
		 * @deprecated
		 */
		function remove_page_post_to_list_not_cache_for_super_cache( $post_id ) {
			// 1. Get URI in permalink by post_id
			$uri = $this->get_uri_by_post_id( $post_id );
			$uri = '/' . $uri;

			// 2. Remove URI in list not cache
			global $cache_rejected_uri, $wp_cache_config_file;
			$cache_rejected_uri = array_unique( $cache_rejected_uri );
			if ( ( $key = array_search( $uri, $cache_rejected_uri ) ) !== false ) {
				unset( $cache_rejected_uri[ $key ] );
				$all_uri = array_map( function ( $key, $cache ) {
					return " $key => '$cache'";
				}, array_keys( $cache_rejected_uri ), $cache_rejected_uri );
				$all_uri = implode( ',', $all_uri );
				$text    = "array($all_uri )";
				wp_cache_replace_line( '^ *\$cache_rejected_uri', "\$cache_rejected_uri = $text;", $wp_cache_config_file );
			}
		}

		/**
		 * get URI by post_id
		 *
		 * @param $post_id
		 *
		 * @return string
		 * @deprecated
		 */
		function get_uri_by_post_id( $post_id ) {
			$permalink = get_permalink( $post_id );
			$parse_url = wp_parse_url( $permalink );
			$uri       = $parse_url['path'];
			$uri       = explode( '/', $uri );
			$uri       = ! empty( $uri[ count( $uri ) - 1 ] ) ? $uri[ count( $uri ) - 1 ] : $uri[ count( $uri ) - 2 ];

			return $uri;
		}

		/**
		 * Clear cache all page
		 * @deprecated
		 */
		function clear_cache_super_cache() {
			if ( ! is_plugin_active( 'wp-super-cache/wp-cache.php' ) ) {
				return;
			}

			if ( is_multisite() ) {
				wp_cache_clear_cache( get_current_blog_id() );
			} else {
				wp_cache_clear_cache();
			}
		}

		/**
		 * Check W3 Total Cache has config cookie group
		 *
		 * @return bool
		 */
		function check_has_config_w3_total_cache() {
			$config = Dispatcher::config();
			$groups = $config->get_array( 'pgcache.cookiegroups.groups' );
			if ( ! array_key_exists( 'password_protect_wordpress', $groups ) ) {
				return false;
			}

			if ( ! $groups['password_protect_wordpress']['enabled'] || $groups['password_protect_wordpress']['cache'] ) {
				return false;
			}

			$cookies = $groups['password_protect_wordpress']['cookies'];

			return in_array( 'pda_protect_password', $cookies ) && in_array( 'wp-postpass-role_*', $cookies );
		}

		/**
		 * Update cookie to option and modify htaccess file for WP Fastest Cache plugin
		 * @deprecated
		 */
		function custom_option_exclude_page_and_cookie_fastest_cache() {
			if ( ! is_plugin_active( 'wp-fastest-cache/wpFastestCache.php' ) ) {
				return;
			}

			$old_fastest   = get_option( "WpFastestCacheExclude" );
			$fastest_cache = new WpFastestCache();
			if ( $old_fastest ) {
				$old_fastest = json_decode( $old_fastest );
				$tmp1        = false;
				$tmp2_free   = false;
				foreach ( $old_fastest as $fast ) {
					if ( 'cookie' === $fast->type && 'contain' === $fast->prefix && 'pda_protect_password' === $fast->content ) {
						$tmp1 = true;
					}
					if ( 'cookie' === $fast->type && 'contain' === $fast->prefix && 'wp-postpass-role_' === $fast->content ) {
						$tmp2_free = true;
					}
				}
				if ( ! $tmp1 ) {
					array_push( $old_fastest, (object) array(
						'prefix'  => 'contain',
						'content' => 'pda_protect_password',
						'type'    => 'cookie'
					) );
				}
				if ( ! $tmp2_free ) {
					array_push( $old_fastest, (object) array(
						'prefix'  => 'contain',
						'content' => 'wp-goldpass-pagepost_',
						'type'    => 'cookie'
					) );
				}

				update_option( "WpFastestCacheExclude", json_encode( $old_fastest ) );
				$fastest_cache->modify_htaccess_for_exclude();
			} else {
				$ppwp_cookie = array(
					(object) array(
						'prefix'  => 'contain',
						'content' => 'pda_protect_password',
						'type'    => 'cookie'
					)
				);

				array_push( $ppwp_cookie, (object) array(
					'prefix'  => 'contain',
					'content' => 'wp-postpass-role_',
					'type'    => 'cookie'
				) );

				add_option( "WpFastestCacheExclude", json_encode( $ppwp_cookie ), '', "yes" );
				$fastest_cache->modify_htaccess_for_exclude();
			}
		}
	}
}
