<?php
/**
 * Responsible for managing recommendation ajax endpoints.
 *
 * @since 2.12.15
 * @package PRODDISP
 */

namespace PRODDISP\Ajax;

// If direct access than exit the file.
defined( 'ABSPATH' ) || exit;

/**
 * Responsible for fetching recommended products.
 *
 * @since 2.12.15
 */
class PRODDISP_RecommendedProducts {

	/**
	 * Class constructor.
	 *
	 * @since 2.12.15
	 */
	public function __construct() {
		add_action( 'wp_ajax_proddisp_fetch_recommendations', [ $this, 'fetch_all' ] );
	}

	/**
	 * Fetch products ajax endpoint.
	 *
	 * @since 2.12.15
	 */
	public function fetch_all() {

		if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['nonce'] ) ), 'proddisp_admin_nonce' ) ) {
			wp_send_json_error( array(
				'message' => __( 'Security check failed', 'product-display' ),
			) );
		}

		// Check if WooCommerce is active
		$is_woocommerce_active = class_exists( 'WooCommerce' ) || is_plugin_active( 'woocommerce/woocommerce.php' );

		// Create a unique transient key based on WooCommerce status
		$transient_key = 'proddisp_recommendations_' . ( $is_woocommerce_active ? 'woo' : 'no_woo' );

		// Try to get cached data
		$cached_data = get_transient( $transient_key );

		if ( false !== $cached_data ) {
			// Return cached data
			wp_send_json_success( $cached_data );
			wp_die();
		}

		// Get filtered products based on WooCommerce status
		ob_start();
		$this->get_other_products( $is_woocommerce_active );
		$plugin_cards_html = ob_get_clean();

		// Prepare header data based on WooCommerce status
		$header_data = [];

		if ( $is_woocommerce_active ) {
			$header_data['woocommerce'] = [
				'title' => '🚀 Transform Your WooCommerce Store Experience',
				'content' => 'Overcome slow WooCommerce performance and unlock powerful bulk management tools. Shop Explorer provides lightning-fast bulk operations for products, orders, and customers.',
			];
		}

		$header_data['security'] = [
			'title' => '🛡️ Advanced Security & Activity Monitoring',
			'content' => 'Protect your website from threats and monitor all activities with comprehensive security solutions. Activity Guard provides real-time activity logs, security monitoring, and threat detection.',
		];

		$header_data['forms'] = [
			'title' => '📝 Professional Form Builder & Integrations',
			'content' => 'Create stunning forms with drag-and-drop simplicity and powerful integrations. Simple Forms lets you build contact forms, surveys, polls, and quizzes with seamless connections to Telegram, WhatsApp, Mailchimp, Google Sheets, and more.',
		];

		$header_data['chat'] = [
			'title' => '🤖 AI-Powered Customer Support & Engagement',
			'content' => 'Transform your customer support with intelligent AI chat assistance. AskAny provides 24/7 automated customer support, helping visitors find answers instantly, reducing support workload, and improving user satisfaction with smart, contextual conversations.',
		];

		$header_data['general'] = [
			'title' => '🧩 Essential WordPress Enhancement Tools',
			'content' => 'Discover additional tools and plugins to enhance your WordPress experience with improved functionality, better performance, and enhanced user engagement.',
		];

		// Prepare response data
		$response_data = [
			'plugin_cards_html' => $plugin_cards_html,
			'is_woocommerce_active' => $is_woocommerce_active,
			'header_data' => $header_data,
		];

		// Cache the data for 1 day (DAY_IN_SECONDS = 86400)
		set_transient( $transient_key, $response_data, DAY_IN_SECONDS );

		// Return the HTML content and header data within the JSON response.
		wp_send_json_success( $response_data );
		wp_die();
	}

	/**
	 * Get products from plugins api.
	 *
	 * @since 2.12.15
	 * @param bool $is_woocommerce_active Whether WooCommerce is active or not.
	 */
	public static function get_other_products( $is_woocommerce_active = false ) {
		require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
		remove_all_filters( 'plugins_api' );

		$plugins_allowedtags = [
			'a'       => [
				'href'   => [],
				'title'  => [],
				'target' => [],
			],
			'abbr'    => [ 'title' => [] ],
			'acronym' => [ 'title' => [] ],
			'code'    => [],
			'pre'     => [],
			'em'      => [],
			'strong'  => [],
			'ul'      => [],
			'ol'      => [],
			'li'      => [],
			'p'       => [],
			'br'      => [],
		];

		$recommended_plugins = [];

		// Add WooCommerce plugins only if WooCommerce is active
		if ( $is_woocommerce_active ) {
			/* Shop Explorer WooCommerce Plugin */
			$args = [
				'slug'   => 'shop-explorer',
				'fields' => [
					'short_description' => true,
					'icons'             => true,
					'reviews'           => false, // Excludes all reviews.
				],
			];

			$data = plugins_api( 'plugin_information', $args );

			if ( $data && ! is_wp_error( $data ) ) {
				$recommended_plugins['shop-explorer']                    = $data;
				$recommended_plugins['shop-explorer']->name              = __( 'Shop Explorer – Powerful Bulk Tools and Smooth WooCommerce Management System', 'product-display' );
				$recommended_plugins['shop-explorer']->short_description = esc_html__( 'Powerful bulk tools and smooth management system for your WooCommerce store. Manage products efficiently with advanced bulk operations.', 'product-display' );
				$recommended_plugins['shop-explorer']->group = 'woocommerce';
			}

			/* Product Display for WooCommerce Plugin */
			$args = [
				'slug'   => 'product-display',
				'fields' => [
					'short_description' => true,
					'icons'             => true,
					'reviews'           => false, // Excludes all reviews.
				],
			];

			$data = plugins_api( 'plugin_information', $args );

			if ( $data && ! is_wp_error( $data ) ) {
				$recommended_plugins['product-display']                    = $data;
				$recommended_plugins['product-display']->name              = __( 'Product Display for WooCommerce', 'product-display' );
				$recommended_plugins['product-display']->short_description = esc_html__( 'Display your WooCommerce products beautifully with customizable layouts and advanced filtering options.', 'product-display' );
				$recommended_plugins['product-display']->group = 'woocommerce';
			}
		}

		/* Activity Guard Security Plugin */
		$args = [
			'slug'   => 'notifier-to-slack',
			'fields' => [
				'short_description' => true,
				'icons'             => true,
				'reviews'           => false, // Excludes all reviews.
			],
		];

		$data = plugins_api( 'plugin_information', $args );

		if ( $data && ! is_wp_error( $data ) ) {
			$recommended_plugins['notifier-to-slack']                    = $data;
			$recommended_plugins['notifier-to-slack']->name              = __( 'Activity Guard – Complete Security, Activity Log & WooCommerce Analytics Tracker', 'product-display' );
			$recommended_plugins['notifier-to-slack']->short_description = esc_html__( 'Complete security solution with activity logging and WooCommerce analytics tracking to keep your site safe and monitored.', 'product-display' );
			$recommended_plugins['notifier-to-slack']->group = 'security';
		}

		/* Simple Forms Plugin */
		$args = [
			'slug'   => 'simple-form',
			'fields' => [
				'short_description' => true,
				'icons'             => true,
				'reviews'           => false, // Excludes all reviews.
			],
		];

		$data = plugins_api( 'plugin_information', $args );

		if ( $data && ! is_wp_error( $data ) ) {
			$recommended_plugins['simple-form']                    = $data;
			$recommended_plugins['simple-form']->name              = __( 'Simple Forms — Drag and Drop Form Builder with Quizzes, Polls & Integrations', 'product-display' );
			$recommended_plugins['simple-form']->short_description = esc_html__( 'Create beautiful forms with drag and drop. Includes Telegram, WhatsApp, Mailchimp, and Google Sheets integrations.', 'product-display' );
			$recommended_plugins['simple-form']->group = 'forms';
		}

		/* AskAny AI Chat Assistant Plugin */
		$args = [
			'slug'   => 'askany',
			'fields' => [
				'short_description' => true,
				'icons'             => true,
				'reviews'           => false, // Excludes all reviews.
			],
		];

		$data = plugins_api( 'plugin_information', $args );
		if ( $data && ! is_wp_error( $data ) ) {
			$recommended_plugins['askany']                    = $data;
			$recommended_plugins['askany']->name              = __( 'AskAny – AI-Powered Chat Assistant', 'product-display' );
			$recommended_plugins['askany']->short_description = esc_html__( 'Add an AI-powered chat assistant to your website. Help visitors find answers and improve engagement with intelligent conversations.', 'product-display' );
			$recommended_plugins['askany']->group = 'chat';
		}

		// END Plugin list .

		$group = ''; // Initialize group variable

		foreach ( (array) $recommended_plugins as $plugin ) {
			if ( is_object( $plugin ) ) {
				$plugin = (array) $plugin;
			}

			// Display the group heading if there is one.
			if ( isset( $plugin['group'] ) && $plugin['group'] !== $group ) {

				$group_name = $plugin['group'];

				// Starting a new group, close off the divs of the last one.
				if ( ! empty( $group ) ) {
					echo '</div>';
				}

				echo '<div class="plugin-group"><h3>' . esc_html( $group_name ) . '</h3>';
				// Needs an extra wrapping div for nth-child selectors to work.
				echo '<div class="plugin-items">';

				$group = $plugin['group'];
			}
			$title = wp_kses( $plugin['name'], $plugins_allowedtags );

			// Remove any HTML from the description.
			$description = wp_strip_all_tags( $plugin['short_description'] );
			$version     = wp_kses( $plugin['version'], $plugins_allowedtags );

			$name = wp_strip_all_tags( $title . ' ' . $version );

			$author = wp_kses( $plugin['author'], $plugins_allowedtags );
			if ( ! empty( $author ) ) {
				/* translators: %s: Plugin author. */
				$author = ' <cite>' . sprintf( __( 'By %s' ), $author ) . '</cite>';
			}

			$requires_php = isset( $plugin['requires_php'] ) ? $plugin['requires_php'] : null;
			$requires_wp  = isset( $plugin['requires'] ) ? $plugin['requires'] : null;

			$compatible_php = is_php_version_compatible( $requires_php );
			$compatible_wp  = is_wp_version_compatible( $requires_wp );
			$tested_wp      = ( empty( $plugin['tested'] ) || version_compare( get_bloginfo( 'version' ), $plugin['tested'], '<=' ) );

			$action_links = [];

			if ( current_user_can( 'install_plugins' ) || current_user_can( 'update_plugins' ) ) {
				$status = install_plugin_install_status( $plugin );

				switch ( $status['status'] ) {
					case 'install':
						if ( $status['url'] ) {
							if ( $compatible_php && $compatible_wp ) {
								$action_links[] = sprintf(
									'<a class="install-now button" data-slug="%s" href="%s" aria-label="%s" data-name="%s">%s</a>',
									esc_attr( $plugin['slug'] ),
									esc_url( $status['url'] ),
									/* translators: %s: Plugin name and version. */
									esc_attr( sprintf( _x( 'Install %s now', 'plugin' ), $name ) ),
									esc_attr( $name ),
									__( 'Install Now' )
								);
							} else {
								$action_links[] = sprintf(
									'<button type="button" class="button button-disabled" disabled="disabled">%s</button>',
									_x( 'Cannot Install', 'plugin' )
								);
							}
						}
						break;

					case 'update_available':
						if ( $status['url'] ) {
							if ( $compatible_php && $compatible_wp ) {
								$action_links[] = sprintf(
									'<a class="update-now button aria-button-if-js" data-plugin="%s" data-slug="%s" href="%s" aria-label="%s" data-name="%s">%s</a>',
									esc_attr( $status['file'] ),
									esc_attr( $plugin['slug'] ),
									esc_url( $status['url'] ),
									/* translators: %s: Plugin name and version. */
									esc_attr( sprintf( _x( 'Update %s now', 'plugin' ), $name ) ),
									esc_attr( $name ),
									__( 'Update Now' )
								);
							} else {
								$action_links[] = sprintf(
									'<button type="button" class="button button-disabled" disabled="disabled">%s</button>',
									_x( 'Cannot Update', 'plugin' )
								);
							}
						}
						break;

					case 'latest_installed':
					case 'newer_installed':
						if ( is_plugin_active( $status['file'] ) ) {
							$action_links[] = sprintf(
								'<button type="button" class="button button-disabled" disabled="disabled">%s</button>',
								_x( 'Active', 'plugin' )
							);
						} elseif ( current_user_can( 'activate_plugin', $status['file'] ) ) {
							$button_text = esc_html__( 'Activate', 'product-display' );
							/* translators: %s: Plugin name. */
							$button_label = _x( 'Activate %s', 'plugin' );
							$activate_url = add_query_arg(
								[
									'_wpnonce' => wp_create_nonce( 'activate-plugin_' . $status['file'] ),
									'action'   => 'activate',
									'plugin'   => $status['file'],
								],
								network_admin_url( 'plugins.php' )
							);

							if ( is_network_admin() ) {
								$button_text = __( 'Network Activate' );
								/* translators: %s: Plugin name. */
								$button_label = _x( 'Network Activate %s', 'plugin' );
								$activate_url = add_query_arg( [ 'networkwide' => 1 ], $activate_url );
							}

							$action_links[] = sprintf(
								'<a href="%1$s" class="button activate-now" aria-label="%2$s">%3$s</a>',
								esc_url( $activate_url ),
								esc_attr( sprintf( $button_label, $plugin['name'] ) ),
								$button_text
							);
						} else {
							$action_links[] = sprintf(
								'<button type="button" class="button button-disabled" disabled="disabled">%s</button>',
								_x( 'Installed', 'plugin' )
							);
						}
						break;
				}
			}

			$details_link = esc_url( self_admin_url(
				'plugin-install.php?tab=plugin-information&amp;plugin=' . $plugin['slug']
				. '&amp;TB_iframe=true&amp;width=600&amp;height=550'
			) );

			$action_links[] = sprintf(
				'<a href="%s" class="thickbox open-plugin-details-modal" aria-label="%s" data-title="%s">%s</a>',
				esc_url( $details_link ),
				/* translators: %s: Plugin name and version. */
				esc_attr( sprintf( __( 'More information about %s' ), $name ) ),
				esc_attr( $name ),
				__( 'More Details' )
			);

			if ( ! empty( $plugin['icons']['svg'] ) ) {
				$plugin_icon_url = $plugin['icons']['svg'];
			} elseif ( ! empty( $plugin['icons']['2x'] ) ) {
				$plugin_icon_url = $plugin['icons']['2x'];
			} elseif ( ! empty( $plugin['icons']['1x'] ) ) {
				$plugin_icon_url = $plugin['icons']['1x'];
			} else {
				$plugin_icon_url = $plugin['icons']['default'];
			}

			/**
			 * Filters the install action links for a plugin.
			 *
			 * @param mixed $action_links An array of plugin action links. Defaults are links to Details and Install Now.
			 * @param array    $plugin       The plugin currently being listed.
			 */
			$action_links = apply_filters( 'plugin_install_action_links', $action_links, $plugin );

			$last_updated_timestamp = strtotime( $plugin['last_updated'] );
			?>
<div class="plugin-card plugin-card-<?php echo sanitize_html_class( $plugin['slug'] ); ?>">
			<?php
			if ( ! $compatible_php || ! $compatible_wp ) {
				echo '<div class="notice inline notice-error notice-alt"><p>';
				if ( ! $compatible_php && ! $compatible_wp ) {
					esc_html_e( 'This plugin doesn&#8217;t work with your versions of WordPress and PHP.' );
					if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
						printf(
							/* translators: 1: URL to WordPress Updates screen, 2: URL to Update PHP page. */
							' ' . wp_kses( '<a href="%1$s">Please update WordPress</a>, and then <a href="%2$s">learn more about updating PHP</a>.', [ 'a' => [ 'href' => '' ] ] ),
							esc_url( self_admin_url( 'update-core.php' ) ),
							esc_url( wp_get_update_php_url() )
						);
						wp_update_php_annotation( '</p><p><em>', '</em>' );
					} elseif ( current_user_can( 'update_core' ) ) {
						printf(
							/* translators: %s: URL to WordPress Updates screen. */
							' ' . wp_kses(
								'<a href="%s">Please update WordPress</a>.',
								[ 'a' => [ 'href' => '' ] ]
							),
							esc_url( self_admin_url( 'update-core.php' ) )
						);
					} elseif ( current_user_can( 'update_php' ) ) {
						printf(
							/* translators: %s: URL to Update PHP page. */
							' ' . wp_kses(
								'<a href="%s">Learn more about updating PHP</a>.',
								[ 'a' => [ 'href' => '' ] ]
							),
							esc_url( wp_get_update_php_url() )
						);
						wp_update_php_annotation( '</p><p><em>', '</em>' );
					}
				} elseif ( ! $compatible_wp ) {
					esc_html_e( 'This plugin doesn&#8217;t work with your version of WordPress.' );
					if ( current_user_can( 'update_core' ) ) {
						printf(
							/* translators: %s: URL to WordPress Updates screen. */
							' ' . wp_kses( '<a href="%s">Please update WordPress</a>.',
								[ 'a' => [ 'href' => '' ] ]
							),
							esc_url( self_admin_url( 'update-core.php' ) )
						);
					}
				} elseif ( ! $compatible_php ) {
					esc_html_e( 'This plugin doesn&#8217;t work with your version of PHP.' );
					if ( current_user_can( 'update_php' ) ) {
						printf(
							/* translators: %s: URL to Update PHP page. */
							' ' . wp_kses(
								'<a href="%s">Learn more about updating PHP</a>.',
								[ 'a' => [ 'href' => '' ] ]
							),
							esc_url( wp_get_update_php_url() )
						);
						wp_update_php_annotation( '</p><p><em>', '</em>' );
					}
				}
				echo '</p></div>';
			}
			?>
	<div class="plugin-card-top">
		<div class="name column-name">
			<h3>
				<a href="<?php echo esc_url( $details_link ); ?>" class="thickbox open-plugin-details-modal">
					<?php echo esc_attr( $title ); ?>
					<img src="<?php echo esc_attr( $plugin_icon_url ); ?>" class="plugin-icon" alt="" />
				</a>
			</h3>
		</div>
		<div class="action-links">
			<?php
			if ( $action_links ) {
				echo '<ul class="plugin-action-buttons">';
				foreach ( $action_links as $link ) {
					echo wp_kses_post( $link ) . '</br>';
				}
				echo '</ul>';
			}
			?>
		</div>
		<div class="desc column-description">
			<p><?php echo esc_html( $description ); ?></p>
            <p class="authors"><?php echo $author; //phpcs:ignore ?></p>
		</div>
	</div>
	<div class="plugin-card-bottom">
		<div class="vers column-rating">
			<?php
				wp_star_rating([
					'rating' => $plugin['rating'],
					'type'   => 'percent',
					'number' => $plugin['num_ratings'],
				]);
			?>
			<span class="num-ratings"
				aria-hidden="true">(<?php echo esc_attr( number_format_i18n( $plugin['num_ratings'] ) ); ?>)</span>
		</div>
		<div class="column-updated">
			<strong><?php esc_attr_e( 'Last Updated:' ); ?></strong>
			<?php
				/* translators: %s: Human-readable time difference. */
				printf( esc_html( __( '%s ago' ) ), esc_html( human_time_diff( $last_updated_timestamp ) ) );
			?>
		</div>
		<div class="column-downloaded">
			<?php
			if ( $plugin['active_installs'] >= 1000000 ) {
				$active_installs_millions = floor( $plugin['active_installs'] / 1000000 );
				$active_installs_text     = sprintf(
					/* translators: %s: Number of millions. */
					_nx( '%s+ Million', '%s+ Million', $active_installs_millions, 'Active plugin installations' ),
					number_format_i18n( $active_installs_millions )
				);
			} elseif ( 0 === $plugin['active_installs'] ) {
				$active_installs_text = _x( 'Less Than 10', 'Active plugin installations' );
			} else {
				$active_installs_text = number_format_i18n( $plugin['active_installs'] ) . '+';
			}
			/* translators: %s: Number of installations. */
			printf( esc_html( __( '%s Active Installations' ) ), esc_html( $active_installs_text ) );
			?>
		</div>
		<div class="column-compatibility">
			<?php
			if ( ! $tested_wp ) {
				echo '<span class="compatibility-untested">' . esc_html( __( 'Untested with your version of WordPress' ) ) . '</span>';
			} elseif ( ! $compatible_wp ) {
				echo '<span class="compatibility-incompatible"><strong>Incompatible</strong> with your version of WordPress</span>';
			} else {
				echo '<span class="compatibility-compatible"><strong>Compatible</strong> with your version of WordPress</span>';
			}
			?>
		</div>
	</div>
</div>
<?php } ?>
		<?php
		
		// Close the last group's divs if any plugins were processed
		if ( ! empty( $group ) ) {
			echo '</div></div>'; // Close plugin-items and plugin-group
		}
	}
}

// Initialize the class
new PRODDISP_RecommendedProducts();