<?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;

  /**
   * Oauth2 access_token
   *
   * @var string
   */
  protected $access_token = "";

  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;
  }

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

  /**
   * Get access_token
   *
   * @param string $token
   */
  public function setAccessToken($token = "") {
    $this->access_token = $token;
    $_SESSION['access_token']['uss'] = $token;
  }

  /**
   * 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;

    // Use access token if set
    if ($token = $this->getAccessToken()) {
      $this->setHeader(array('Authorization' => 'Bearer ' . $token));
    }

    $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
   */
  public 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';
    }
  }
}