<?php
/**
 * Copyright (c) 2008, 2018 Eclipse Foundation.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *   Wayne Beaton (Eclipse Foundation)- initial API and implementation
 *   Eric Poirier (Eclipse Foundation)
 *
 * SPDX-License-Identifier: EPL-2.0
 */

require_once ($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");
require_once ($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php");
$App = new App();
$Nav = new Nav();
$Theme = $App->getThemeClass();

include ($App->getProjectCommon());

$pairs = simplexml_load_file("reports/proximity.xml");

if (array_key_exists('sort', $_GET)) {
  $rows = array();
  foreach ($pairs as $row) {
    $rows[] = array(
      'a' => $row['a'],
      'b' => $row['b'],
      'users' => $row['users']
    );
  }
  $pairs = $rows;
  $sort = $_GET['sort'];

  function sort_a($a, $b) {
    $result = strcasecmp($a['a'], $b['a']);
    if ($result == 0)
      return sort_users($a, $b);
    return $result;
  }

  function sort_b($a, $b) {
    return strcasecmp($a['b'], $b['b']);
  }

  function sort_users($a, $b) {
    $aa = (int) $a['users'];
    $bb = (int) $b['users'];
    return $aa > $bb ? -1 : 1;
  }
  usort($pairs, "sort_$sort");
}

$table = createTable($pairs, array(
  "Bundle" => "a",
  "Is seen with..." => "b",
  "Users" => "users"
));

function createTable(&$rows, $columns) {
  $html = "<table class=\"table\" border=\"1\">";
  $html .= "<tbody>";
  $html .= "<tr>";
  foreach ($columns as $title => $attribute) {
    $html .= "<th><a href=\"?sort=$attribute\">$title</a></th>";
  }
  $html .= "</tr>";

  foreach ($rows as $row) {
    $html .= "<tr>";
    foreach ($columns as $title => $attribute) {
      $html .= "<td>$row[$attribute]</td>";
    }
    $html .= "</tr>";
  }
  $html .= "</tbody>";
  $html .= "</table>";
  return $html;
}

// Begin: page-specific settings. Change these.
$pageTitle = "Usage Data Collector Project Pairings Report";
$Theme->setPageTitle($pageTitle);
$Theme->setPageKeywords("Eclipse, usage data, usagedata, cortez");
$Theme->setPageAuthor("Wayne Beaton");

ob_start();
include ("content/en_" . $App->getScriptName());
$html = ob_get_clean();

$Theme->setNav($Nav);
$Theme->setHtml($html);
$Theme->generatePage();
