<?php

namespace Automattic\WCShipping\LabelSettings;

use Automattic\WCShipping\WCShippingRESTController;
use Automattic\WCShipping\Connect\WC_Connect_Logger;
use Automattic\WCShipping\Connect\WC_Connect_Functions;
use Automattic\WCShipping\Connect\WC_Connect_Service_Settings_Store;
use Automattic\WCShipping\Connect\WC_Connect_Payment_Methods_Store;
use Automattic\WCShipping\Connect\WC_Connect_Account_Settings;
use WP_REST_Server;
use WP_Error;

class AccountSettingsRestController extends WCShippingRESTController {

	protected $rest_base = 'account/settings';

	private $settings_store;

	private $logger;

	/**
	 * @var WC_Connect_Account_Settings
	 */
	protected $account_settings;

	public function __construct( WC_Connect_Service_Settings_Store $settings_store, WC_Connect_Payment_Methods_Store $payment_methods_store, WC_Connect_Logger $logger ) {
		$this->settings_store   = $settings_store;
		$this->logger           = $logger;
		$this->account_settings = new WC_Connect_Account_Settings(
			$settings_store,
			$payment_methods_store
		);
	}

	public function register_routes() {
		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base,
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_account_settings' ),
					'permission_callback' => array( WC_Connect_Functions::class, 'user_can_manage_labels' ),
				),
				array(
					'methods'             => \WP_REST_Server::CREATABLE,
					'callback'            => array( $this, 'save_account_settings' ),
					'permission_callback' => array( WC_Connect_Functions::class, 'user_can_manage_labels' ),
				),
			)
		);
	}

	public function get_account_settings() {
		$settings = $this->account_settings->get();

		if ( isset( $settings['formData'] ) && is_array( $settings['formData'] ) ) {
			$settings['formData']['enabled'] = true;
		}

		return rest_ensure_response(
			array_merge(
				$settings,
				array( 'success' => true ),
			)
		);
	}

	public function save_account_settings( $request ) {
		$settings = $request->get_json_params();

		if ( is_array( $settings ) ) {
			unset( $settings['enabled'] );

			if ( empty( $settings ) ) {
				return rest_ensure_response( array( 'success' => true ) );
			}
		}

		if ( ! $this->settings_store->can_user_manage_payment_methods() ) {
			// Ignore the user-provided payment method ID if they don't have permission to change it.
			$old_settings                           = $this->settings_store->get_account_settings();
			$settings['selected_payment_method_id'] = $old_settings['selected_payment_method_id'];
		}

		$result = $this->settings_store->update_account_settings( $settings );

		if ( is_wp_error( $result ) ) {
			$error_data = $result->get_error_data();
			if ( ! is_array( $error_data ) ) {
				$error_data = array();
			}

			$error = new WP_Error(
				'save_failed',
				sprintf(
					// translators: %s: error message
					__( 'Unable to update settings. %s', 'woocommerce-shipping' ),
					$result->get_error_message()
				),
				array_merge(
					array( 'status' => 400 ),
					$error_data
				)
			);
			$this->logger->log( $error, __CLASS__ );
			return $error;
		}

		return rest_ensure_response( array( 'success' => true ) );
	}
}