<?php

namespace Automattic\WCShipping\LabelPurchase;

use Automattic\WCShipping\Connect\WC_Connect_Logger;
use Automattic\WCShipping\WCShippingRESTController;
use Automattic\WCShipping\Fulfillments\ShippingFulfillmentsDataStore;
use WP_Error;
use WP_REST_Request;
use WP_REST_Server;
use Automattic\WCShipping\Utils;

class LabelStatusController extends WCShippingRESTController {

	protected $rest_base = 'label/status/(?P<order_id>\d+)/(?P<label_id>\d+)';

	/**
	 * @var LabelPurchaseService
	 */
	protected $label_service;
	/**
	 * @var WC_Connect_Logger
	 */
	protected $logger;

	/**
	 * @var ShippingFulfillmentsDataStore
	 */
	protected $shipping_fulfillments_data_store;

	public function __construct(
		LabelPurchaseService $label_service,
		WC_Connect_Logger $logger,
		ShippingFulfillmentsDataStore $shipping_fulfillments_data_store
	) {
		$this->label_service                    = $label_service;
		$this->logger                           = $logger;
		$this->shipping_fulfillments_data_store = $shipping_fulfillments_data_store;
	}

	/**
	 * Register API routes.
	 *
	 * @return void
	 */
	public function register_routes() {
		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base,
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_labels_status' ),
					'permission_callback' => array( $this, 'ensure_rest_permission' ),
				),
			)
		);
	}

	public function get_labels_status( WP_REST_Request $request ) {
		list( $label_id, $order_id ) = $this->get_and_check_request_params( $request, array( 'label_id', 'order_id' ) );
		$response                    = $this->label_service->get_status( $label_id );
		if ( is_wp_error( $response ) ) {
			$error = new WP_Error(
				$response->get_error_code(),
				$response->get_error_message(),
				array( 'message' => $response->get_error_message() )
			);
			$this->logger->log( $error, __CLASS__ );

			return $error;
		}

		$label = $this->label_service->update_order_label( $order_id, $response->label );

		return array(
			'success' => true,
			'label'   => $label,
		);
	}
}