<?php

namespace GuzzleHttp;

use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Promise\PromiseInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\UriInterface;

/**
 * Client interface for sending HTTP requests.
 */
interface ClientInterface {
	const VERSION = '6.3.3';

	/**
	 * Send an HTTP request.
	 *
	 * @param RequestInterface $request Request to send
	 * @param array $options Request options to apply to the given
	 *                                  request and to the transfer.
	 *
	 * @return ResponseInterface
	 * @throws GuzzleException
	 */
	public function send( RequestInterface $request, array $options = [] );

	/**
	 * Asynchronously send an HTTP request.
	 *
	 * @param RequestInterface $request Request to send
	 * @param array $options Request options to apply to the given
	 *                                  request and to the transfer.
	 *
	 * @return PromiseInterface
	 */
	public function sendAsync( RequestInterface $request, array $options = [] );

	/**
	 * Create and send an HTTP request.
	 *
	 * Use an absolute path to override the base path of the client, or a
	 * relative path to append to the base path of the client. The URL can
	 * contain the query string as well.
	 *
	 * @param string $method HTTP method.
	 * @param string|UriInterface $uri URI object or string.
	 * @param array $options Request options to apply.
	 *
	 * @return ResponseInterface
	 * @throws GuzzleException
	 */
	public function request( $method, $uri, array $options = [] );

	/**
	 * Create and send an asynchronous HTTP request.
	 *
	 * Use an absolute path to override the base path of the client, or a
	 * relative path to append to the base path of the client. The URL can
	 * contain the query string as well. Use an array to provide a URL
	 * template and additional variables to use in the URL template expansion.
	 *
	 * @param string $method HTTP method
	 * @param string|UriInterface $uri URI object or string.
	 * @param array $options Request options to apply.
	 *
	 * @return PromiseInterface
	 */
	public function requestAsync( $method, $uri, array $options = [] );

	/**
	 * Get a client configuration option.
	 *
	 * These options include default request options of the client, a "handler"
	 * (if utilized by the concrete client), and a "base_uri" if utilized by
	 * the concrete client.
	 *
	 * @param string|null $option The config option to retrieve.
	 *
	 * @return mixed
	 */
	public function getConfig( $option = null );
}
