<?php

# @name: ops_api.php
# @version: 0.1
# @creation_date: 2021-09-24
# @license: The MIT License <https://opensource.org/licenses/MIT>
# @author: Simon Bowie <ad7588@coventry.ac.uk>
# @purpose: Performs functions against the European Patent Office's Open Patent Services (OPS) API
# @acknowledgements:
# OPS documented at https://www.epo.org/searching-for-patents/data/web-services/ops.html
# OPS RESTful API specification at http://documents.epo.org/projects/babylon/eponet.nsf/0/F3ECDCC915C9BCD8C1258060003AA712/$File/ops_v3.2_documentation_-_version_1.3.16_en.pdf
# OPS API functions list at https://developers.epo.org/ops-v3-2/apis

function get_access_token() {

  // OPS API credentials (details at http://documents.epo.org/projects/babylon/eponet.nsf/0/F3ECDCC915C9BCD8C1258060003AA712/$File/ops_v3.2_documentation_-_version_1.3.16_en.pdf)
  $ops_url = $_ENV["OPS_URL"] . '3.2/auth/accesstoken';
  $auth = base64_encode($_ENV["CONSUMER_KEY"] . ":" . $_ENV["CONSUMER_SECRET"]);

  // Set up API call
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $ops_url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, array("Authorization: Basic $auth","Content-Type: application/x-www-form-urlencoded"));
  curl_setopt($ch, CURLOPT_POSTFIELDS, 'grant_type=client_credentials');
  curl_setopt($ch, CURLOPT_POST, true);

  // Give back curl result
  $response = curl_exec($ch);
  curl_close($ch);

  // Turn the API response into useful Json
  $json = json_decode($response);
  $access_token = $json->access_token;

  return $access_token;

}

function get_publication_details($document_reference) {

  $access_token = get_access_token();

  // OPS API credentials (details at http://documents.epo.org/projects/babylon/eponet.nsf/0/F3ECDCC915C9BCD8C1258060003AA712/$File/ops_v3.2_documentation_-_version_1.3.16_en.pdf)
  $ops_url = $_ENV["OPS_URL"] . 'rest-services/published-data/publication/epodoc/' . $document_reference . '/biblio';

  // Set up API call
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $ops_url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, array("Authorization: Bearer $access_token", "Accept: application/json"));

  // Give back curl result
  $response = curl_exec($ch);
  curl_close($ch);

  if (strpos($response,"No results found") === false ) {

    // Turn the API response into useful Json
    $json = json_decode($response);

    // For each invention title, check if it's in the original language
    foreach ($json->{'ops:world-patent-data'}->{'exchange-documents'}->{'exchange-document'}->{'bibliographic-data'}->{'invention-title'} as $invention_title){

      if ($invention_title->{'@lang'} === 'ol'){

        $output['original_title'] = $invention_title->{'$'};

      }

    }

    // For each abstract, check if it's in the original language
    foreach ($json->{'ops:world-patent-data'}->{'exchange-documents'}->{'exchange-document'}->{'abstract'} as $abstract){

      if ($abstract->{'@lang'} === 'ol'){

        $output['original_abstract'] = $abstract->p->{'$'};

      }

    }

    return $output;

  }

}

function check_for_images($document_reference) {

  $access_token = get_access_token();

  // OPS API credentials (details at http://documents.epo.org/projects/babylon/eponet.nsf/0/F3ECDCC915C9BCD8C1258060003AA712/$File/ops_v3.2_documentation_-_version_1.3.16_en.pdf)
  $ops_url = $_ENV["OPS_URL"] . 'rest-services/published-data/publication/epodoc/' . $document_reference . '/images';

  // Set up API call
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $ops_url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, array("Authorization: Bearer $access_token"));

  // Give back curl result
  $response = curl_exec($ch);
  curl_close($ch);

  if (strpos($response,"No results found") === false ) {
    return $response;
  }

}

function get_images($document_reference){

  $access_token = get_access_token();

  // OPS API credentials (details at http://documents.epo.org/projects/babylon/eponet.nsf/0/F3ECDCC915C9BCD8C1258060003AA712/$File/ops_v3.2_documentation_-_version_1.3.16_en.pdf)
  $ops_url = $_ENV["OPS_URL"] . 'rest-services/published-data/publication/epodoc/' . $document_reference . '/images';

  // Set up API call
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $ops_url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, array("Authorization: Bearer $access_token"));

  // Give back curl result
  $response = curl_exec($ch);
  curl_close($ch);

  if (strpos($response,"No results found") === false ) {

		// Turn the API response into useful XML
		$xml = new SimpleXMLElement($response);

    // Retrieve image path from that XML
    $drawings_url = $_ENV["OPS_URL_IMAGES"] . '3.2/rest-services/' . $xml->xpath("///ops:document-instance[@desc='Drawing']/@link")[0][0]->__toString() . '?Range=1';

    // Set up API call
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $drawings_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("Authorization: Bearer $access_token","Accept: application/pdf"));

    // Give back curl result
    $response = curl_exec($ch);
    curl_close($ch);

    // Return the PDF response
    return $response;

  }

}

?>