<?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:
 *    Eric Poirier (Eclipse Foundation) - initial API and implementation
 *    Christopher Guindon (Eclipse Foundation)
 *******************************************************************************/

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

class Webmaster {

  protected $App = NULL;

  protected $Friend = NULL;

  protected $projects = array();

  private $state = '';

  public function __construct(App $App) {
    $this->App = $App;

    // Determine if the user is a webmaster
    $Session = $this->App->useSession(true);
    $this->Friend = $Session->getFriend();
    if(!$this->Friend->checkUserIsWebmaster()) {
      header("HTTP/1.1 403 Forbidden");
      exit;
    }
    $this->state = filter_var($this->App->getHTTPParameter('state', 'POST'), FILTER_SANITIZE_STRING);
  }

  public function getFormActionUrl(){
    return '#';
  }

  /**
   * This function get all the active projects
   *
   * @return array
   * */
  public function getProjects() {
    if (empty($this->projects)) {
      $this->projects = $this->_fetchProjects();
    }
    return $this->projects;
  }

  /**
   * This function fetches the project ID for all Active projects
   *
   * @return array
   * */
  protected function _fetchProjects() {
    $sql = "SELECT ProjectID FROM Projects WHERE IsActive = 1";
    $result = $this->App->foundation_sql($sql);
    $projects = array();
    while ($row = mysqli_fetch_array($result)) {
      $projects[] = array(
        'ProjectID' => $row['ProjectID']
      );
    }
    // Add Foundation as first item of the array
    array_unshift($projects, array('ProjectID' => 'Foundation'));

    $this->projects = $projects;
    return $projects;
  }

  /**
   * Get State
   */
  public function getState() {
    return $this->state;
  }

  /**
   * Get form_name
   */
  public function getFormName() {
    return filter_var($this->App->getHTTPParameter('form_name', 'POST'), FILTER_SANITIZE_STRING);
  }

  /**
   * Fetch HTML template for specific page
   *
   * @param $pageTitle - Title of the page
   * @param $page - The page we'd like to retrieve
   */
  public function outputPage($page = "") {
    $page = filter_var($page, FILTER_SANITIZE_STRING);
    $path = $this->App->getBasePath() . '/classes/webmaster/tpl/' . $page . '.tpl.php';
    if (!file_exists($path)) {
      $this->App->setSystemMessage('webmaster', 'An error has occurred. (#webmaster-001)', 'danger');
      return '';
    }
    ob_start();
    include($path);
    return ob_get_clean();
  }
}