File: /var/www/dinamo-shop/wp-content/plugins/woocommerce-multilingual/classes/PaymentGateways/Hooks.php
<?php
namespace WCML\PaymentGateways;
use IWPML_Backend_Action;
use IWPML_Frontend_Action;
use IWPML_DIC_Action;
use WCML\MultiCurrency\Geolocation;
use WCML\StandAlone\IStandAloneAction;
use WCML\Utilities\Resources;
use WPML\API\Sanitize;
use WPML\FP\Maybe;
use WPML\FP\Obj;
use WPML\FP\Relation;
class Hooks implements IWPML_Backend_Action, IWPML_Frontend_Action, IWPML_DIC_Action, IStandAloneAction {
	const OPTION_KEY = 'wcml_payment_gateways';
	/* took this priority from wcgcl but we could not recall the reason of this number.*/
	const PRIORITY = 1000;
	public function add_hooks() {
		if ( is_admin() ) {
			if ( $this->isWCGatewaysSettingsScreen() ) {
				add_action( 'woocommerce_update_options_checkout', [ $this, 'updateSettingsOnSave' ], self::PRIORITY );
				add_action( 'woocommerce_settings_checkout', [ $this, 'output' ], self::PRIORITY );
				add_action( 'admin_enqueue_scripts', [ $this, 'loadAssets' ] );
			}
			add_action( 'admin_notices', [ $this, 'maybeAddNotice' ] );
		} else {
			add_filter( 'woocommerce_available_payment_gateways', [ $this, 'filterByCountry' ], self::PRIORITY );
		}
	}
	public function updateSettingsOnSave() {
		/* phpcs:ignore WordPress.VIP.SuperGlobalInputUsage.AccessDetected */
		if ( isset( $_POST[ self::OPTION_KEY ] ) ) {
			$gatewaySettings = $_POST[ self::OPTION_KEY ];
			$settings = $this->getSettings();
			$gatewayId = Sanitize::stringProp( 'ID', $gatewaySettings );
			$settings[ $gatewayId ]['mode'] = in_array( $gatewaySettings['mode'], [
				'all',
				'exclude',
				'include'
			], true ) ? $gatewaySettings['mode'] : 'all';
			$settings[ $gatewayId ]['countries'] = isset( $gatewaySettings['countries'] ) ? array_map( 'esc_attr', array_filter( explode( ',', Sanitize::stringProp( 'countries', $gatewaySettings ) ) ) ) : [];
			$this->updateSettings( $settings );
		}
	}
	public function loadAssets() {
		$enqueue = Resources::enqueueApp( 'paymentGatewaysAdmin' );
		$gatewayId = sanitize_title( $_GET['section'] );
		$enqueue( [
			'name' => 'wcmlPaymentGateways',
			'data' => [
				'endpoint'     => self::OPTION_KEY,
				'gatewayId'    => $gatewayId,
				'allCountries' => $this->getAllCountries(),
				'strings'      => $this->getStrings(),
				'settings'     => $this->getGatewaySettings( $gatewayId ),
			],
		] );
		wp_register_style( 'wcml-payment-gateways', WCML_PLUGIN_URL . '/res/css/wcml-payment-gateways.css', [], WCML_VERSION );
		wp_enqueue_style( 'wcml-payment-gateways' );
	}
	/**
	 * @return array
	 */
	private function getStrings() {
		return [
			'labelAvailability'           => __( 'Country availability', 'woocommerce-multilingual' ),
			'labelAllCountries'           => __( 'All countries', 'woocommerce-multilingual' ),
			'labelAllCountriesExcept'     => __( 'All countries except', 'woocommerce-multilingual' ),
			'labelAllCountriesExceptDots' => __( 'All countries except...', 'woocommerce-multilingual' ),
			'labelSpecificCountries'      => __( 'Specific countries', 'woocommerce-multilingual' ),
			'tooltip'                     => __( 'Configure per country availability for this payment gateway', 'woocommerce-multilingual' ),
		];
	}
	/**
	 * @return array
	 */
	private function getAllCountries() {
		$buildCountry = function ( $label, $code ) {
			return (object) [
				'code'  => $code,
				'label' => html_entity_decode( $label ),
			];
		};
		return wpml_collect( WC()->countries->get_countries() )->map( $buildCountry )->values()->toArray();
	}
	public function output() {
		?><div id="wcml-payment-gateways"></div><?php
	}
	/**
	 * @param array $payment_gateways
	 *
	 * @return array
	 */
	public function filterByCountry( $payment_gateways ) {
		$customer_country = Geolocation::getUserCountry();
		if ( $customer_country ) {
			$ifExceptCountries = function ( $gateway ) use ( $customer_country ) {
				$gatewaySettings = $this->getGatewaySettings( $gateway->id );
				return $gatewaySettings['mode'] == 'exclude' && in_array( $customer_country, $gatewaySettings['countries'] );
			};
			$ifNotIncluded = function ( $gateway ) use ( $customer_country ) {
				$gatewaySettings = $this->getGatewaySettings( $gateway->id );
				return $gatewaySettings['mode'] == 'include' && ! in_array( $customer_country, $gatewaySettings['countries'] );
			};
			return wpml_collect( $payment_gateways )
				->reject( $ifExceptCountries )
				->reject( $ifNotIncluded )
				->toArray();
		}
		return $payment_gateways;
	}
	public function maybeAddNotice(){
		if( class_exists( 'WooCommerce_Gateways_Country_Limiter' ) ) {
			echo $this->getNoticeText();
		}
	}
	/**
	 * @return string
	 */
	private function getNoticeText(){
		$text = '<div id="message" class="updated error">';
		$text .= '<p>';
		$text .= __( 'We noticed that you\'re using WooCommerce Gateways Country Limiter plugin which is now integrated into WooCommerce Multilingual & Multicurrency. Please remove it!', 'woocommerce-multilingual' );
		$text .= '</p>';
		$text .= '</div>';
		return $text;
	}
	/**
	 * @param string $gatewayId
	 *
	 * @return array
	 */
	private function getGatewaySettings( $gatewayId ) {
		return Maybe::fromNullable( get_option( self::OPTION_KEY, false ) )
			->map( Obj::prop( $gatewayId ) )
			->getOrElse( [ 'mode' => 'all', 'countries' => [] ] );
	}
	/**
	 * @return array
	 */
	private function getSettings() {
		return get_option( self::OPTION_KEY, [] );
	}
	/**
	 * @param array $settings
	 *
	 * @return bool
	 */
	private function updateSettings( $settings ) {
		return update_option( self::OPTION_KEY, $settings );
	}
	/**
	 * @return bool
	 */
	private function isWCGatewaysSettingsScreen() {
		return Obj::prop( 'section', $_GET ) && Relation::equals( 'wc-settings', Obj::prop( 'page', $_GET ) ) && Relation::equals( 'checkout', Obj::prop( 'tab', $_GET ) );
	}
}