/*
 * Copyright 2012 LinkedIn Corp.
 *
 * Licensed 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.
 */

$.namespace('azkaban');

var jmxTableView;
azkaban.JMXTableView = Backbone.View.extend({
  events: {
    "click .query-btn": "queryJMX",
    "click .collapse-btn": "collapseRow"
  },

  initialize: function (settings) {
  },

  formatValue: function (value) {
    if (String(value).length != TIMESTAMP_LENGTH) {
      return value;
    }
    if (isNaN(parseInt(value))) {
      return value;
    }
    var date = new Date(value);
    if (date.getTime() <= 0) {
      return value;
    }
    return value + " (" + date.toISOString() + ")";
  },

  queryJMX: function (evt) {
    var target = evt.currentTarget;
    var id = target.id;

    var childID = id + "-child";
    var tbody = id + "-tbody";

    var requestURL = contextURL + "/jmx";
    var canonicalName = $(target).attr("domain") + ":name=" + $(target).attr(
        "name");

    var data = {
      "ajax": "getAllMBeanAttributes",
      "mBean": canonicalName
    };
    if ($(target).attr("hostPort")) {
      data.ajax = "getAllExecutorAttributes";
      data.hostPort = $(target).attr("hostPort");
    }
    var view = this;
    var successHandler = function (data) {
      var table = $('#' + tbody);
      $(table).empty();

      for (var key in data.attributes) {
        var value = data.attributes[key];

        var tr = document.createElement("tr");
        var tdName = document.createElement("td");
        var tdVal = document.createElement("td");

        $(tdName).addClass('property-key');
        $(tdName).text(key);

        value = view.formatValue(value);
        $(tdVal).text(value);

        $(tr).append(tdName);
        $(tr).append(tdVal);

        $('#' + tbody).append(tr);
      }

      var child = $("#" + childID);
      $(child).fadeIn();
    };
    $.get(requestURL, data, successHandler);
  },

  queryRemote: function (evt) {
    var target = evt.currentTarget;
    var id = target.id;

    var childID = id + "-child";
    var tbody = id + "-tbody";

    var requestURL = contextURL + "/jmx";
    var canonicalName = $(target).attr("domain") + ":name=" + $(target).attr(
        "name");
    var hostPort = $(target).attr("hostport");
    var requestData = {
      "ajax": "getAllExecutorAttributes",
      "mBean": canonicalName,
      "hostPort": hostPort
    };
    var view = this;
    var successHandler = function (data) {
      var table = $('#' + tbody);
      $(table).empty();

      for (var key in data.attributes) {
        var value = data.attributes[key];

        var tr = document.createElement("tr");
        var tdName = document.createElement("td");
        var tdVal = document.createElement("td");

        $(tdName).addClass('property-key');
        $(tdName).text(key);

        value = view.formatValue(value);
        $(tdVal).text(value);

        $(tr).append(tdName);
        $(tr).append(tdVal);

        $('#' + tbody).append(tr);
      }

      var child = $("#" + childID);
      $(child).fadeIn();
    };
    $.get(requestURL, requestData, successHandler);
  },

  collapseRow: function (evt) {
    $(evt.currentTarget).parent().parent().fadeOut();
  },

  render: function () {
  }
});

var remoteTables = new Array();
$(function () {
  jmxTableView = new azkaban.JMXTableView({el: $('#all-jmx')});

  $(".remoteJMX").each(function (item) {
    var newTableView = new azkaban.JMXTableView({el: $(this)});
    remoteTables.push(newTableView);
  });
});
