<?php

namespace App\Service\Moz\Adapters;

use App\Service\Moz\Configurable;
use App\Service\Moz\Request;
use App\Service\Moz\Response;
use GuzzleHttp\Client as GuzzleClient;
use GuzzleHttp\Exception\GuzzleException;

/**
 * Guzzle HTTP adapter.
 */
class Guzzle extends Configurable implements AdapterInterface
{
    /**
     * The Guzzle HTTP client instance.
     *
     * @var GuzzleClient
     */
    private $guzzleClient;

    /**
     * Execute a Moz request using the GuzzleHttp.
     *
     * @param Request $request
     *
     * @return Response
     *
     * @throws GuzzleException
     */
    public function execute(Request $request)
    {
        $response = $this->getGuzzleClient()->request(
            $request->getMethod(),
            $request->getUri()
        );

        $responseHeaders = array_merge(
            ["HTTP/1.1 {$response->getStatusCode()} {$response->getReasonPhrase()}"],
            $response->getHeaders()
        );

        return new Response((string) $response->getBody(), $responseHeaders);
    }

    /**
     * Gets the Guzzle HTTP client instance.
     *
     * @return GuzzleClient
     */
    public function getGuzzleClient()
    {
        return $this->guzzleClient;
    }

    /*
     * @param GuzzleClient $guzzleClient
     *
     * @return GuzzleMoz
     */
    public function setGuzzleClient(GuzzleClient $guzzleClient): self
    {
        $this->guzzleClient = $guzzleClient;

        return $this;
    }
}
