<?php
class OnetWebService
{
  private $ch;
  private $url_root;
  
  function __construct($username, $password) {
    $this->ch = curl_init();
    curl_setopt($this->ch, CURLOPT_USERPWD, $username . ":" . $password);
    curl_setopt($this->ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($this->ch, CURLOPT_HTTPHEADER, array("Accept: application/json"));
    curl_setopt($this->ch, CURLOPT_HEADER, false);
    curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);
    
    $this->set_version(NULL);
  }
  
  public function set_version($version) {
    if (is_null($version)) {
      $this->url_root = 'https://services.onetcenter.org/ws/';
    } else {
      $this->url_root = 'https://services.onetcenter.org/v' . $version . '/ws/';
    }
  }
  
  public function call($path, $query = NULL) {
    $url = $this->url_root . $path;
    if (!is_null($query)) {
      $qstring = http_build_query($query);
      $qstring = preg_replace('/%5B[0-9]+%5D=/i', '=', $qstring);
      $url .= '?' . $qstring;
    }
    curl_setopt($this->ch, CURLOPT_URL, $url);
    $result = curl_exec($this->ch);
    if (curl_errno($this->ch) != 0) {
      $result = (object)array('error' => curl_error($this->ch),
                              'curl_info' => curl_getinfo($this->ch));
      return $result;
    }
    $info = curl_getinfo($this->ch);
    $http_code = $info['http_code'];
    if ($http_code != 200 && $http_code != 422) {
      $result = (object)array('error' => 'Call to ' . $url . ' failed with error code ' . $http_code,
                              'curl_info' => $info);
      return $result;
    }
    return json_decode($result);
  }
}
?>