<?php

/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *    http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

namespace predictionio;

use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;

/**
 * Base client for Event and Engine client
 *
 */
abstract class BaseClient
{
    private $baseUrl;
    public $client;

    /**
     * @param string $baseUrl Base URL to the server
     * @param float $timeout Timeout of the request in seconds. Use 0 to wait indefinitely
     * @param float $connectTimeout Number of seconds to wait while trying to connect to a server
     */
    public function __construct($baseUrl, $timeout, $connectTimeout)
    {
        $this->baseUrl = $baseUrl;
        $this->client = new Client([
           'base_uri' => $this->baseUrl,
           'timeout' => $timeout,
           'connect_timeout' => $connectTimeout
        ]);
    }

    /**
     * Get the status of the Event Server or Engine Instance
     *
     * @return string status
     */
    public function getStatus()
    {
        return $this->client->get('/')->getBody();
    }

    /**
     * Send a HTTP request to the server
     *
     * @param string $method HTTP request method
     * @param string $url Relative or absolute url
     * @param string $body HTTP request body
     *
     * @return array JSON response
     * @throws PredictionIOAPIError Request error
     */
    protected function sendRequest($method, $url, $body)
    {
        $options = [
            'headers' => [
                'Accept-Encoding' => 'gzip',
                'Content-Type' => 'application/json',
            ],
            'body' => $body,
        ];

        try {
            $response = $this->client->request($method, $url, $options);
            return json_decode($response->getBody(), true);
        } catch (ClientException $e) {
            throw new PredictionIOAPIError($e->getMessage());
        }
    }
}
