<?php
/**
 * Elasticsearch PHP Client
 *
 * @link      https://github.com/elastic/elasticsearch-php
 * @copyright Copyright (c) Elasticsearch B.V (https://www.elastic.co)
 * @license   https://opensource.org/licenses/MIT MIT License
 *
 * Licensed to Elasticsearch B.V under one or more agreements.
 * Elasticsearch B.V licenses this file to you under the MIT License.
 * See the LICENSE file in the project root for more information.
 */
declare(strict_types = 1);

namespace Elastic\Elasticsearch;

use Elastic\Elasticsearch\Response\Elasticsearch;
use Elastic\Transport\Transport;
use Http\Promise\Promise;
use Psr\Http\Message\RequestInterface;
use Psr\Log\LoggerInterface;

interface ClientInterface
{
    /**
     * Get the Elastic\Transport\Transport
     */
    public function getTransport(): Transport;

    /**
     * Get the PSR-3 logger
     */
    public function getLogger(): LoggerInterface;

     /**
     * Set the asynchronous HTTP request
     */
    public function setAsync(bool $async): self;

    /**
     * Get the asynchronous HTTP request setting
     */
    public function getAsync(): bool;

    /**
     * Enable or disable the x-elastic-client-meta header
     */
    public function setElasticMetaHeader(bool $active): self;

    /**
     * Get the status of x-elastic-client-meta header
     */
    public function getElasticMetaHeader(): bool;

     /**
     * Enable or disable the response Exception
     */
    public function setResponseException(bool $active): self;

     /**
     * Get the status of response Exception
     */
    public function getResponseException(): bool;

    /**
     * Send the HTTP request using the Elastic Transport.
     * It manages synchronous and asynchronous requests using Client::getAsync()
     * 
     * @return Elasticsearch|Promise
     */
    public function sendRequest(RequestInterface $request);
}