File: /var/www/html/ielts-store/wp-content/plugins/automatewoo/includes/Workflow_Location.php
<?php
// phpcs:ignoreFile
namespace AutomateWoo;
/**
 * @class Workflow_Location
 * @since 2.8.2
 */
class Workflow_Location {
	public $workflow;
	/** @var string */
	public $country;
	/** @var string */
	public $state;
	/** @var string */
	public $postcode;
	/** @var string */
	public $city;
	/** @var string */
	public $based_on = 'billing';
	/** @var string */
	public $target_object_type;
	/**
	 * @param Workflow $workflow
	 * @param string $based_on
	 */
	function __construct( $workflow, $based_on = 'billing' ) {
		$this->workflow = $workflow;
		if ( in_array( $based_on, [ 'billing', 'shipping' ] ) ) {
			$this->based_on = $based_on;
		}
	}
	/**
	 * @return string
	 */
	function get_target_object_type() {
		if ( ! isset( $this->target_object_type ) ) {
			$this->target_object_type = $this->load_target_object_type();
		}
		return $this->target_object_type;
	}
	/**
	 * @return string
	 */
	protected function load_target_object_type() {
		// only use the order/subscription location if the order belongs to the customer
		if ( $this->workflow->data_layer()->order_belongs_to_customer ) {
			if ( $order = $this->workflow->data_layer()->get_order() ) {
				return 'order';
			}
			if ( $subscription = $this->workflow->data_layer()->get_subscription() ) {
				return 'subscription';
			}
		}
		if ( $user = $this->workflow->data_layer()->get_user() ) {
			return 'user';
		}
		if ( $guest = $this->workflow->data_layer()->get_guest() ) {
			return 'guest';
		}
		return false;
	}
	/**
	 * @return \WC_Order|\WC_Subscription|\WP_User|Order_Guest|Guest|false
	 */
	function get_target_object() {
		if ( $this->get_target_object_type() ) {
			return $this->workflow->data_layer()->get_item( $this->get_target_object_type() );
		}
		return false;
	}
	/**
	 * @return string
	 */
	function get_country() {
		if ( ! isset( $this->country ) ) {
			$object = $this->get_target_object();
			switch ( $this->get_target_object_type() ) {
				case 'order':
					$this->country = $this->based_on === 'billing' ? Compat\Order::get_billing_country( $object ) : Compat\Order::get_shipping_country( $object );
					break;
				case 'subscription':
					$this->country = $this->based_on === 'billing' ? Compat\Subscription::get_billing_country( $object ) : Compat\Subscription::get_shipping_country( $object );
					break;
				case 'user':
					$this->country = $this->based_on === 'billing' ? get_user_meta( $object->ID, 'billing_country', true ) : get_user_meta( $object->ID, 'shipping_country', true );
					break;
				case 'guest':
					$this->country = $object->get_country();
					break;
			}
			if ( ! $this->country ) {
				$this->country = WC()->countries->get_base_country();
			}
		}
		return $this->country;
	}
	/**
	 * @return string
	 */
	function get_state() {
		if ( ! isset( $this->state ) ) {
			$object = $this->get_target_object();
			switch ( $this->get_target_object_type() ) {
				case 'order':
					$this->state = $this->based_on === 'billing' ? Compat\Order::get_billing_state( $object ) : Compat\Order::get_shipping_state( $object );
					break;
				case 'subscription':
					$this->state = $this->based_on === 'billing' ? Compat\Subscription::get_billing_state( $object ) : Compat\Subscription::get_shipping_state( $object );
					break;
				case 'user':
					$this->state = $this->based_on === 'billing' ? get_user_meta( $object->ID, 'billing_state', true ) : get_user_meta( $object->ID, 'shipping_state', true );
					break;
				case 'guest':
					$this->state = $object->get_state();
					break;
			}
			if ( ! $this->state ) {
				$this->state = WC()->countries->get_base_state();
			}
		}
		return $this->state;
	}
	/**
	 * @return string
	 */
	function get_postcode() {
		if ( ! isset( $this->postcode ) ) {
			$object = $this->get_target_object();
			switch ( $this->get_target_object_type() ) {
				case 'order':
					$this->postcode = $this->based_on === 'billing' ? Compat\Order::get_billing_postcode( $object ) : Compat\Order::get_shipping_postcode( $object );
					break;
				case 'subscription':
					$this->postcode = $this->based_on === 'billing' ? Compat\Subscription::get_billing_postcode( $object ) : Compat\Subscription::get_shipping_postcode( $object );
					break;
				case 'user':
					$this->postcode = $this->based_on === 'billing' ? get_user_meta( $object->ID, 'billing_postcode', true ) : get_user_meta( $object->ID, 'shipping_postcode', true );
					break;
				case 'guest':
					$this->postcode = $object->get_postcode();
					break;
			}
			if ( ! $this->postcode ) {
				$this->postcode = WC()->countries->get_base_postcode();
			}
		}
		return $this->postcode;
	}
	/**
	 * @return string
	 */
	function get_city() {
		if ( ! isset( $this->city ) ) {
			$object = $this->get_target_object();
			switch ( $this->get_target_object_type() ) {
				case 'order':
					$this->city = $this->based_on === 'billing' ? Compat\Order::get_billing_city( $object ) : Compat\Order::get_shipping_city( $object );
					break;
				case 'subscription':
					$this->city = $this->based_on === 'billing' ? Compat\Subscription::get_billing_city( $object ) : Compat\Subscription::get_shipping_city( $object );
					break;
				case 'user':
					$this->city = $this->based_on === 'billing' ? get_user_meta( $object->ID, 'billing_city', true ) : get_user_meta( $object->ID, 'shipping_city', true );
					break;
				case 'guest':
					$this->city = $object->get_city();
					break;
			}
			if ( ! $this->city ) {
				$this->city = WC()->countries->get_base_city();
			}
		}
		return $this->city;
	}
	/**
	 * @return array
	 */
	function get_location_array() {
		return [
			$this->get_country(),
			$this->get_state(),
			$this->get_postcode(),
			$this->get_city()
		];
	}
}