<?php
/**
 * GurmeCargo için sipariş niteliklerini eşleştiren GCARGO_Returned_Map_WC_Order sınıfını barındıran dosya.
 *
 * @package GurmeHub
 */

/**
 * GCARGO_Returned_Map_WC_Order sınıfı
 */
class GCARGO_Returned_Map_WC_Order extends GCARGO_Mappers {

	/**
	 * WC siparişi.
	 *
	 * @var WC_Order $order
	 */
	protected $order;

	/**
	 * Eklenti Prefix
	 *
	 * @var string $prefix
	 */
	protected $prefix = GCARGO_PREFIX;

	/**
	 * Depolar.
	 *
	 * @var array
	 */
	public $warehouses;

	/**
	 * Kargo entegrasyonları.
	 *
	 * @var array
	 */
	public $cargo_integrations;

	/**
	 * Varsayılan gönderi ayarları.
	 *
	 * @var array
	 */
	public $returned_setting;

	/**
	 * Kurucu method
	 *
	 * @param int|string $order_id WC sipariş kimliği.
	 * @param array|null $warehouses Depolar.
	 * @param array|null $cargo_integrations Kargo entegrasyonları.
	 * @param array|null $returned_setting Varsayılan ayarlar.
	 */
	public function __construct( $order_id, $warehouses = null, $cargo_integrations = null, $returned_setting = null ) {
		parent::__construct( $order_id, $warehouses, $cargo_integrations );
		$this->settings = $returned_setting ? $returned_setting : gcargo_saas_returned_settings()->get_settings(); // phpcs:ignore
	}

	/**
	 * Geri dönüş URL tespit eden fonskiyon.
	 */
	protected function get_notification_url() {
		return home_url( "/{$this->prefix}-returned-notification" );
	}

	/**
	 * Ürünlerin verileri hazırlayan fonksiyon.
	 *
	 * @param object $item WC sipariş kimliği.
	 */
	protected function prepare_line_item( $item ) {
		return array(
			'action_qty' => (int) wc_get_order_item_meta( $item->get_id(), '_gcargo_returned_qty', true ),
			'reason'     => '',
			'selected'   => false,
		);
	}

	/**
	 * Siparişin iade durumunu döndürür.
	 *
	 * @return string
	 */
	public function get_status() {
		$returneds = gcargo_returneds()->get_returneds_by_order_id( $this->order->get_id() );
		if ( empty( $returneds ) ) {
			return 'ready_for_returned';
		}

		$unpackaged_item_qty = 0;

		foreach ( $this->order->get_items() as $item ) {
			$sold_qty             = $item->get_quantity();
			$returned_qty         = (int) wc_get_order_item_meta( $item->get_id(), '_gcargo_returned_qty', true );
			$unpackaged_item_qty += $sold_qty - $returned_qty;
		}

		if ( $unpackaged_item_qty ) {
			return 'partial_returned';
		}

		return 'all_returned';
	}

	/**
	 * Doğrudan istek oluşturma methodu.
	 *
	 * @return array
	 */
	public function create_request() {

		$request = array_merge(
			$this->get_default(),
			$this->get_payment(),
			[ 'lines' => array_values( array_filter( $this->get_lines(), fn( $line ) => $line['quantity'] ) ) ],
			[ 'customer' => $this->get_customer() ],
			[ 'need_returned' => $this->get_status() !== 'all_returned' ],
			[
				'current_returneds' => array_map(
					fn( $returned ) => $returned->id,
					gcargo_returneds()->get_returneds_by_order_id( $this->order->get_id() )
				),
			]
		);

		return apply_filters( "{$this->prefix}_returned_map_wc_order_request", $request, $this->order );
	}
}
