<?php
/**
 * Matomo - free/libre analytics platform
 *
 * @link https://matomo.org
 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
 * @package matomo
 */

namespace WpMatomo\Ecommerce;

use MeprProduct;
use MeprTransaction;

if ( ! defined( 'ABSPATH' ) ) {
	exit; // if accessed directly
}

class MemberPress extends Base {
	public function register_hooks() {
		if ( ! is_admin() ) {
			parent::register_hooks();

			add_action( 'template_redirect', [ $this, 'on_product_view' ], 99999, 0 );
			add_action( 'wp_footer', [ $this, 'on_order' ], 99999, 2 );
			add_action( 'mepr-signup', [ $this, 'on_cart_update' ], 99999, 1 );
		}
	}

	/**
	 * @param MeprTransaction $transaction
	 */
	public function on_cart_update( $transaction ) {
		$tracking_code  = '';
		$sku            = $transaction->id;
		$product        = $transaction->product();
		$params         = [
			'addEcommerceItem',
			$sku,
			$product->post_title,
			$categories = [],
			$transaction->amount,
			1,
		];
		$tracking_code .= $this->make_matomo_js_tracker_call( $params );

		$total          = $transaction->total;
		$tracking_code .= $this->make_matomo_js_tracker_call( [ 'trackEcommerceCartUpdate', $total ] );

		// we can't echo directly as we wouldn't know where in the template rendering stage we are and whether
		// we're supposed to print or not etc
		$this->cart_update_queue = $this->wrap_script( $tracking_code );
		$this->logger->log( 'Tracked ecommerce cart update: ' );
	}

	public function on_product_view() {
		if ( ! is_singular( 'memberpressproduct' ) ) {
			return;
		}

		$product_id = get_the_ID();

		if ( empty( $product_id ) ) {
			return;
		}

		if ( ! class_exists( '\MeprProduct' ) ) {
			return;
		}

		$product = new MeprProduct( $product_id );

		$sku = $product_id;

		$params = [
			'setEcommerceView',
			'' . $sku,
			$product->post_title,
			$categories = [],
			$product->price,
		];
		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
		echo $this->wrap_script( $this->make_matomo_js_tracker_call( $params ) );
	}

	public function on_order() {
		if ( isset( $_GET['membership'] )
			 && ( isset( $_GET['trans_num'] ) || isset( $_GET['transaction_id'] ) )
			 && class_exists( '\MeprTransaction' )
		) {
			$txn = null;
			if ( isset( $_GET['trans_num'] ) ) {
				$txn = MeprTransaction::get_one_by_trans_num( sanitize_text_field( wp_unslash( $_GET['trans_num'] ) ) );
			} else {
				if ( isset( $_GET['transaction_id'] ) ) {
					$txn = MeprTransaction::get_one( sanitize_text_field( wp_unslash( $_GET['transaction_id'] ) ) );
				}
			}

			if ( ! $txn || ! isset( $txn->id ) || $txn->id <= 0 ) {
				return;
			}

			if ( ! $txn->user_id || get_current_user_id() !== (int) $txn->user_id ) {
				$this->logger->log(
					sprintf(
						'Current user ID = %s did not match MemberPress transaction user ID = %s, not tracking.',
						get_current_user_id(),
						$txn->user_id
					)
				);
				return;
			}

			if ( $this->has_order_been_tracked_already( $txn->id ) ) {
				return;
			}

			$this->set_order_been_tracked( $txn->id );
			$transaction       = new MeprTransaction( $txn->id );
			$order_id_to_track = $txn->trans_num;
			$product           = $transaction->product();

			$discount = 0;

			if ( $product && $transaction->coupon() ) {
				$discount = $product->price - $txn->amount;
			}
			$tracking_code  = '';
			$params         = [
				'addEcommerceItem',
				'' . $product->ID,
				$product->post_title,
				[],
				$txn->amount,
				1,
			];
			$tracking_code .= $this->make_matomo_js_tracker_call( $params );
			$params         = [
				'trackEcommerceOrder',
				'' . $order_id_to_track,
				$txn->total,
				$txn->amount,
				$txn->tax_amount,
				$shipping = 0,
				$discount,
			];
			$tracking_code .= $this->make_matomo_js_tracker_call( $params );
			// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
			echo $this->wrap_script( $tracking_code );
		}
	}
}
