<?php
/**
 * Copyright (c) 2018 Eclipse Foundation.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *   Christopher Guindon (Eclipse Foundation)  - initial API and implementation
 *   Eric Poirier (Eclipse Foundation)
 *
 * SPDX-License-Identifier: EPL-2.0
 */

//if name of the file requested is the same as the current file, the script will exit directly.
if(basename(__FILE__) == basename($_SERVER['PHP_SELF'])){exit();}

require_once(realpath(dirname(__FILE__) . "/../../system/eclipseenv.class.php"));

class EclipseInstaller extends EclipseEnv {

  private $platform = array();

  private $total_download_count = 0;

  private $json_data = array();

  private $layout = "layout_b";

  private $download_links = array();

  private $allow_toggle = TRUE;

  private $release_title = "";

  /**
   * Constructor
   */
  function __construct($release = 'latest') {
    parent::__construct();
    $this->_addPlaform('macOS');
    $this->_addPlaform('Windows');
    $this->_addPlaform('Linux');

    // Let's load the json feed to get the links for this release.
    $this->_loadJson($release);
    // Build the array containing all the download links
    $this->setDownloadLinks();

  }

  public function setAllowToggle($bool = TRUE) {
    if (is_bool($bool)) {
      $this->allow_toggle = $bool;
    }
  }

  public function getAllowToggle() {
    return $this->allow_toggle;
  }
  /**
   * Add a link to the Eclipse Installer
   *
   * @param string $platform
   * @param string $url
   * @param string $text
   * @return boolean
   */
  public function addlink($platform = '', $url = '', $text = '', $jre = FALSE) {

    if(!isset($this->platform[$this->_removeSpaces($platform)])) {
      return FALSE;
    }
    $link_classes = "";
    $count = count($this->platform[$this->_removeSpaces($platform)]['links']);
    $platform_array = array(
      'platform' => $platform,
      'count' =>$count,
      'link_classes' => "",
      'url' => $url,
      'text' => $text,
      'text_prefix' => 'Download',
      'jre' => $jre
    );

    $this->setPlatform($platform_array);
  }

  /**
   * Output of the Eclipse Installer HTML
   *
   * @return string
   */
  public function output($version = NULL, $os = NULL) {
    $html = "";
    $tpl = "";
    $layout = $this->getInstallerLayout();

    $os_client = $this->_getClientOS();
    if (!empty($os)) {
      $os_client = $os;
    }

    if (!empty($layout)) {
      $installer_alert_text = $this->getInstallerAlertText();
      switch ($layout) {
        case 'layout_a':
          $release_title = $this->getReleaseShortName(TRUE);
          $installer_links = $this->getInstallerArray(NULL, $os_client);
          $tpl = "views/view.installer-a.php";
          break;
        case 'layout_b':
          $release_title = $this->getReleaseShortName(TRUE) . '&nbsp;' . $this->getReleaseType();
          $release_title_default = $this->getReleaseShortName() . ' ' . $this->getReleaseType();
          $download_count = $this->total_download_count;
          $installer_links = $this->getInstallerArray();
          $tpl = "views/view.installer-b.php";
          break;
      }
      ob_start();
      include($tpl);
      $html = ob_get_clean();
    }
    return $html;
  }

  /**
   * Return the installer alert text
   *
   * @return string
   */
  function getInstallerAlertText() {
    $release_name = $this->getReleaseShortName(TRUE) . " " . $this->getReleaseType();

    $download_links = $this->getDownloadLinks();

    $platforms = array();
    foreach ($download_links as $platform) {
      foreach ($platform['links'] as $link) {

        if ($link['jre'] === TRUE) {
          $platforms[$link['platform']] = str_replace(' ', '&nbsp;', $link['platform']);
        }
      }
    }

    if (empty($platforms)) {
      return "";
    }

    $string_platforms = implode(', ', $platforms);
    $string_platforms = substr_replace($string_platforms, ' and', strrpos($string_platforms, ','), 1);

    return "The Eclipse Installer " . $release_name . " now includes a JRE for " . $string_platforms . ".";
  }

  /**
   * Returns the layout for the Installer
   *
   * @return string
   */
  public function getInstallerLayout() {
    return $this->layout;
  }

  /**
   * Sets a specified layout for the Installer
   *
   * @param string $layout
   */
  public function setInstallerLayout($layout = "") {
    if (filter_var($layout, FILTER_SANITIZE_STRING)) {
      $this->layout = $layout;
    }
  }

  /**
   * Returns the download link
   *
   * @return array
   */
  public function getDownloadLinks() {
    return $this->download_links;
  }

  /**
   * Set the download link
   *
   * @param array $links
   */
  public function setDownloadLinks() {
    $this->download_links = $this->getPlatform();
  }

  /**
   * Set the release title
   *
   * @param string $title
   */
  public function setReleaseTitle($title) {
    if (!empty($title)) {
      $this->release_title = $title;
    }
  }

  /**
   * Get the release title
   *
   * @return string
   */
  public function getReleaseTitle() {
    return $this->release_title;
  }

  /**
   * Get the release short name
   *
   * @param bool $non_breaking_string
   *
   * @return string
   */
  public function getReleaseShortName($non_breaking_string = FALSE) {

    if ($release_title = $this->getReleaseTitle()) {
      $release_title = explode('/', $release_title);
      $short_name = $release_title[0];

      if ($non_breaking_string) {
        $short_name = str_replace('-', '&#8209;', $short_name);
      }
      return $short_name;
    }

    return "";
  }

  /**
   * Get the release type
   *
   * @return string
   */
  public function getReleaseType() {

    if ($release_title = $this->getReleaseTitle()) {
      $release_title = explode('/', $release_title);
      return $release_title[1];
    }

    return "";
  }

  /**
   * Return a platform
   *
   * @return array
   */
  public function getPlatform() {
    return $this->platform;
  }

  /**
   * Sets a specified platform
   *
   * @param array $platform
   */
  public function setPlatform($platform = array()) {
    $this->platform[$this->_removeSpaces($platform['platform'])]['links'][] = $platform;
  }

  /**
   * Returns an array of links
   *
   * @param string $os
   *
   * @param string $version
   *
   * @return array
   */
  public function getInstallerLinks($version = NULL, $os = NULL) {

    $os_client = $this->_getClientOS();
    $accepted_os = array('windows','macos','linux');
    if (!empty($os) && in_array($os, $accepted_os)) {
      $os_client = $os;
    }

    $download_links = $this->getInstallerArray($version, $os_client);

    $links = array(
      'links' => array(),
    );
    if (!empty($download_links)) {
        foreach($download_links['links'] as $link) {
          $links['links'][] = $link['url'];
        }
    }
    return $links;
  }

  public function getInstallerInstructions(){
    $class = 'collapse';
    if (!$this->getAllowToggle()) {
      $class .= ' in';
    }
    $html = '<div id="collapseEinstaller1">';
    $html .= '<div class="' . $class . '" id="collapseEinstaller">';
    $html .= '<div class="well">';
    ob_start();
    include('views/view.installer-instructions.php');
    return $html . ob_get_clean() . '</div></div></div>';
  }

  /**
   * Returns the appropriate array based on the Version and OS if specified
   *
   * @param string $version
   *
   * @param string $os
   *
   * @return array
   */
  public function getInstallerArray($version = NULL, $os = NULL) {

    $download_links = $this->getDownloadLinks();

    // Return default array if nothing is specified
    if (empty($os) && empty($version)) {
      return $download_links;
    }

   $accepted_version = array('x86_64','32bit', 'AArch64');
    if (!empty($version) && !in_array($version, $accepted_version)) {
      return array();
    }

    $accepted_os = array('windows','macos','linux');
    if (!empty($os) && !in_array($os, $accepted_os)) {
      return array();
    }

    // Build new array if Version or OS has been specified
    if (!empty($os) || !empty($version)) {
      $links = array(
        'links' => array(),
      );
      foreach ($download_links as $platform) {
        foreach ($platform['links'] as $link) {
          $link_label = str_replace(" ", "", strtolower($platform['label']));
          $link_text = str_replace(" ", "", strtolower($link['text']));

          //If both are specified
          if (!empty($os) && !empty($version) && $link_label == $os && $version == $link_text) {
            $links['links'][] = $link;
          }

          // If only OS is specified
          if (!empty($os) && empty($version) && $link_label == $os) {
            $links['links'][] = $link;
          }

          // If only Version is specified
          if (!empty($version) && empty($os) && $version == $link_text) {
            $links['links'][] = $link;
          }
        }
      }
      return $links;
    }
    return array();
  }

  /**
   * Add links from json data feed.
   */
  private function _addLinksFromJson() {
    $data = $this->json_data;
    $eclipse_env = $this->getEclipseEnv();

    if (!empty($data['files']['mac64'])) {
      $this->addlink('macOS', str_replace('www.eclipse.org', $eclipse_env['domain'], $data['files']['mac64']['url']), "x86_64", $data['files']['mac64']['jre']);
    }

    if (!empty($data['files']['macaarch64'])) {
      $this->addlink('macOS', str_replace('www.eclipse.org', $eclipse_env['domain'], $data['files']['macaarch64']['url']), "AArch64", $data['files']['macaarch64']['jre']);
    }

    if (!empty($data['files']['win32'])) {
      $this->addlink('Windows', str_replace('www.eclipse.org', $eclipse_env['domain'], $data['files']['win32']['url']), '32 bit', $data['files']['win32']['jre']);
    }

    if (!empty($data['files']['win64'])) {
      $this->addlink('Windows', str_replace('www.eclipse.org', $eclipse_env['domain'], $data['files']['win64']['url']), 'x86_64', $data['files']['win64']['jre']);
    }

    if (!empty($data['files']['linux32'])) {
      $this->addlink('Linux', str_replace('www.eclipse.org', $eclipse_env['domain'], $data['files']['linux32']['url']), '32 bit', $data['files']['linux32']['jre']);
    }

    if (!empty($data['files']['linux64'])) {
      $this->addlink('Linux', str_replace('www.eclipse.org', $eclipse_env['domain'], $data['files']['linux64']['url']), "x86_64", $data['files']['linux64']['jre']);
    }

    if (!empty($data['files']['linuxaarch64'])) {
      $this->addlink('Linux', str_replace('www.eclipse.org', $eclipse_env['domain'], $data['files']['linuxaarch64']['url']), "AArch64", $data['files']['linuxaarch64']['jre']);
    }
  }

  /**
   * Add a platform to the Eclipse Installer
   *
   * @param string $label
   */
  private function _addPlaform($label = '') {
   $safe_label = $this->_removeSpaces($label);
    $this->platform[$safe_label] = array(
      'label' => $label,
      //'icon' => '<img src="/downloads/assets/public/images/icon-' . $safe_label . '.png"/>',
      'icon' => '',
      'links' => array(),
    );
  }

  /**
   * Returns the user's OS or the specified OS
   *
   * @return $display
   */
  private function _getClientOS() {
    require_once(realpath(dirname(__FILE__) . "/../../system/app.class.php"));
    $App = new App();
    $client_os = $App->getClientOS();
    $os = "windows"; // setting windows as default display
    if ($client_os == "linux" || $client_os == "linux-x64") {
      $os = "linux";
    }
    if ($client_os == "macosx" || $client_os == "cocoa64" || $client_os == "carbon") {
      $os = "macos";
    }

    // Check if the OS has been selected manually
    if (isset($_GET['osType'])) {
      $os = $_GET['osType'];
      if ($_GET['osType'] == 'win32') {
        $os = "windows";
      }
    }

    return $os;
  }

  /**
   * Remove all spaces from a string.
   *
   * @param string $str
   */
  private function _removeSpaces($str = '') {
   return str_replace(' ', '', strtolower($str));
  }

  /**
   * Load jSON data from file.
   *
   * @param unknown $release
   */
  private function _loadJson($release) {
    $url = '/home/data/httpd/writable/community/eclipse_installer.json';
    $json_data = json_decode(file_get_contents($url), TRUE);
    $installer = array();
    foreach ($json_data as $data) {
      if ((strtolower($data['release_title']) == strtolower($release)) || ($release === 'latest' && $data['latest_release'] === TRUE)) {
        $installer = $data;
        break;
      }
    }
    if (empty($installer) && !empty($json_data[0])) {
      $installer = $json_data[0];
    }
    if (!empty($installer)) {
      $this->json_data = $installer;
      $this->_addLinksFromJson();
      if (!empty($this->json_data['total_download_count'])) {
        $this->total_download_count = $this->json_data['total_download_count'];
      }
      if (!empty($this->json_data['release_title'])) {
        $this->setReleaseTitle($this->json_data['release_title']);
      }
    }
  }
}
