<?php
require_once "../init.php";
require_once BASE . "/lib/style.php";
require_once BASE . "/lib/mysql.php";

$columns = array(
  "name" => array(
    "label" => "name",
    "mysql_name" => "name",
    "mysql_query" => "`build_slaves`.`name`",
    "sort" => "name",
    "title" => "name"
  ),
  "operator" => array(
    "label" => "operator",
    "mysql_name" => "operator",
    "mysql_query" => "`persons`.`name`",
    "sort" => "operator",
    "title" => "operator"
  ),
  "currently_building" => array(
    "label" => "currently building",
    "mysql_name" => "cb",
    "mysql_query" => "`ba_q`.`cb`",
    "mysql_ba_q_name" => "cb",
    "mysql_ba_q_query" => "CONCAT(`architectures`.`name`,\"/\",`package_sources`.`pkgbase`)",
    "sort" => "currently_building",
    "title" => "pkgbase of currently building package"
  ),
  "last_connection" => array(
    "label" => "last connection",
    "mysql_name" => "lc",
    "mysql_query" => "`sl_q`.`lc`",
    "mysql_sl_q_name" => "lc",
    "mysql_sl_q_query" => "MAX(`ssh_log`.`date`)",
    "sort" => "last_connection",
    "title" => "time of last connection"
  ),
  "building_since" => array(
    "label" => "building since",
    "mysql_name" => "bs",
    "mysql_query" => "`sl_q`.`bs`",
    "mysql_sl_q_name" => "bs",
    "mysql_sl_q_query" => "MAX(IF(`ssh_log`.`action`=\"get-assignment\",`ssh_log`.`date`,NULL))",
    "sort" => "building_since",
    "title" => "start of build"
  ),
  "trials" => array(
    "label" => "trials",
    "mysql_name" => "trials",
    "mysql_query" => "`build_slaves`.`trials`",
    "sort" => "trials",
    "title" => "number of trials"
  ),
  "logged_lines" => array(
    "label" => "logged lines",
    "mysql_name" => "ll",
    "mysql_query" => "`build_slaves`.`logged_lines`",
    "sort" => "logged_lines",
    "title" => "number of logged lines so far"
  ),
  "last_action" => array(
    "label" => "last action",
    "mysql_name" => "la",
    "mysql_query" => "`build_slaves`.`last_action`",
    "sort" => "last_action",
    "title" => "last action"
  )
);

if (!isset($_GET["sort"]))
  $_GET["sort"]="-last_connection";

if (substr($_GET["sort"],0,1) == "-") {
  $direction = " DESC";
  $sort = substr($_GET["sort"],1);
} else {
  $direction = " ASC";
  $sort = $_GET["sort"];
}

if (isset($columns[$sort]))
  $order = "IFNULL(`sub_query`.`" . $columns[$sort]["mysql_name"] . "`,0) " . $direction . ",";
else
  $order = "";

function combine_fields($cln) {
  return $cln["mysql_query"] . " AS `" . $cln["mysql_name"] . "`";
}

function combine_ba_q_fields($cln) {
  if (isset($cln["mysql_ba_q_query"]) && isset($cln["mysql_ba_q_name"]))
    return $cln["mysql_ba_q_query"] . " AS `" . $cln["mysql_ba_q_name"] . "`";
}

function combine_sl_q_fields($cln) {
  if (isset($cln["mysql_sl_q_query"]) && isset($cln["mysql_sl_q_name"]))
    return $cln["mysql_sl_q_query"] . " AS `" . $cln["mysql_sl_q_name"] . "`";
}

function non_empty($val) {
  return ! empty($val);
}

$result = mysql_run_query(
  "SELECT `sub_query`.* FROM (" .
    "SELECT " .
    implode(",",array_map("combine_fields",$columns)) .
    " FROM `build_slaves`" .
    mysql_join_build_slaves_ssh_keys() .
    mysql_join_ssh_keys_persons().

    " LEFT JOIN (" .
      "SELECT " .
      "`build_assignments`.`id` AS `id`," .
      implode(",",array_filter(array_map("combine_ba_q_fields",$columns),"non_empty")) .
      " FROM `build_assignments`" .
      mysql_join_build_assignments_package_sources() .
      mysql_join_build_assignments_architectures() .
    ") AS `ba_q`" .
    " ON `ba_q`.`id`=`build_slaves`.`currently_building`" .

    " LEFT JOIN (" .
      "SELECT " .
      "`ssh_log`.`build_slave` AS `build_slave`," .
      implode(",",array_filter(array_map("combine_sl_q_fields",$columns),"non_empty")) .
      " FROM `ssh_log`" .
      " WHERE `ssh_log`.`date`>=ADDDATE(NOW(),\"-5 00:00:00\")" .
      " GROUP BY `ssh_log`.`build_slave`" .
    ") AS `sl_q`" .
    " ON `sl_q`.`build_slave`=`build_slaves`.`id`" .
  ") AS `sub_query`" .
  " ORDER BY " . $order . "`sub_query`.`name`"
);

$count = 0;

while($row = $result->fetch_assoc()) {

  foreach ($row as $name => $value) {
    if (!isset($row[$name]))
      $rows[$count][$name] = "&nbsp;";
    else
      $rows[$count][$name] = $value;
  }
  $rows[$count]["name"] =
    "<a href=\"/buildmaster/log.php?show=ssh&slave=" .
    $row["name"] .
    "\">" .
    $row["name"] .
    "</a>";

  $count++;
}

print_header("List of Build Slaves");

if ($count > 0) {

?>
      <div id="buildslaveslist-results" class="box">
        <table class="results">
          <thead>
            <tr>
<?php

foreach ($columns as $column) {

  print "            <th>\n";
  print "              <a href=\"?sort=";
  if ($column["sort"] == $_GET["sort"])
    print "-";
  print $column["sort"] . "\" ";
  print "title=\"Sort build assignments by " . $column["title"] . "\">\n";
  print "                " . $column["label"] . "\n";
  print "              </a>\n";
  print "            </th>\n";

}

?>
            </tr>
          </thead>
          <tbody>
<?php

$oddity = "odd";

foreach($rows as $row) {

  print "            <tr class=\"" . $oddity . "\">\n";

  foreach ($columns as $column) {

    print "              <td>\n";
    print "                " . $row[$column["mysql_name"]] . "\n";
    print "              </td>\n";

  }
  print "            </tr>\n";

  if ($oddity == "odd" )
    $oddity = "even";
  else
    $oddity = "odd";

}

?>
          </tbody>
        </table>
      </div>
<?php
}

print_footer();