<?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' => "btn btn-warning margin-bottom-5",
      '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($version, $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[] = 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']['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']);
      }
    }
  }
}