<?php
/*******************************************************************************
 * Copyright (c) 2010 The Eclipse Foundation.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
require_once(dirname(__FILE__) . "/Forge.class.inc");
require_once(dirname(__FILE__) . "/common.php");
require_once(dirname(__FILE__) . "/debug.php");

class Proposal {
	var $info;
	var $date;
	var $statuses = array();

	function __construct($info) {
		$this->info = $info;
	}

	public static function getAllProposals() {
	    /*
	     * Visit each of the forges to pull out their proposals. Note that the
	     * service that generates this data was designed to output it in the
	     * same sort of format that we'd expect from the database query
	     * result.
	     */
	    foreach(Forge::getForges() as $forge) {
	        $all = json_decode(getUrlContents("{$forge->getUrl()}/json/proposals/all"), true);
	        foreach($all as $row) {
	            $id = $row['Id'];
	            if (isset($proposals[$id])) {
	                $proposal = $proposals[$id];
	            } else {
	                $proposal = new Proposal($row);
	                $proposals[$id] = $proposal;
	            }
	            $proposal->statuses[] = new ProposalStatus($row);
	        }
	    }
	    return $proposals;
	}

	public static function getActiveProposals() {
	    $proposals = array();

	    foreach(Forge::getForges() as $forge) {
	        $url = "{$forge->getUrl()}/json/proposals";
	        $json = getUrlContents($url);
	        if ($list = json_decode($json, true)) {
	            foreach($list as $row) {
	                $proposals[] = new Proposal($row);
	            }
	        }
	    }

	    usort($proposals, 'proposals_sortByDate');

	    return $proposals;
	}

	function getName() {
		return $this->info['ProposalName'];
	}

	/**
	 * Once the project is created, the ProjectId field should be filled in.
	 */
	function getProjectId() {
		return $this->info['ProjectId'];
	}

	function getProjectUrl() {
		return normalizeHttpUrl($this->info['ProjectURL']);
	}

	function asHtml() {
		$name = $this->getName();
		$proposalUrl = $this->getProposalUrl();
		$projectUrl = $this->getProjectUrl();

		$text = htmlentities($name);
		if ($projectUrl) $text = "<a href=\"$projectUrl\">$text</a>";

		if ($proposalUrl)
			$text .= " <a href=\"$proposalUrl\"><img style=\"vertical-align:top\" title=\"Proposal\" src=\"http://dev.eclipse.org/small_icons/mimetypes/text-x-generic.png\"/></a>";

		if ($this->isSuccessful()) {
			$text .= "<img style=\"vertical-align:top\" title=\"This project has been created.\" src=\"/projects/images/ok.gif\">";
		}

		if ($this->isWithdrawn()) $text = "<strike>$text</strike><img style=\"vertical-align:top\" title=\"Review Withdrawn\" src=\"http://dev.eclipse.org/small_icons/actions/process-stop.png\">";

		return $text;
	}

	/**
	 * This function gets the scope for the receiver from the
	 * proposal document. This is a relatively expensive operation, and
	 * no caching is provided. We use some very crude parsing to extract
	 * the contents from the <h2>Scope</h2> section of the document.
	 *
	 * @deprecated
	 */
	function getScope() {
		return null;
	}

	function isWithdrawn() {
		return $this->getProposalWithdrawn() != null;
	}

	function isSuccessful() {
		return $this->getReviewSuccessful() != null;
	}

	function isActive() {
		if ($this->isSuccessful()) return false;
		if ($this->isWithdrawn()) return false;
		return $this->getActiveDate() > strtotime('-3 month');
	}

	function getReviewSuccessful() {
		return $this->getStatus('Review Successful');
	}

	function getProposalWithdrawn() {
		return $this->getStatus('Proposal Withdrawn');
	}

	function getProposalPosted() {
		return $this->getStatus('Proposal Posted');
	}

	function getProposalUrl() {
		return normalizeHttpUrl($this->info['ProposalURL']);
	}
	/**
	 * This function returns the date of the proposal. We consider this to
	 * be the date of the earliest status.
	 */
	function getDate() {
		if (!$this->date) $this->date = $this->compute_date();
		return $this->date;
	}

	function getActiveDate() {
		$date = 0;
		foreach($this->statuses as $status) {
			$status_date = $status->getDate();
			if ($status_date > $date) $date = $status_date;
		}
		return $date;
	}

	/**
	 * It would be easier to just determine
	 * this value from the 'Proposal Posted' date, but we have found some
	 * entries that do not have this status...
	 *
	 * THIS IS NOT API
	 */
	/* private */ function compute_date() {
		$date = strtotime('now');
		foreach($this->statuses as $status) {
			$status_date = $status->getDate();
			if ($status_date < $date) $date = $status_date;
		}
		return $date;
	}

	/**
	 * THIS IS NOT API
	 */
	/* private */ function getStatus($text) {
		foreach($this->statuses as $status) {
			if ($status->getText() == $text) return $status;
		}
		return null;
	}
}

class ProposalStatus {
	var $info;

	function __construct($info) {
		$this->info = $info;
	}

	function getText() {
		return $this->info['Status'];
	}

	function getDate() {
		return strtotime($this->info['Date']);
	}
}

/**
 * @deprecated use Proposal::getAllProposals()
 * @return Proposal[]
 */
function get_proposals() {
    return Proposal::getAllProposals();}


/**
 * This function returns the proposal corresponding to the project
 * with the provided id.
 *
 * @deprecated
 * @param string $id A project id.
 */
function getProposalForProject($id) {
	return null;
}

/**
 * @deprecated use Proposal::getActiveProposals()
 * @return Proposal[]
 */
function getProposals() {
    return Proposal::getActiveProposals();
}


function proposals_sortByDate($a, $b) {
	$aDate = $a->getDate();
	$bDate = $b->getDate();

	if ($aDate < $bDate) return 1;
	if ($aDate > $bDate) return -1;
	return 0;
}

?>