/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

var htrace = htrace || {};

htrace.ServerInfoView = Backbone.View.extend({
  events: {
    "click .serverConfigurationButton": "showServerConfigurationModal",
  },

  render: function() {
    this.$el.html(_.template($("#server-info-view-template").html())
      ({ model : this.model,
         view : this}));
    console.log("ServerInfoView#render");
    return this;
  },

  close: function() {
    console.log("ServerInfoView#close")
    this.undelegateEvents();
  },

  getServerStatsTableHtml: function() {
    var out = 
      '<div class="panel-heading">' + 
        '<div class="panel-title">Span Metrics</div>' +
      '</div>' +
      '<table class="table table-striped">' +
        '<thead>' +
          '<tr>' +
            '<th>Remote</th>' +
            '<th>Written</th>' +
            '<th>ServerDropped</th>' +
            '<th>ClientDropped</th>' +
          '</tr>' +
        '</thead>';
    var remotes = [];
    var stats = this.model.stats
    var spanMetrics = stats.get("HostSpanMetrics")
    for (var remote in spanMetrics) {
      if (spanMetrics.hasOwnProperty(remote)) {
        remotes.push(remote)
      }
    }
    remotes = remotes.sort()
    for (var i = 0; i < remotes.length; i++) {
      var remote = remotes[0];
      var smtx = spanMetrics[remote];
      out = out + "<tr>" + 
        "<td>" + remote + "</td>" +
        "<td>" + smtx.Written + "</td>" +
        "<td>" + smtx.ServerDropped + "</td>" +
        "<td>" + smtx.ClientDropped + "</td>" +
        "</tr>";
    }
    out = out + '</table>';
    //console.log("out = " + out);
    return out;
  },

  showServerConfigurationModal: function() {
    var config = new htrace.ServerConfiguration();
    var view = this;
    config.fetch({
      "error": function(model, response, options) {
        window.alert("Failed to fetch htraced server configuration: " +
                     JSON.stringify(response));
      },
      "success": function(model, response, options) {
        var confKeys = [];
        for (var confKey in model.attributes) {
          confKeys.push(confKey)
        }
        console.log("confKeys = " + JSON.stringify(confKeys));
        confKeys = confKeys.sort()
        var out = '<table style="table-layout:fixed;width:100%;word-wrap:break-word">' +
            '<thead>' +
              '<tr>' +
                '<th>Key</th>' +
                '<th>Value</th>' +
              '</tr>' +
            '</thead>';
        for (var i = 0; i < confKeys.length; i++) {
          var colorString = ((i%2) == 1) ? "#f1f1f1" : "#ffffff";
          out += _.template($("#table-row-template").html())(
              {bgcolor: colorString, key: confKeys[i],
                val: model.attributes[confKeys[i]]});
          //out = out + '<tr><th>' + confKeys[i] + '</th><th>' +
              //model.attributes[confKeys[i]] + '</th></tr>';
        }
        var out = out + '</table>';
        htrace.showModal(_.template($("#modal-table-template").html())(
            {title: "HTraced Server Configuration", body: out}));
      }
    })
  }
});
