<?php
/*******************************************************************************
* Copyright (c) 2013, 2014, 2015, 2016 Eclipse Foundation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*    Zak James (zak.james@gmail.com) - Initial implementation
*    Denis Roy (Eclipse Foundation)
*    Christopher Guindon (Eclipse Foundation) - Refactoring for usability and USS
*******************************************************************************/
require_once(realpath(dirname(__FILE__) . '/../../../system/eclipseenv.class.php'));

/**
 * RestClient class
 *
 * @author chrisguindon
 */
class RestClient extends EclipseEnv {

  /**
   * Base url for api requests.
   * @var string
   */
  protected $base_url = "";

  /**
   * List of headers for subsequent request.
   * @var array
   */
  protected $header = array();

  /**
   * List of cookies for subsequent request.
   * @var array
   */
  protected $cookie = array();

  /**
   * Proxy value for curl requests
   *
   * @var string
   */
  protected $proxy = '';

  /**
   * Result of the last request made
   *
   * @var unknown
   */
  protected $result = NULL;

  function __construct(App $App = NULL) {
    parent::__construct($App);
    // Default headers
    $default_headers = array(
      'Content-Type' => 'application/json',
      'Accept' =>'application/json',
      'User-Agent' => 'eclipse/foundation'
    );
    $this->setHeader($default_headers);
  }

  /**
   * Execute a GET request.
   *
   * @param string $url
   *
   * @return Response $data
   */
  public function get($url) {
    return $this->curl_exec($url);
  }

  /**
   * Execute a POST request.
   *
   * @param string $url
   * @param string $data
   *
   * @return Response $data
   */
  public function post($url, $data = NULL) {
    $options[CURLOPT_POST] = TRUE;
    $options[CURLOPT_POSTFIELDS] = $data;

    return $this->curl_exec($url, $options);

  }

  /**
   * Execute a PUT request.
   *
   * @param string $url
   * @param string $data
   *
   * @return Response $data
   */
  public function put($url, $data = NULL) {
    $options[CURLOPT_CUSTOMREQUEST] = 'PUT';
    $options[CURLOPT_POSTFIELDS] = $data;

    return $this->curl_exec($url, $options);
  }

  /**
   * Execute a DELETE request.
   *
   * @param string $url
   * @param string $data
   *
   * @return Response $data
   */
  public function delete($url) {
    $options[CURLOPT_CUSTOMREQUEST] = 'DELETE';
    return $this->curl_exec($url, $options);
  }

  /**
   * Execute a PATCH request.
   *
   * @param string $url
   * @param string $data
   *
   * @return Response $data
   */
  public function patch($url, $data) {
    $options[CURLOPT_CUSTOMREQUEST] = 'PATCH';
    $options[CURLOPT_POSTFIELDS] = $data;
    return $this->curl_exec($url, $options);
  }

  /**
   * Get $base_url
   *
   * @return string $base_url
   */
  public function getBaseUrl() {
    return $this->base_url;
  }

  /**
   * Set $base_url
   * @param string $url
   *
   * @return string $base_url
   */
  public function setBaseUrl($url) {
    if (filter_var($url, FILTER_VALIDATE_URL)) {
      $this->base_url = $url;
    }
    return $this->base_url;
  }

  /**
   * Shortcut for the decoded value of the request body
   *
   * The server must return data in JSON.
   */
  public function getRequestBody($json = TRUE) {
    $return = new stdClass();
    if (isset($this->result->body) && !empty($this->result->body)) {
      $return = $this->result->body;
      if ($json) {
        $return = json_decode(stripslashes($this->result->body));
      }
    }
    return $return;
  }

  /**
   * Get $cookie
   * Convert $cookie array into a string
   *
   * @return string $cookie
   */
  public function getCookie() {
    return implode('; ', $this->cookie);
  }

  /**
   * Set $cookie
   * @param array $cookies
   *
   * @return bool
   */
  public function setCookie($cookies = array()) {
    if (!is_array($cookies)) {
      return FALSE;
    }
    foreach ($cookies as $key => $value) {
      $this->cookie[$key] = $value;
    }
    return TRUE;
  }

  /**
   * Get $header
   * Remove array key from $header
   *
   * @return array $header
   */
  public function getHeader() {
    return array_values($this->header);
  }

  /**
   * Set $header
   * @param array $headers
   *
   * @return bool
   */
  public function setHeader($headers = array()) {
    if (!is_array($headers)) {
      return FALSE;
    }
    foreach ($headers as $key => $value) {
      $this->header[$key] = $key . ': '. $value;
    }
    return TRUE;
  }

  /**
   * Unset $header
   * @param string $header
   *
   * @return bool
   */
  public function unsetHeader($header = "") {
    if (isset($this->header[$header])) {
      unset($this->header[$header]);
      return TRUE;
    }
    return FALSE;
  }

  /**
   * Execute a CURL request
   *
   * @param string $path
   * @param array $options
   *
   * @return Response $return
   */
  protected function curl_exec($path = '', $options = array()) {
    $this->result = new stdClass();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HEADER, TRUE);
    curl_setopt($ch, CURLOPT_FRESH_CONNECT, TRUE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

    curl_setopt($ch, CURLINFO_HEADER_OUT, TRUE);
    curl_setopt($ch, CURLOPT_FORBID_REUSE, TRUE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);

    //proxy configuration
    //curl_setopt($ch, CURLOPT_PROXY, $this->_get_proxy());
    //curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
    if ($this->getEnvShortName() === 'local') {
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
      curl_setopt($ch, CURLOPT_PROXY, '');
      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    }
    $options[CURLOPT_URL] = $this->base_url . '/' . $path;
    $headers = $this->getHeader();
    $cookies = $this->getCookie();
    if (!empty($cookies)) {
      $headers[] = 'Cookie: ' . $cookies;
    }
    $options[CURLOPT_HTTPHEADER] = $headers;
    curl_setopt_array($ch, $options);
    $result = curl_exec($ch);
    if (!$result) {
      $this->result->error = curl_error($ch);
      $this->result->code = 9990;
      $this->result->request_error = $result;
      curl_close($ch);
      return $this->result;
    }
    $this->result->options = $options;
    $this->result->request = curl_getinfo($ch);
    $this->result->body = substr($result, $this->result->request['header_size']);
    curl_close($ch);

    $this->result->headers = array();
    $header_text = substr($result, 0, strpos($result, "\r\n\r\n"));
    foreach (explode("\r\n", $header_text) as $i => $line) {
      if ($i === 0) {
        $this->result->headers['http_code'] = $line;
      }
      else {
        list ($key, $value) = explode(': ', $line);
        $this->result->headers[$key] = $value;
      }
    }

    $response_array = explode(' ', trim($this->result->headers['http_code']), 3);

    $this->result->status_message = '';
    $this->result->protocol = $response_array[0];
    $this->result->code = $this->result->request['http_code'];
    if (isset($response_array[2])) {
      $this->result->status_message = $response_array[2];
    }
    return $this->result;
  }

  /**
   * Get 'Link' header
   *
   * @param string $link
   *
   * @return bool/array $links
   */
  protected function _getHeaderLink($link = '') {
    if (strlen($link) == 0) {
      return FALSE;
    }

    $parts = explode(',', $link);
    $links = array();
    foreach($parts as $p) {
      $section = explode(';', htmlspecialchars_decode($p));
      if (count($section) != 2) {
        return FALSE;
      }
      $url = $this->_removeBaseUrlFromUrl(trim(preg_replace("/<(.*)>/", '$1', $section[0])));
      $key = trim(preg_replace("/rel=\"(.*)\"/", '$1', $section[1]));
      $links[$key] = $url;
    }
    return $links;
  }

  /**
   * Get next page from pagination
   *
   * @param  Response $data
   *
   * @return Response $return
   */
  protected function _getNextPage($data) {
    if (!isset($data->error) && !empty($data->body) && $data) {
      $pages = $this->_getHeaderLink($data->headers['Link']);
      if (($pages['self'] !== $pages['last']) && !empty($pages['next'])){
        if ($data = $this->get($pages['next'])) {
          return $data;
        }
      }
    }
    return FALSE;
  }

  /**
   * Remove $base_url from $url
   * @param string $url
   *
   * @return string $url
   */
  protected function _removeBaseUrlFromUrl($url = '') {
    return str_replace($this->getBaseUrl() . '/', '', $url);
  }

  /**
   * Get proxy value
   *
   * @return string
   */
  private function _get_proxy() {
    if (empty($this->proxy)) {
      $this->_set_proxy();
    }
    return $this->proxy;
  }

  /**
   * Set eclipse proxy for staging/production
   */
  private function _set_proxy(){
    if ($this->_get_prefix_domain() === 'www.eclipse.org') {
      $this->proxy = 'proxy.eclipse.org:9899';
    }
  }
}