<?php
/*******************************************************************************
 * Copyright (c) 2014, 2015 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:
 *    Christopher Guindon (Eclipse Foundation) - initial API and implementation
 *******************************************************************************/
require_once(realpath(dirname(__FILE__) . "/../../system/app.class.php"));

class Membership {

  protected $App;

  /**
   * The member's id
   * @var string
   * */
  protected $id = NULL;

  public $members = array();

  /**
   * Member's profile info
   * @var array
   * */
  public $profile = array();

  private $current_name = NULL;

  /**
   * Result of the member id verification
   * @var bool
   * */
  private $is_a_valid_member_id = NULL;

  /**
   * Member's current name
   * @var string
   * */
  private $member_name = "";

  function __construct(){
    $this->App = new App();
    $this->members = array(
      'strategic' => array(
        'content_class' => 'tab-pane active',
        'level' => 'strategic',
        'list_class' => 'active',
        'members' => array(),
        'img' => '/membership/images/type/strategic-members.png',
        'title' => 'Strategic Members',
      ),
      'enterprise' => array(
        'level' => 'enterprise',
        'content_class' => 'tab-pane',
        'list_class' => '',
        'members' => array(),
        'img' => '/membership/images/type/enterprise-members.png',
        'title' => 'Enterprise Members',
      ),
      'contributing' => array(
        'content_class' => 'tab-pane',
        'level' => 'contributing',
        'list_class' => '',
        'members' => array(),
        'img' => '/membership/images/type/contributing-members.png',
        'title' => 'Contributing Members',
      ),
      'associate' => array(
        'content_class' => 'tab-pane',
        'level' => 'associate',
        'list_class' => '',
        'members' => array(),
        'img' => '/membership/images/type/associate-members.png',
        'title' => 'Associate Members',
      ),
      'committer' => array(
        'content_class' => 'tab-pane',
        'level' => 'committer',
        'list_class' => '',
        'members' => array(),
        'img' => '/membership/images/type/committer-members.png',
        'title' => 'Committer Members',
      )
    );
  }

  /**
   * Set member id
   *
   * @param string $id
   * @return boolean
   */
  function setId($id = NULL) {
    $options = array(
      'options' => array('min_range' => 0)
    );

    if (filter_var($id, FILTER_VALIDATE_INT, $options) !== FALSE) {
      $this->id = $id;
      return TRUE;
    }
    return FALSE;
  }

  /**
   * Fetch membership profile(s).
   *
   * If $this->id is set, it will return the profile for a specific member.
   *
   * @return Ambigous <multitype:, multitype:string , boolean, multitype:unknown , multitype:multitype:string NULL  >|boolean|multitype:
   */
  public function fetchProfile() {
    $sql = "SELECT
      ORG.member_type,
      ORG.organization_id as id,
      ORG.name1 as name,
      ORGI.short_description as body,
      ORGI.long_description as full_text,
      ORG.member_type as type,
      ORGI.company_url IS NULL AS COMPLETE,
      ORGI.company_url  AS website,
      ORGI.small_logo as small_logo,
      ORGI.large_logo as large_logo,
      ORGI.small_mime as small_mime,
      ORGI.large_mime as large_mime
    FROM organizations as ORG
    LEFT JOIN OrganizationInformation as ORGI on ORGI.OrganizationID = ORG.organization_id
    WHERE ORG.member_type in ('SD', 'SC', 'AP', 'AS', 'ENTRP', 'OHAP')
    and ORG.organization_id NOT IN (1322, 1324, 1325, 1328)";

    if (!is_null($this->id)) {
      $sql .= " and ORG.organization_id = " . $this->App->returnQuotedString($this->App->sqlSanitize($this->id));
    }
    $sql .= "ORDER BY ORG.name1";

    $rs = $this->App->eclipse_sql($sql);
    while ($row = mysql_fetch_assoc($rs)) {
      $row['name'] = $this->App->checkPlain($row['name']);
      $row['body'] = stripcslashes($row['body']);
      $row['full_text'] = stripcslashes($row['full_text']);
      $row['title_link'] = "";
      $row['small_logo_link'] = "";
      $row['large_logo_link'] = "";
      $row['large_logo_website_link'] = "";
      if (!empty($row['id'])) {
        $row['small_logo_link'] = $row['large_logo_link'] = $row['title_link'] .= '<a href="/membership/showMember.php?member_id=' . $row['id'] .'" title="' . $row['name'] . '">';
      }

      if (strpos($row['website'], 'http') === FALSE) {
        $row['website'] = 'http://'.$row['website'];
      }

      if (filter_var($row['website'], FILTER_VALIDATE_URL)) {
        $row['large_logo_website_link'] = '<a href="' . $row['website'] .'" title="' . $row['name'] . '" target="_blank">';
      }

      $row['title_link'] .= $row['name'];
      
      $small_logo_src = '';
      $large_logo_src = '';
      switch($row['member_type']) {
        case 'AP':
        case 'OHAP':
          $small_logo_src = '/membership/images/type/contributing-members.png';
          $large_logo_src = '/membership/images/type/contributing-members.png';
          break;
        case 'AS':
          $small_logo_src = '/membership/images/type/associate-members.png';
          $large_logo_src = '/membership/images/type/associate-members.png';
          break;
        case 'SD':
        case 'SC':
          $small_logo_src = '/membership/images/type/strategic-members.png';
          $large_logo_src = '/membership/images/type/strategic-members.png';
          break;
      }
      if (!empty($row['small_logo'])) {
        $small_logo_src = 'data:' . $row['small_mime'] . ';base64,' . base64_encode($row['small_logo']);
      }
      $row['small_logo_src'] = $small_logo_src;
      
      if (!empty($row['large_logo'])) {
        $large_logo_src = 'data:' . $row['large_mime'] . ';base64,' . base64_encode($row['large_logo']);
        $row['large_logo_website_link'] .= '<img src="' . $large_logo_src . '"  title="' . $row['name'] . '" class="img-responsive padding-bottom-25"/>';
      }
      else{
        $row['large_logo_website_link'] = '<h1>' . $row['name']. '</h1>';
      }
      $row['large_logo_src'] = $large_logo_src;

      $row['small_logo_link'] .= '<img src="' . $small_logo_src . '"  title="' . $row['name'] . '" class="img-responsive center-block"/>';
      $row['large_logo_link'] .= '<img src="' . $large_logo_src . '"  title="' . $row['name'] . '" class="img-responsive center-block"/>';

      if (!empty($row['id'])) {
        $row['title_link'] .= '</a>';
        $row['small_logo_link'] .= '</a>';
        $row['large_logo_link'] .= '</a>';
      }

      if (filter_var($row['website'], FILTER_VALIDATE_URL)) {
        $row['large_logo_website_link']  .= '</a>';
      }

      switch($row['member_type']) {
        case 'AP':
        case 'OHAP':
          $this->members['contributing']['members'][] = $row;
          break;
        case 'AS':
          $this->members['associate']['members'][] = $row;
          break;
        case 'ENTRP':
          $this->members['enterprise']['members'][] = $row;
          break;
        case 'SD':
        case 'SC':
          $this->members['strategic']['members'][] = $row;
          break;
      }
    }

    if (!is_null($this->id)) {
      foreach($this->members as $level){
        if (!empty($level['members'])) {
          $member = $level['members'][0];
          unset($level['members']);
          $this->profile = array_merge($level, $member);
          $this->profile['mp_listings'] = $this->fetchMarketplaceListings();
          $this->profile['mp_training'] = $this->fetchMarketplaceTrainingListings();
          $this->profile['products'] = $this->fetchMemberProducts();
          $this->profile['projects'] = $this->fetchMemberProjects();
          return $this->profile;
        }
      }
      return FALSE;
    }
    return $this->members;
  }

  /**
   * Fetch Marketplace listing
   *
   * @return boolean|multitype:unknown
   */
  function fetchMarketplaceListings() {
    if (is_null($this->profile)) {
      return FALSE;
    }

    $sql = "
    SELECT
      N.title,
      CTR.field_companyname_value as name,
      N.nid,
      CASE MAX(CAST(fv.field_version_value as INTEGER)) WHEN fv.field_version_value IS NULL THEN '' ELSE fv.field_version_value END as version,
      B.body_value as teaser
    FROM field_data_field_companyname as CTR
    INNER JOIN node as N on CTR.entity_id = N.nid
    LEFT JOIN field_data_field_resource_listing_release as fr on fr.entity_id = N.nid and fr.revision_id = N.vid
    LEFT JOIN field_revision_field_version as fv on fv.entity_id = fr.field_resource_listing_release_value and fv.revision_id = fr.field_resource_listing_release_revision_id
    INNER JOIN field_data_body as B on B.entity_id = N.nid and B.revision_id = N.vid
    WHERE N.status = 1 and CTR.field_companyname_value = ";
    $sql .= $this->App->returnQuotedString($this->App->sqlSanitize($this->profile['name']));
    $sql .= " group by N.nid";
    $result = $this->App->marketplace_sql($sql);

    $return = array();
    while ($row = mysql_fetch_assoc($result)) {
      $row['teaser'] = $this->_ellipsis($row['teaser']);
      $return[] = $row;
    }

    return $return;
  }

  /**
   * Fetch Marketplace Training Listings
   *
   * @return multitype:|multitype:unknown
   */
  function fetchMarketplaceTrainingListings(){
    $return = array();
    if (is_null($this->profile)) {
      return $return;
    }

    $sql = "
    SELECT
      N.title,
      N.nid,
      B.body_value as teaser,
      TU.field_trainingurl_value as training_url,
      TD.field_trainingdesc_value as training,
      CU.field_consultingurl_value as consulting_url,
      CTT.field_consultingdesc_value as consulting
    FROM node as N
    LEFT JOIN field_data_body as B on B.entity_id = N.nid and B.revision_id = N.vid
    LEFT JOIN field_data_field_trainingurl as TU on TU.entity_id = N.nid and TU.revision_id = N.vid
    LEFT JOIN field_data_field_trainingdesc as TD on TD.entity_id = N.nid and TD.revision_id = N.vid
    LEFT JOIN field_data_field_consultingurl as CU on CU.entity_id = N.nid and CU.revision_id = N.vid
    LEFT JOIN field_data_field_consultingdesc as CTT on CTT.entity_id = N.nid and CTT.revision_id = N.vid
    WHERE N.status = 1 AND N.type = 'training' AND N.title =";
    $sql .= $this->App->returnQuotedString($this->App->sqlSanitize($this->profile['name']));

    $result = $this->App->marketplace_sql($sql);

    while ($row = mysql_fetch_assoc($result)) {
      $row['teaser'] = empty($row['teaser']) ? '' : $this->_ellipsis($row['teaser']);
      $row['training'] = empty($row['training']) ? '' : $this->_ellipsis($row['training']);
      $row['consulting'] = empty($row['consulting']) ? '' : $this->_ellipsis($row['consulting']);
      $return[] = $row;
    }

    return $return;

  }

  /**
   * Fetch membership logo
   *
   * @return array
   */
  public function fetchMemberLogo() {
    $unaccepted_ids = array(1322, 1324, 1325, 1328);
    if (empty($this->id) || in_array((int)$this->id, $unaccepted_ids)) {
      return array();
    }

    $sql = "SELECT
      ORG.organization_id as id,
      ORGI.small_logo as small_logo,
      ORGI.large_logo as large_logo,
      ORGI.small_mime as small_mime,
      ORGI.large_mime as large_mime
    FROM organizations as ORG
    LEFT JOIN OrganizationInformation as ORGI on ORGI.OrganizationID = ORG.organization_id
    WHERE ORG.member_type in ('SD', 'SC', 'AP', 'AS', 'ENTRP', 'OHAP')
    and ORG.organization_id = " . $this->App->returnQuotedString($this->App->sqlSanitize($this->id));
    $rs = $this->App->eclipse_sql($sql);

    while ($row = mysql_fetch_assoc($rs)) {
      $this->profile['logo_information'] = $row;
    }
    return $this->profile;
  }

  /**
   * Fetch Member products
   *
   * @return multitype:|multitype:unknown
   */
  function fetchMemberProducts() {
    $return = array();
    if (is_null($this->profile)) {
      return $return;
    }

    $sql = "SELECT ProductID as id, name as name, description as teaser, product_url as url
      FROM OrganizationProducts
      WHERE OrganizationID = ";
    $sql .= $this->App->returnQuotedString($this->App->sqlSanitize($this->profile['id']));
    $sql .= " ORDER by ProductID";

    $result = $this->App->eclipse_sql($sql);

    while ($row = mysql_fetch_assoc($result)) {
      $return[] = $row;
    }

    return $return;
  }

  /**
   * Fetch Member projects
   * @return multitype:|multitype:multitype:string NULL
   */
  function fetchMemberProjects() {
    $sql = "select distinct project from ProjectCompanyActivity where orgId=";
    $sql .= $this->App->returnQuotedString($this->App->sqlSanitize($this->profile['id']));
    $result = $this->App->dashboard_sql($sql);


    $data = array();
    while ($row = mysql_fetch_assoc($result)) {
      if (preg_match('/^locationtech\.(.*)$/', $row['project'])) {
        $data['locationtech']['url'] = 'https://www.locationtech.org';
      }
      elseif (preg_match('/^polarsys\.(.*)$/',$row['project'])) {
        $data['polarsys']['url'] = 'https://www.polarsys.org';
      }
      else {
        $data['eclipse']['url'] = 'https://projects.eclipse.org';
      }
    }

    $return = array();
    if (!empty($data)) {
      foreach($data as &$forge) {
        if ($json = file_get_contents($forge['url'] . '/json/member/' . $this->profile['id'])){
         $forge = array_merge(json_decode($json, TRUE), $forge);
        }
        else{
          continue;
        }
        if (!empty($forge['projects'])) {
          foreach ($forge['projects'] as $project_id => $project){
            $return[] = array(
              'id' => $project_id,
              'url' => $forge['url'] . '/projects/' . $project_id,
              'name' => $project['name'],
            );
          }
        }
      }
    }

    return $return;
  }


  /**
   * Getting the member's current name
   * @param string
   * */
  public function getMemberName(){
    if (is_null($this->current_name)) {
      $profile = $this->fetchProfile();
      $this->setMemberName($profile['name']);
    }
    return $this->current_name;
  }

  /**
   * Find out if the member id is valid
   * @return bool
   * */
  public function getIsAvalidMemberId(){
    // If the id is null, verify it.
    if (!$this->is_a_valid_member_id) {
      $this->_verifyMemberId();
    }
    return $this->is_a_valid_member_id;
  }

  /**
   * Setting the member's current name
   * @param string
   * */
  protected function setMemberName($_val){
    $this->current_name = $_val;
  }

  /**
   * Add elipsis to a string
   *
   * @param string $string
   * @return string
   */
  private function _ellipsis($string = "") {
    return substr(strip_tags(html_entity_decode($string)), 0, 250) . "...";
  }

  /**
   * Find out if the member id is valid
   * @param bool
   * */
  private function _setIsAvalidMemberId($_val){
    $this->is_a_valid_member_id = FALSE;
    if (is_bool($_val) === TRUE){
      $this->is_a_valid_member_id = $_val;
    }
  }

  /**
   * Verify if the member id i valid
   * If not, an error message will be printed on the page
   * @param boolean
   * */
  private function _verifyMemberId(){
    // Select all the member ids from the database
    $sql = "SELECT
            org.organization_id as id
            FROM organizations as org";
    $result = $this->App->eclipse_sql($sql);

    // Find out if the current member id is part of the results
    $_id_array = array();
    while ($row = mysql_fetch_assoc($result)) {
      if($row['id'] == $this->id){
        $_id_array[] = $row['id'];
      }
    }

    // IF there are no member ID found and the user CAN'T edit the page
    if (empty($_id_array)) {
      return $this->_setIsAvalidMemberId(FALSE);
    }
    return $this->_setIsAvalidMemberId(TRUE);
  }
}
