<?php

declare(strict_types=1);

namespace Xentral\Components\HttpClient;

use Xentral\Components\HttpClient\Exception\TransferErrorExceptionInterface;
use Xentral\Components\HttpClient\Request\ClientRequestInterface;
use Xentral\Components\HttpClient\Response\ServerResponseInterface;
use Xentral\Components\HttpClient\Stream\StreamInterface;
use Xentral\Components\HttpClient\Uri\UriInterface;

interface HttpClientInterface
{
    /**
     * @param string                               $method  HTTP method
     * @param string|UriInterface                  $uri     URI
     * @param array                                $headers Request headers
     * @param string|null|resource|StreamInterface $body    Request body
     * @param string                               $version Protocol version
     *
     * @throws TransferErrorExceptionInterface
     *
     * @return ServerResponseInterface
     */
    public function request(
        $method,
        $uri,
        array $headers = [],
        $body = null,
        $version = '1.1'
    ): ServerResponseInterface;

    /**
     * @param ClientRequestInterface $request
     * @param RequestOptions|null    $options
     *
     * @return ServerResponseInterface
     */
    public function sendRequest(
        ClientRequestInterface $request,
        RequestOptions $options = null
    ): ServerResponseInterface;
}