define(function () {
  return function (config) {
    var self = this;
    var stats, timestamp;

    self.setData = function (d) {
      var totalNodes = sum(d.nodes.all.map(one));
      var totalOnlineNodes = sum(d.nodes.all.filter(online).map(one));
      var totalOfflineNodes = sum(d.nodes.all.filter(function (node) {
        return !node.flags.online;
      }).map(one));
      var totalNewNodes = sum(d.nodes.new.map(one));
      var totalLostNodes = sum(d.nodes.lost.map(one));
      var totalClients = sum(d.nodes.all.filter(online).map(function (d) {
        return d.statistics.clients ? d.statistics.clients : 0;
      }));
      var totalGateways = sum(Array.from(new Set(d.nodes.all.filter(online).map(function (d) {
        return ("gateway" in d.statistics && d.statistics.gateway.id) ? d.statistics.gateway.id : d.statistics.gateway;
      }).concat(d.nodes.all.filter(function (d) {
        return d.flags.gateway;
      })))).map(function (d) {
        return (typeof d === "string") ? 1 : 0;
      }));

      var nodetext = [{count: totalOnlineNodes, label: "online"},
        {count: totalOfflineNodes, label: "offline"},
        {count: totalNewNodes, label: "neu"},
        {count: totalLostNodes, label: "verschwunden"}
      ].filter(function (d) {
        return d.count > 0;
      })
        .map(function (d) {
          return [d.count, d.label].join(" ");
        })
        .join(", ");

      stats.textContent = totalNodes + " Knoten " +
        "(" + nodetext + "), " +
        totalClients + " Client" + ( totalClients === 1 ? ", " : "s, " ) +
        totalGateways + " Gateways";

      timestamp.textContent = "Diese Daten sind von " + d.timestamp.format("LLLL") + ".";
    };

    self.render = function (el) {
      var h2 = document.createElement("h2");
      h2.textContent = config.siteName;
      el.appendChild(h2);

      var p = document.createElement("p");
      el.appendChild(p);
      stats = document.createTextNode("");
      p.appendChild(stats);
      p.appendChild(document.createElement("br"));
      timestamp = document.createTextNode("");
      p.appendChild(timestamp);
    };

    return self;
  };
});