<?php

namespace ULTP\Includes\Durbin;

defined( 'ABSPATH' ) || exit;

/**
 * Class Durbin_Client
 */
class DurbinClient {

	// Do not change these constants
	const DEACTIVATE_ACTION = 'deactive';
	const ACTIVATE_ACTION   = 'active';
	const WIZARD_ACTION     = 'wizard';

	const PLUGIN_SLUG = 'ultimate-post';
	const URL         = 'https://inside.wpxpo.com/wp-json/durbin/v1/analytics';

	/**
	 * Send data to Durbin
	 *
	 * @param DurbinClient::DEACTIVATE_ACTION|DurbinClient::ACTIVATE_ACTION|DurbinClient::WIZARD_ACTION $action_type action type.
	 * @return void
	 */
	public static function send( $action_type ) {
		if ( ! current_user_can( 'manage_options' ) ) {
			return;
		}

		if ( ! in_array( $action_type, array( self::DEACTIVATE_ACTION, self::ACTIVATE_ACTION, self::WIZARD_ACTION ), true ) ) {
			return;
		}

		$data = self::get_common_data();

		$data['action_type'] = $action_type;

		if ( self::DEACTIVATE_ACTION === $action_type ) {

			$id = isset( $_POST['cause_id'] ) ? sanitize_key( wp_unslash( $_POST['cause_id'] ) ) : null;

			if ( ! empty( $id ) ) {
				$data['feedback'] = array(
					'id'      => $id,
					'details' => isset( $_POST['cause_details'] ) ? sanitize_text_field( wp_unslash( $_POST['cause_details'] ) ) : null,
				);
			}
		}

		if ( self::WIZARD_ACTION === $action_type ) {
			$data['data'] = array(
				'site_type' => isset( $_POST['siteType'] ) ? sanitize_text_field( wp_unslash( $_POST['siteType'] ) ) : get_option( '__ultp_site_type', 'other' ),
			);
		}

		wp_remote_post(
			self::URL,
			array(
				'timeout'     => 30,
				'redirection' => 5,
				'headers'     => array(
					'user-agent' => 'wpxpo/' . md5( esc_url( home_url() ) ) . ';',
					'Accept'     => 'application/json',
				),
				'blocking'    => true,
				'httpversion' => '1.0',
				'body'        => $data,
			)
		);
	}

	/**
	 * Get All the Installed Plugin Data
	 *
	 * @return array
	 */
	private static function get_installed_plugins() {
		if ( ! function_exists( 'get_plugins' ) ) {
			include ABSPATH . '/wp-admin/includes/plugin.php';
		}

		$active         = array();
		$inactive       = array();
		$all_plugins    = get_plugins();
		$active_plugins = get_option( 'active_plugins', array() );
		if ( is_multisite() ) {
			$active_plugins = array_merge( $active_plugins, array_keys( get_site_option( 'active_sitewide_plugins', array() ) ) );
		}

		foreach ( $all_plugins as $key => $plugin ) {
			$slug = dirname( $key );
			if ( empty( $slug ) || self::PLUGIN_SLUG === $slug ) {
				continue;
			}

			$arr = array(
				'title' => $plugin['Name'] ?? null,
				'slug'  => $slug,
			);

			if ( in_array( $key, $active_plugins ) ) {
				$active[] = $arr;
			} else {
				$inactive[] = $arr;
			}
		}

		return array(
			'active'   => $active,
			'inactive' => $inactive,
		);
	}

	/**
	 * Get Country Code
	 *
	 * @return string|null
	 */
	private static function get_country_code() {

		$cached = get_transient( 'durbin_country_code' );

		if ( false !== $cached ) {
			return $cached;
		}

		$res = wp_remote_get(
			'https://ipinfo.io/json',
			array( 'timeout' => 30 )
		);

		if ( is_wp_error( $res ) || 200 !== wp_remote_retrieve_response_code( $res ) ) {
			return null;
		}

		$body = wp_remote_retrieve_body( $res );
		$data = json_decode( $body, true );

		$country = isset( $data['country'] ) ? $data['country'] : null;

		if ( ! empty( $country ) ) {
			set_transient( 'durbin_country_code', $country, 180 * DAY_IN_SECONDS );
		}

		return $country;
	}

	/**
	 * Get common data
	 *
	 * @return array
	 */
	private static function get_common_data() {
		$user         = wp_get_current_user();
		$plugins_data = self::get_installed_plugins();
		$user_name    = $user->user_firstname ? $user->user_firstname . ( $user->user_lastname ? ' ' . $user->user_lastname : '' ) : $user->display_name;

		$data = array(
			'email'        => $user->user_email,
			'name'         => $user_name,
			'site_url'     => esc_url( home_url() ),
			'plugin'       => self::PLUGIN_SLUG,
			'theme'        => get_stylesheet(),
			'plugins'      => $plugins_data,
			'country_code' => self::get_country_code(),
		);

		return $data;
	}
}
