<?php

class ExactMetrics_Google_Ads_Pax extends ExactMetrics_Ads_Tracking_Provider {

	/**
	 * The instance of the class.
	 */
	private static $instance;

	/**
	 * The conversion tracking id.
	 */
	protected $conversionTrackingId;
	
	/**
	 * Constructor
	 */
	public function __construct() {
		
		// Little sanity check to make sure the class is loaded.
		if ( !class_exists('ExactMetrics_Google_Ads') ) {
			require_once EXACTMETRICS_PLUGIN_DIR . 'includes/ppc/google/class-exactmetrics-google-ads.php';
		}

		if ( !$this->is_google_ads_enabled() ) {
			return;
		}
		
		$this->conversionTrackingId = ExactMetrics_Google_Ads::get_settings('conversion_tracking_id');
		
		parent::__construct();
	}

	/**
	 * Get instance
	 *
	 * @return ExactMetrics_Google_Ads_Pax
	 */
	public static function get_instance() {
		if ( ! self::$instance ) {
			self::$instance = new self();
		}
		return self::$instance;
	}

	/**
	 * Insert conversion code
	 */
	public function insert_conversion_code() {
		printf(
			"\t\t__gtagTracker( 'config', '%s' );\n",
			esc_js($this->conversionTrackingId)
		);
	}

	/**
	 * Check if Google Ads is enabled
	 *
	 * @return bool
	 */
	public function is_google_ads_enabled() {
		$settings = ExactMetrics_Google_Ads::get_settings();
		
		if ( ! $settings ) {
			return false;
		}

		if ( empty($settings['conversion_tracking_id']) ) {
			return false;
		}

		return true;
	}
	
	/**
	 * @inheritdoc
	 */
	public function is_active() {
		return $this->is_google_ads_enabled();
	}
	
	/**
	 * @inheritdoc
	 */
	public function get_tracking_id() {
		return $this->conversionTrackingId;
	}
	
	/**
	 * @inheritdoc
	 */
	public function get_api_token() {
		return null;
	}
	
	/**
	 * @inheritdoc
	 */
	public function get_provider_id() {
		return 'google_pax';
	}
	
	/**
	 * @inheritdoc
	 */
	protected function add_frontend_hooks() {
		//  Inject conversion id
		add_action( 'exactmetrics_frontend_tracking_gtag_after_pageview', [$this, 'insert_conversion_code'] );
	}
	
	/**
	 * @inheritdoc
	 */
	protected function init_server_handler() {
		return null;
	}
	
	/**
	 * @inheritdoc
	 */
	public function maybe_print_conversion_code( $conversion_data, $customer_info = [] ) {
		
		//  Conversions require both conversion id and label
		if ( empty( $this->conversionTrackingId ) ) {
			return false;
		}
		
		$data_for_google = [
			'send_to'           => $this->conversionTrackingId,
			'value'             => $conversion_data['order_total'],
			'currency'          => $conversion_data['currency'],
			'transaction_id'    => $conversion_data['order_id'],
		];
		
		printf(
			"\n\t\t__gtagTracker( 'event', 'purchase', %s );\n",
			json_encode( $data_for_google, JSON_UNESCAPED_SLASHES ) // phpcs:ignore WordPress.WP.AlternativeFunctions.json_encode_json_encode -- We need to use json_encode here to avoid double escaping
		);
		
		return true;
	}
}
