<?php
if ( ! defined( 'ABSPATH' ) ) {
	die( 'You are not allowed to call this page directly.' );
}

/**
 * @since 4.04.04
 */
class FrmInstallPlugin {

	/**
	 * Format: folder/filename.php.
	 *
	 * @var string
	 */
	protected $plugin_file;

	/**
	 * @var string
	 */
	protected $plugin_slug;

	public function __construct( $atts ) {
		$this->plugin_file   = $atts['plugin_file'];
		list( $slug, $file ) = explode( '/', $this->plugin_file );
		$this->plugin_slug   = $slug;
	}

	public function get_activate_link() {
		if ( $this->is_installed() && $this->is_active() ) {
			return '';
		}

		if ( $this->is_installed() ) {
			$url = $this->activate_url();
		} else {
			$url = $this->install_url();
		}
		return $url;
	}

	/**
	 * @return bool
	 */
	public function is_installed() {
		return is_dir( WP_PLUGIN_DIR . '/' . $this->plugin_slug );
	}

	/**
	 * @return bool
	 */
	public function is_active() {
		return is_plugin_active( $this->plugin_file );
	}

	/**
	 * @return string
	 */
	protected function install_url() {
		return wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=' . $this->plugin_slug ), 'install-plugin_' . $this->plugin_slug );
	}

	/**
	 * @return string
	 */
	protected function activate_url() {
		return wp_nonce_url( self_admin_url( 'plugins.php?action=activate&plugin=' . $this->plugin_file ), 'activate-plugin_' . $this->plugin_file );
	}

	/**
	 * Handles the AJAX request to install a plugin.
	 *
	 * @since 6.9
	 *
	 * @return void
	 */
	public static function ajax_install_plugin() {
		// Check permission and nonce.
		FrmAppHelper::permission_check( 'install_plugins' );
		check_ajax_referer( 'frm_ajax', 'nonce' );

		// Get posted data.
		$plugin_slug = FrmAppHelper::get_post_param( 'plugin', '', 'sanitize_text_field' );

		if ( ! empty( get_plugins()[ $plugin_slug ] ) ) {
			$activate = activate_plugin( $plugin_slug );
		} else {
			// Include necessary files for plugin installation.
			require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
			require_once ABSPATH . 'wp-admin/includes/plugin-install.php';

			// Get the plugin information.
			$api = plugins_api(
				'plugin_information',
				array(
					'slug'   => $plugin_slug,
					'fields' => array(
						'sections' => false,
					),
				)
			);
			if ( is_wp_error( $api ) ) {
				wp_send_json_error( $api->get_error_message() );
			}
			if ( ! FrmAddonsController::url_is_allowed( $api->versions['trunk'] ) ) {
				wp_send_json_error( 'This download is not allowed' );
			}

			// Set up the Plugin Upgrader.
			$upgrader = new Plugin_Upgrader( new WP_Ajax_Upgrader_Skin() );

			// Install the plugin.
			$result = $upgrader->install( $api->versions['trunk'] );
			if ( is_wp_error( $result ) ) {
				wp_send_json_error( $result->get_error_message() );
			}

			// Activate the plugin.
			$activate = activate_plugin( $upgrader->plugin_info() );
		}//end if

		if ( is_wp_error( $activate ) ) {
			wp_send_json_error( $activate->get_error_message() );
		}

		if ( 'wp-mail-smtp' === $plugin_slug ) {
			update_option( 'wp_mail_smtp_activation_prevent_redirect', true );
		}

		// Send a success response.
		wp_send_json_success( __( 'Plugin installed and activated successfully.', 'formidable' ) );
	}

	/**
	 * Checks plugin activation status via AJAX.
	 *
	 * @since 6.9
	 *
	 * @return void
	 */
	public static function ajax_check_plugin_activation() {
		// Check permission and nonce.
		FrmAppHelper::permission_check( 'install_plugins' );
		check_ajax_referer( 'frm_ajax', 'nonce' );

		// Retrieve plugin identifier.
		$plugin_path = FrmAppHelper::get_post_param( 'plugin_path', '', 'sanitize_text_field' );

		// Respond based on plugin status.
		if ( is_plugin_active( $plugin_path ) ) {
			wp_send_json_success();
		} else {
			wp_send_json_error();
		}
	}

	/**
	 * Check if a plugin is installed.
	 *
	 * @since 6.16
	 *
	 * @param string $plugin_file
	 * @return bool
	 */
	private static function is_plugin_installed( $plugin_file ) {
		return isset( get_plugins()[ $plugin_file ] );
	}
}
