<?php
/**
 * Kargo işlemlerine yön vermek için gerekli kural methodlarını barındıran GCargo_Gate_Rules sınıfı barındıran dosya.
 *
 * @package GurmeHub
 */

/**
 * Kargo işlemlerine yön vermek için gerekli kural methodları
 */
class GCARGO_Gate_Rules {

	/**
	 * Ürün kategorisi liste içerisinde mi?
	 *
	 * @param stdClass $rule Kural
	 */
	protected function is_in_line_category( $rule ) {
		$category_ids     = explode( ',', $rule->condition );
		$category_ids     = array_map( 'trim', $category_ids );
		$category_ids     = array_map( 'intval', $category_ids );
		$current_category = $this->get_order_category();

		foreach ( $category_ids as $cat_id ) {
			if ( in_array( $cat_id, $current_category, true ) ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Ürün kategorisi liste dışında mı ?
	 *
	 * @param stdClass $rule Kural
	 */
	protected function is_not_in_line_category( $rule ) {
		$condition        = explode( ',', $rule->condition );
		$condition        = array_map( 'trim', $condition );
		$condition        = array_map( 'intval', $condition );
		$current_category = $this->get_order_category();

		foreach ( $current_category as $cat_id ) {
			if ( ! in_array( $cat_id, $condition, true ) ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Sipariş tutarı belirtilen tutarın üstünde mi ?
	 *
	 * @param stdClass $rule Kural
	 */
	protected function total_bigger_than( $rule ) {
		return $this->order->get_total() > $rule->condition;
	}

	/**
	 * Sipariş tutarı belirtilen tutarın altında mı ?
	 *
	 * @param stdClass $rule Kural
	 */
	protected function total_smaller_than( $rule ) {
		return $this->order->get_total() < $rule->condition;
	}

	/**
	 * Müşteri şehri liste içerisinde mi ?
	 *
	 * @param stdClass $rule Kural
	 */
	protected function customer_city_in_list( $rule ) {
		$city_list    = explode( ',', $rule->condition );
		$city_list    = array_map( 'trim', $city_list );
		$current_city = $this->get_order_city();

		return in_array( $current_city, $city_list, true );
	}

	/**
	 * Müşteri şehri liste dışında mı ?
	 *
	 * @param stdClass $rule Kural
	 */
	protected function customer_city_not_in_list( $rule ) {
		$city_list    = explode( ',', $rule->condition );
		$city_list    = array_map( 'trim', $city_list );
		$current_city = $this->get_order_city();

		return ! in_array( $current_city, $city_list, true );
	}

	/**
	 * Kargo işlemi ödeme türü
	 */
	protected function is_pay_at_door() {
		return $this->order->get_payment_method() === 'cod';
	}

	/**
	 * Kargo işlemi ödeme türü
	 */
	protected function is_not_pay_at_door() {
		return $this->order->get_payment_method() !== 'cod';
	}

	/**
	 * Siparişteki ürün kategorilerini döndürür
	 *
	 * @return array
	 */
	private function get_order_category() {
		$category_ids = [];
		foreach ( $this->order->get_items() as $item ) {
			$product = $item->get_product();
			if ( ! $product ) {
				continue;
			}
			$category_ids = array_merge( $category_ids, $product->get_category_ids() );

			if ( $product->is_type( 'variation' ) ) {
				$parent_id = $product->get_parent_id();
				if ( $parent_id ) {
					$parent_product = wc_get_product( $parent_id );
					if ( $parent_product ) {
						$category_ids = array_merge( $category_ids, $parent_product->get_category_ids() );
					}
				}
			}
		}
		$category_ids = array_unique( $category_ids );
		return $category_ids;
	}

	/**
	 * Siparişteki müşteri şehriyi döndürür
	 *
	 * @return string
	 */
	private function get_order_city() {
		$city = $this->order->get_shipping_state() ? $this->order->get_shipping_state() : $this->order->get_billing_state();
		return str_replace( 'TR', '', $city );
	}
}
