1:   2:   3:   4:   5:   6:   7:   8:   9:  10:  11:  12:  13:  14:  15:  16:  17:  18:  19:  20:  21:  22:  23:  24:  25:  26:  27:  28:  29:  30:  31:  32:  33:  34:  35:  36:  37:  38:  39:  40:  41:  42:  43:  44:  45:  46:  47:  48:  49:  50:  51:  52:  53:  54:  55:  56:  57:  58:  59:  60:  61:  62:  63:  64:  65:  66:  67:  68:  69:  70:  71:  72:  73:  74:  75:  76:  77:  78:  79:  80:  81:  82:  83:  84:  85:  86:  87:  88:  89:  90:  91:  92:  93:  94:  95:  96:  97:  98:  99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 
<?php
/**
 * Copyright (C) Marcelle Hövelmanns, art solution - All Rights Reserved
 *
 * @file        HttpService.php
 * @author      Marcelle Hövelmanns
 * @site        http://www.artsolution.de
 * @date        25.10.17
 */

namespace AffiliconApiClient\Services;


use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Response;

class HttpService
{
    /** @var Client */
    protected $httpClient;
    protected $endpoint;
    /** @var  Response $response */
    protected $response;
    protected $headers;
    protected $body;
    protected $data;


    public function __construct($endpoint)
    {
        $this->endpoint = $endpoint;
        $this->httpClient = new Client();
        return $this;
    }

    /**
     * @param array $headers
     */
    public function setHeaders($headers)
    {
        $this->headers = $headers;
    }

    /**
     * @return mixed
     */
    public function getHeaders()
    {
        return $this->headers;
    }

    /**
     * @return object
     */
    public function body()
    {
        $responseBody = json_decode($this->response->getBody(), true);

        if (array_exists('data', $responseBody)) {
            $responseBody['data'] = (object)$responseBody['data'];
        }

        return (object) $responseBody;
    }

    public function data()
    {
        return $this->body()->data;
    }

    private function request($method, $route, $body = [])
    {
        $url = $this->endpoint . $route;

        $this->response = $this->httpClient->request($method, $url, [
            'headers' => $this->getHeaders(),
            'json' => $body
        ]);

        return $this;
    }

    /**
     * @param string $route
     * @param array $body
     * @return $this
     */
    public function post($route, $body = [])
    {
        return $this->request('POST', $route, $body);
    }

    /**
     * @param string $route
     * @return $this
     */
    public function get($route)
    {
        return $this->request('POST', $route);
    }

    /**
     * @param $route
     * @param array $body
     * @return HttpService
     */
    public function put($route, $body = [])
    {
        return $this->request('PUT', $route, $body);
    }

    /**
     * @param $route
     * @param array $body
     * @return HttpService
     */
    public function patch($route, $body = [])
    {
        return $this->request('PATCH', $route, $body);
    }

    /**
     * @param $route
     * @param array $body
     * @return HttpService
     */
    public function delete($route, $body = [])
    {
        return $this->request('DELETE', $route, $body);
    }

}