<?php

/**
 * Renders the columns to display to the merchant, which orders have been authorized and
 * which have not been authorized yet.
 *
 * @package WooCommerce\PayPalCommerce\WcGateway\Admin
 */
declare (strict_types=1);
namespace WooCommerce\PayPalCommerce\WcGateway\Admin;

use WooCommerce\PayPalCommerce\Settings\Data\SettingsProvider;
use WooCommerce\PayPalCommerce\WcGateway\Gateway\PayPalGateway;
use WooCommerce\PayPalCommerce\WcGateway\Processor\AuthorizedPaymentsProcessor;
/**
 * Class OrderTablePaymentStatusColumn
 */
class OrderTablePaymentStatusColumn
{
    const COLUMN_KEY = 'ppcp_payment_status';
    const INTENT = 'authorize';
    const AFTER_COLUMN_KEY = 'order_status';
    private SettingsProvider $settings_provider;
    public function __construct(SettingsProvider $settings_provider)
    {
        $this->settings_provider = $settings_provider;
    }
    /**
     * Register the columns.
     *
     * @param array $columns The existing columns.
     *
     * @return array
     */
    public function register(array $columns): array
    {
        if ($this->settings_provider->payment_intent() !== self::INTENT) {
            return $columns;
        }
        $status_column_position = array_search(self::AFTER_COLUMN_KEY, array_keys($columns), \true);
        $to_insert_position = \false === $status_column_position ? count($columns) : $status_column_position + 1;
        $columns = array_merge(array_slice($columns, 0, $to_insert_position), array(self::COLUMN_KEY => __('Payment Captured', 'woocommerce-paypal-payments')), array_slice($columns, $to_insert_position));
        return $columns;
    }
    /**
     * Render the column.
     *
     * @param string $column The column.
     * @param int    $wc_order_id The id or the WooCommerce order.
     */
    public function render(string $column, int $wc_order_id)
    {
        if ($this->settings_provider->payment_intent() !== self::INTENT) {
            return;
        }
        if (self::COLUMN_KEY !== $column) {
            return;
        }
        $wc_order = wc_get_order($wc_order_id);
        if (!$wc_order instanceof \WC_Order || !$this->should_render_for_order($wc_order)) {
            return;
        }
        if ($this->is_captured($wc_order)) {
            $this->render_completed_status();
            return;
        }
        $this->render_incomplete_status();
    }
    /**
     * Whether to render the authorization status of an order or not.
     *
     * @param \WC_Order $order The WooCommerce order.
     *
     * @return bool
     */
    public function should_render_for_order(\WC_Order $order): bool
    {
        $intent = $order->get_meta(PayPalGateway::INTENT_META_KEY);
        $captured = $order->get_meta(AuthorizedPaymentsProcessor::CAPTURED_META_KEY);
        $status = $order->get_status();
        $not_allowed_statuses = array('refunded');
        return !empty($intent) && strtoupper(self::INTENT) === strtoupper($intent) && !empty($captured) && !in_array($status, $not_allowed_statuses, \true);
    }
    /**
     * Whether the order has been captured or not.
     *
     * @param \WC_Order $wc_order The WooCommerce order.
     *
     * @return bool
     */
    public function is_captured(\WC_Order $wc_order): bool
    {
        $captured = $wc_order->get_meta(AuthorizedPaymentsProcessor::CAPTURED_META_KEY);
        return wc_string_to_bool($captured);
    }
    /**
     * Renders the captured status.
     */
    private function render_completed_status()
    {
        printf('<span class="dashicons dashicons-yes">
                        <span class="screen-reader-text">%s</span>
                    </span>', esc_html__('Payment captured', 'woocommerce-paypal-payments'));
    }
    /**
     * Renders the "not captured" status.
     */
    private function render_incomplete_status()
    {
        printf('<mark class="onbackorder">%s</mark>', esc_html__('Not captured', 'woocommerce-paypal-payments'));
    }
}
