<?php

/**
 * The Create Payment Token endpoint.
 *
 * @package WooCommerce\PayPalCommerce\WcSubscriptions\Endpoint
 */
declare (strict_types=1);
namespace WooCommerce\PayPalCommerce\WcSubscriptions\Endpoint;

use Exception;
use WC_Order;
use WC_Payment_Tokens;
use WooCommerce\PayPalCommerce\Button\Endpoint\EndpointInterface;
use WooCommerce\PayPalCommerce\Button\Endpoint\RequestData;
use WooCommerce\PayPalCommerce\Button\Exception\NonceValidationException;
/**
 * Class SubscriptionChangePaymentMethod
 */
class SubscriptionChangePaymentMethod implements EndpointInterface
{
    const ENDPOINT = 'ppc-subscription-change-payment-method';
    /**
     * The request data.
     *
     * @var RequestData
     */
    private $request_data;
    /**
     * SubscriptionChangePaymentMethod constructor.
     *
     * @param RequestData $request_data $request_data The request data.
     */
    public function __construct(RequestData $request_data)
    {
        $this->request_data = $request_data;
    }
    /**
     * Returns the nonce.
     *
     * @return string
     */
    public static function nonce(): string
    {
        return self::ENDPOINT;
    }
    /**
     * Handles the request.
     *
     * @throws Exception On Error.
     */
    public function handle_request(): void
    {
        try {
            $data = $this->request_data->read_request($this->nonce());
            $subscription = wcs_get_subscription($data['subscription_id']);
            if ($subscription instanceof WC_Order) {
                $subscription->set_payment_method($data['payment_method']);
                $wc_payment_token = WC_Payment_Tokens::get($data['wc_payment_token_id']);
                if ($wc_payment_token) {
                    $subscription->add_payment_token($wc_payment_token);
                    $subscription->save();
                }
                wp_send_json_success();
            }
            wp_send_json_error();
        } catch (NonceValidationException $error) {
            wp_send_json_error(array('message' => $error->getMessage()), 400);
        } catch (Exception $exception) {
            wp_send_json_error();
        }
    }
}