/**
 * 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.
 */
(function () {
  "use strict";

  var data = {ozone: {enabled: false}};

  dust.loadSource(dust.compile($('#tmpl-dn').html(), 'dn'));

  function loadDatanodeInfo() {
    $.get('/jmx?qry=Hadoop:service=DataNode,name=DataNodeInfo', function(resp) {
      data.dn = workaround(resp.beans[0]);
      data.dn.HostName = resp.beans[0]['DatanodeHostname'];
      render();
    }).fail(show_err_msg);
  }

  function loadOzoneScmInfo() {
        $.get('/jmx?qry=Hadoop:service=OzoneDataNode,name=SCMConnectionManager', function (resp) {
            if (resp.beans.length > 0) {
                data.ozone.SCMServers = resp.beans[0].SCMServers;
                data.ozone.enabled = true;
                render();
            }
        }).fail(show_err_msg);
  }

  function loadOzoneStorageInfo() {
        $.get('/jmx?qry=Hadoop:service=OzoneDataNode,name=ContainerLocationManager', function (resp) {
            if (resp.beans.length > 0) {
                data.ozone.LocationReport = resp.beans[0].LocationReport;
                data.ozone.enabled = true;
                render();
            }
        }).fail(show_err_msg);
    }

  function workaround(dn) {
    function node_map_to_array(nodes) {
      var res = [];
      for (var n in nodes) {
        var p = nodes[n];
        p.name = n;
        res.push(p);
      }
      return res;
    }

    dn.VolumeInfo = node_map_to_array(JSON.parse(dn.VolumeInfo));
    dn.BPServiceActorInfo = JSON.parse(dn.BPServiceActorInfo);

    return dn;
  }

  function render() {
    var base = dust.makeBase({
      'helper_relative_time' : function (chunk, ctx, bodies, params) {
        var value = dust.helpers.tap(params.value, chunk, ctx);
        return chunk.write(moment().subtract(Number(value), 'seconds').fromNow(true));
      }
    });
    dust.render('dn', base.push(data), function(err, out) {
      $('#tab-overview').html(out);
      $('#tab-overview').addClass('active');
    });
  }

  function show_err_msg() {
    $('#alert-panel-body').html("Failed to load datanode information");
    $('#alert-panel').show();
  }

    loadDatanodeInfo();
    loadOzoneScmInfo();
    loadOzoneStorageInfo();

})();
