<?php
/*******************************************************************************
 * Copyright (c) 2017 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(dirname(__FILE__) . "/../../eclipse.org-common/system/app.class.php");
require_once(dirname(__FILE__) . "/../../eclipse.org-common/system/nav.class.php");
require_once(dirname(__FILE__) . "/../../eclipse.org-common/system/menu.class.php");
require_once dirname(__FILE__) . '/../classes/Project.class.php';
require_once dirname(__FILE__) . '/../classes/database.inc';
require_once dirname(__FILE__) . '/../classes/common.php';
require_once dirname(__FILE__) . '/../classes/debug.php';

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

$pageTitle 		= "Eclipse Projects by Programming Language";
$pageKeywords	= "";
$pageAuthor		= "Wayne Beaton";

ob_start();

$languages = array();
$sql = "select language, project from ProjectLanguages";

query('dashboard', $sql, array(), function($row) use (&$languages) {
 if ($project = Project::getProject($row['project'])) {
  $languages[$row['language']]['projects'][] = $project;
 }
});

/**
 * Sort an array based on mapped values. Key/value associations
 * are maintained. A mapping function is provided to transform
 * the elements of the area into values that are fed into the
 * sorting function. The sorting function is optional: if it
 * is not provided, then it is assumed that the mapping function
 * provide numeric values that are compared for sort order.
 *
 * @param mixed $values
 * @param callable $map
 * @param callable $function
 */
function masort(&$values, $map, $function = 'masort_int') {
 uasort($values, function($a, $b) use ($map, $function) {
  return $function($map($a), $map($b));
 });
}

/**
 * @internal
 * The default sort comparator.
 */
function masort_int($a, $b) {return $a == $b ? 0 : $a < $b;}

masort($languages, function($value) {return count($value['projects']);});

// TODO show the file extension mappings.

?>
<div id="maincontent">
	<div id="midcolumn">
		<h1><?= $pageTitle ?></h1>
		<p>
			<strong>EXPERIMENTAL!</strong>
		</p>

		<?php
		foreach($languages as $language => $data) {
		 echo "<h3>$language</h3>";
		 echo "<ul>";
		 masort($data['projects'], function($project) {return $project->getNickname();}, 'strcasecmp');
		 /** @var \Project $project */
		 foreach($data['projects'] as $project) {
		  echo "<li><a href=\"{$project->getUrl()}\">{$project->getFormalName()}</a></li>";
		 }
		 echo "</ul>";
		}

		?>
</div>
</div>
<?php

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