<?php

namespace Automattic\WCShipping\Connect;

// No direct access please
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

if ( ! class_exists( WC_Connect_API_Client_Local_Test_Mock::class ) ) {
	require_once __DIR__ . '/../class-wc-connect-api-client.php';

	class WC_Connect_API_Client_Local_Test_Mock extends WC_Connect_API_Client {

		/**
		 * Gets mock endpoint data from json file.
		 *
		 * json data structure must map connect server endpoints to
		 * mock data that will be returned when WCS makes a request.
		 *
		 * @return object
		 */
		private function get_mock_endpoints() {
			$json_string = file_get_contents( plugin_dir_path( __FILE__ ) . 'test_data/services_data_mock_with_card.json' );
			return json_decode( $json_string );
		}

		/**
		 * Gets mock endpoint data from json file as an associative array.
		 *
		 * json data structure must map connect server endpoints to
		 * mock data that will be returned when WCS makes a request.
		 *
		 * @return object
		 */
		private function get_mock_endpoints_associative() {
			$json_string = file_get_contents( plugin_dir_path( __FILE__ ) . 'test_data/services_data_mock_with_card_associative.json' );
			return json_decode( $json_string, true );
		}

		/**
		 * Returns mock data for what would otherwise come from WC connect server
		 *
		 * @param $method
		 * @param $path
		 * @param $body
		 * @return mixed|WP_Error
		 */
		protected function request( $method, $path, $body = array() ) {
			$mock_data = $this->get_mock_endpoints();

			if ( isset( $mock_data->mock_endpoints->$path ) ) {
				return $mock_data->mock_endpoints->$path;
			}

			$mock_data_associative = $this->get_mock_endpoints_associative();
			if ( isset( $mock_data_associative['mock_endpoints'][ $path ] ) ) {
				return $mock_data_associative['mock_endpoints'][ $path ];
			}
			// Just return empty data for requests not matching mock endpoint data.
			return new \stdClass();
		}
	}
}
