<?php
/*******************************************************************************
 * Copyright (c) 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("ad.class.php");

/**
 * Eclipse Ads
 *
 * @package eclipse.org-common
 * @subpackage ads
 * @author: Christopher Guindon <chris.guindon@eclipse.org>
 */
class EclipseAds{

 /**
  * The selected ad to display
  * @var Ad object
  */
  protected $ad = array();

  /**
   * List of all ads to chose from
   * @var array
   */
  protected $ads = array();

  /**
   * The HTML output of the ad
   * @var string
   */
  protected $output = "";

  /**
   * The description of the page that will display the ad
   * @var string
   */
  protected $source = "";

  /**
   * The remote address of the user that will view the ad
   * @var string
   */
  protected $remote_addr = "";

  /**
   * The total weight of all ads
   * @var int
   */
  protected $total_weight = 0;

  /**
   * Constructor
   * @param string $source
   */
  public function EclipseAds($source = "") {
    if ($source != "") {
      $this->source =  $source;
    }
    $this->remote_addr = @gethostbyaddr($_SERVER['REMOTE_ADDR']);
  }

  /**
   * The ad builder, this funciton is ussually overwritten in a parent class
   * @return string
   */
  protected function _build($layout = "", $type = "") {
    return "";
  }

  /**
   * Add an add to the list of ads
   * @param object $Ad
   */
  public function newAd($Ad = NULL) {
    if ($Ad->validAd()) {
      $this->ads[] = $Ad;
    }
  }

  /**
   * Randomly chose an ad from the list
   * @return boolean
   */
  protected function _choseAd() {
    if (!empty($this->ads)) {
      $this->_getTotalWeight();
      switch ($this->total_weight) {
        // split evenly
        case 0:
          $random = array_rand($this->ads, 1);
          $this->ad = $this->ads[$random];
          break;

        // use weight to chose an ad.
        default:
          $draw = rand(1, $this->total_weight);
          $current = 0;
          foreach ($this->ads as $Ad) {
            $current = $current + $Ad->getWeight();
            if ($draw <= $current) {
              $this->ad  = $Ad;
              break;
            }
          }
      }
    }
  }

  private function _getTotalWeight() {
    $this->total_weight = 0;
    foreach ($this->ads as $ad) {
      $this->total_weight = $ad->getWeight() + $this->total_weight;
    }
    return $this->total_weight;
  }

  /**
   * Return HTML of the add and count impression if possible
   */
  public function output($layout = "") {
    $this->_choseAd();

    if (!empty($this->ad)) {
      if ($this->ad->getType() == "empty") {
        return "";
      }
      $campaign = $this->ad->getCampaign();
      if (!empty($this->ad) && $campaign != "") {
        $CampaignImpression = new CampaignImpression($campaign, $this->source, $this->remote_addr);
        $CampaignImpression->recordImpression();
      }
      $this->_build($layout, $this->ad->getType());
    }
    print $this->output;
  }
}