<?php
/**
 * Kargo işlemlerine yön veren GCargo_Gate sınıfı barındıran dosya.
 *
 * @package GurmeHub
 */

/**
 * Kargo işlemlerine yön veren GCargo_Gate sınıfı
 */
class GCARGO_Gate extends GCARGO_Gate_Rules {

	/**
	 * Gate ayarlar dizisi
	 *
	 * @var array $settings
	 */
	public $settings;

	/**
	 * Varsayılan gönderi özellikleri
	 *
	 * @var array $defaults
	 */
	public $defaults;

	/**
	 * WooCommerce siparişi
	 *
	 * @var WC_Order $order
	 */
	public $order;

	/**
	 * GCARGO_Gate kurucu method.
	 */
	public function __construct() {
		$this->settings = gcargo_gate_settings()->get_settings();
	}

	/**
	 * WooCommerce siparişi için gate kurallarını uygular ve gönderi özelliklerini döndürür.
	 *
	 * @return array|null
	 */
	public function get_shipment_properties_for_wc_order() {
		if ( empty( $this->settings ) ) {
			return $this->defaults;
		}

		$active_rules = array_filter( $this->settings, fn( $rule ) => isset( $rule->enabled ) && $rule->enabled );
		if ( empty( $active_rules ) ) {
			return $this->defaults;
		}

		foreach ( $active_rules as $rule ) {
			if ( is_callable( array( $this, $rule->rule ) ) && call_user_func( array( $this, $rule->rule ), $rule ) ) {
				return array(
					'cargo_integration_id' => $rule->integration ?? $this->defaults['cargo_integration_id'],
					'warehouse_id'         => $rule->warehouse ?? $this->defaults['warehouse_id'],
					'payment_type'         => $rule->payment_type ?? $this->defaults['payment_type'],
					'payor_type'           => $rule->payor_type ?? $this->defaults['payor_type'],
					'is_pay_at_door'       => $rule->pay_at_door,
				);
			}
		}

		return $this->defaults;
	}

	/**
	 * WooCommerce siparişi için varsayılan gönderi özelliklerine gate kurallarını uygular.
	 *
	 * @param array    $request İstek verisi.
	 * @param WC_Order $wc_order WooCommerce siparişi.
	 * @return array
	 */
	public function apply_gate_rules_to_shipment_properties( $request, $wc_order ) {
		$this->order     = $wc_order;
		$this->defaults  = $request;
		$gate_properties = $this->get_shipment_properties_for_wc_order();

		return wp_parse_args( $gate_properties, $request );
	}
}
