<?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' . floor((($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:';";
	$metrics = array();
	query('dashboard', $sql, array(':id:' => $wg->getId()), function($row) use (&$metrics, &$columns) {
		$metrics[] = $row;
	});

	if ($metrics) {
		echo "<table class=\"metrics\"><tbody>";
		echo "<tr>";
		foreach($columns as $column) {
			$title = ucfirst($column);
			echo "<th>{$title}</th>";
		}
		echo "</tr>";
		foreach($metrics as $row) {
			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>";
	} else {
		echo "<p>None</p>";
	}
}
?>

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

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

<h3>Specification Projects</h3>
<?php showMetrics($wg, 'WorkingGroupSpecificationsQuarterlySummary', '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 );
?>
