<?php
/***********************************************************************
 * Copyright (c) Eclipse Foundation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-2.0
 ***********************************************************************/

require_once "../../eclipse.org-common/system/app.class.php";
require_once ($_SERVER ['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php");
require_once ($_SERVER ['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php");

$App = new App ();
$Nav = new Nav ();
$Menu = new Menu ();
include ($App->getProjectCommon ());

require_once '../classes/WorkingGroup.class.inc';
require_once '../classes/Project.class.php';
require_once '../classes/debug.php';
require_once '../classes/database.inc';
require_once '../classes/common.php';
require_once './charts.inc';

mustBeFoundationEmployee();

$pageTitle = "Eclipse Working Groups Overview";
$pageKeywords = "";
$pageAuthor = "Wayne Beaton";

ob_start ();

if (!(($id = @$_GET['id']) && isValidProjectId($id))) $id = null;

$options = array();
$options['width'] = is_numeric(@$_GET['width']) ? @$_GET['width'] : 500;
$options['height'] = is_numeric(@$_GET['height']) ? @$_GET['height'] : 200;
$options['start'] =  @$_GET['start'] ? date('Y-m-d', strtotime(@$_GET['start'])) : null;
$options['end'] = @$_GET['end'] ? date('Y-m-d', strtotime(@$_GET['end'])) : null;

// Add an entry to focus the report on every
// top-level project to the navigation bar.

$Nav->addNavSeparator("Report", "./report.php");
foreach(WorkingGroup::getAll() as $wg) {
	$Nav->addCustomNav($wg->getName(), "?id={$wg->getId()}", "_self", 2);
}

$wg = WorkingGroup::getWorkingGroup($id);
if (!$wg) $wg = WorkingGroup::getAny();

function quarter($date) {
	if ($date == null) return 'Future';

	$year = date('Y', $date);
	$month = date('n', $date);

	return $year . 'Q' . (($month - 1) / 3 + 1);
}

?>
<style>
table.metrics {
	border-spacing: 10px;
	border-collapse: separate;
}
td.number {
	text-align: right;
}
</style>
<div id="maincontent">
<div id="midcolumn">
<h1><?= $wg->getName() ?></h1>

<p>EXPERIMENTAL. This page shows some basic Working Group metrics.</p>

<h2>Projects</h2>
<?php
	$projects = array();
	$wg->projectsDo(function(Project $project) use (&$projects) {
		$projects[quarter($project->getProvisionedDate())][] = $project;
	});

	ksort($projects);

	foreach($projects as $quarter => $group) {
		echo "<h3>{$quarter}</h3>";
		echo "<ul>";
		foreach($group as $project) {
			echo "<li><a href=\"{$project->getUrl()}\">{$project->getFormalName()}</a></li>";
		}
		echo "</ul>";
	}
?>

<?php
function showMetrics($wg, $table, $fields) {
	$columns = explode(',', $fields);

	$sql = "
		select {$fields}
		from {$table}
		where id=':id:';";

	echo "<table class=\"metrics\"><tbody>";
	echo "<tr>";
	foreach($columns as $column) {
		$title = ucfirst($column);
		echo "<th>{$title}</th>";
	}
	echo "</tr>";
	query('dashboard', $sql, array(':id:' => $wg->getId()), function($row) use (&$columns) {
		echo "<tr>";
		foreach($columns as $column) {
			$value = $row[$column];
			switch ($column) {
				case 'year' :
				case 'quarter' :
					break;
				default:
					$value = number_format($row[$column]);
			}
			echo "<td class=\"number\">{$value}</td>";
		}
		echo "</tr>";
	});
	echo "</tbody></table>";
}
?>

<h2>Yearly Metrics</h2>
<?php showMetrics($wg, 'WorkingGroupYearlySummary', 'year,projects,commits,files,added,removed,authors,committers,companies')?>

<h2>Quarterly Metrics</h2>
<?php showMetrics($wg, 'WorkingGroupQuarterlySummary', 'quarter,projects,commits,files,added,removed,authors,committers,companies')?>

</div>
</div>

<?php
$html = ob_get_contents ();
ob_end_clean ();
$App->generatePage ( null, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html );
?>
