// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

var hg = require('mercury');
var h = require('mercury').h;
var svg = require('virtual-dom/virtual-hyperscript/svg');

var Consts = require('../../constants');
var MouseMoveHandler = require('../../mousemove-handler.js');
var Util = require('../../util');

module.exports = create;
module.exports.render = render;

var tableRows = [
  // Mounttable.
  {
    rowHeader: Consts.metricNames.MN_MOUNTTABLE,
    columns: [
      {
        dataKey: Consts.dataKeys.DK_SERVICE_LATENCY,
        label: 'LATENCY',
        metricName: Consts.metricNames.MN_MOUNTTABLE,
        threshold: 2000
      },
      {
        dataKey: Consts.dataKeys.DK_SERVICE_QPS,
        label: 'QPS',
        metricName: Consts.metricNames.MN_MOUNTTABLE
      },
      {
        dataKey: Consts.dataKeys.DK_SERVICE_METADATA,
        label: 'BUILD AGE (h)',
        metricName: Consts.metricNames.MN_MOUNTTABLE
      },
      {
        dataKey: Consts.dataKeys.DK_SERVICE_COUNTERS,
        label: 'MOUNTED SERVERS',
        metricName: Consts.metricNames.MN_MT_MOUNTED_SERVERS
      },
      {
        dataKey: Consts.dataKeys.DK_SERVICE_COUNTERS,
        label: 'NODES',
        metricName: Consts.metricNames.MN_MT_NODES
      },
    ]
  },
  // Roled.
  {
    rowHeader: Consts.metricNames.MN_ROLE,
    columns: [
      {
        dataKey: Consts.dataKeys.DK_SERVICE_LATENCY,
        label: 'LATENCY',
        metricName: Consts.metricNames.MN_ROLE,
        threshold: 2000
      },
      {
        dataKey: Consts.dataKeys.DK_SERVICE_QPS,
        label: 'QPS',
        metricName: Consts.metricNames.MN_ROLE
      },
      {
        dataKey: Consts.dataKeys.DK_SERVICE_METADATA,
        label: 'BUILD AGE (h)',
        metricName: Consts.metricNames.MN_ROLE
      }
    ]
  },
  // Proxy.
  {
    rowHeader: Consts.metricNames.MN_PROXY,
    columns: [
      {
        dataKey: Consts.dataKeys.DK_SERVICE_LATENCY,
        label: 'LATENCY',
        metricName: Consts.metricNames.MN_PROXY,
        threshold: 2000
      },
      {
        dataKey: Consts.dataKeys.DK_SERVICE_QPS,
        label: 'QPS',
        metricName: Consts.metricNames.MN_PROXY
      },
      {
        dataKey: Consts.dataKeys.DK_SERVICE_METADATA,
        label: 'BUILD AGE (h)',
        metricName: Consts.metricNames.MN_PROXY
      }
    ]
  },
  // Identityd.
  {
    rowHeader: Consts.metricNames.MN_IDENTITY,
    columns: [
      {
        dataKey: Consts.dataKeys.DK_SERVICE_LATENCY,
        label: 'LATENCY (MACAROON)',
        metricName: Consts.metricNames.MN_MACAROON,
        threshold: 2000
      },
      {
        dataKey: Consts.dataKeys.DK_SERVICE_LATENCY,
        label: 'LATENCY (BINARY DISCHARGER)',
        metricName: Consts.metricNames.MN_BINARY_DISCHARGER,
        threshold: 2000
      },
      {
        dataKey: Consts.dataKeys.DK_SERVICE_QPS,
        label: 'QPS',
        metricName: Consts.metricNames.MN_IDENTITY
      },
      {
        dataKey: Consts.dataKeys.DK_SERVICE_METADATA,
        label: 'BUILD AGE (h)',
        metricName: Consts.metricNames.MN_IDENTITY
      }
    ]
  }
];

/** Constructor. */
function create(data) {
  if (!data) {
    return null;
  }

  return hg.state({
    // Raw data.
    data: hg.struct(data.data),

    mouseOffsetFactor: hg.value(-1),
    showMetricActionsPanel: hg.value(false),

    channels: {
      mouseMoveOnSparkline: mouseMoveOnSparkline,
      mouseOutOfSparkline: mouseOutOfSparkline,
    }
  });
}

/** Callback for moving mouse on sparkline. */
function mouseMoveOnSparkline(state, data) {
  state.mouseOffsetFactor.set(data.f);
}

/** Callback for moving mouse out of sparkline. */
function mouseOutOfSparkline(state) {
  state.mouseOffsetFactor.set(-1);
}

/** The main render function. */
function render(globalState, state) {
  var data = state.data;

  var rows = tableRows.map(function(rowData) {
    var cols = rowData.columns.map(function(colData) {
      // Create a column for a metric.
      var colHeader = h('div.col-header', colData.label);
      var metricsData = data[colData.dataKey][colData.metricName];
      var sparkLines = metricsData.map(function(metricData) {
        // 100 is the default logical width of any svg graphs.
        var points = '0,100 100,100';
        if (metricData && metricData.HistoryTimestamps) {
          points = Util.genPolylinePoints(
            metricData.HistoryTimestamps, metricData.HistoryValues,
            data.MinTime, data.MaxTime,
            metricData.MinValue, metricData.MaxValue);
        }
        var curValue = Util.formatValue(metricData.CurrentValue);
        // Handle error when getting time series.
        var hasErrors = metricData.ErrMsg !== '';
        var extraColMetricClass = '';
        if (hasErrors) {
          curValue = '?';
          extraColMetricClass = '.err';
        }
        // Handle current value over threshold.
        var overThreshold = (
            colData.threshold && metricData.CurrentValue >= colData.threshold);
        var thresholdValue = -1;
        if (overThreshold) {
          extraColMetricClass = '.unhealthy';
          thresholdValue = (colData.threshold-metricData.MinValue)/
              (metricData.MaxValue-metricData.MinValue)*100.0;
        }
        // Handle stale data.
        var tsLen = metricData.HistoryTimestamps.length;
        if (tsLen > 0) {
          var lastTimestamp = metricData.HistoryTimestamps[tsLen - 1];
          if (data.MaxTime - lastTimestamp > 600) {
            extraColMetricClass = '.stale';
          }
        } else {
          extraColMetricClass = '.unhealthy';
        }

        // Mouse line.
        var extraCurValueClass = '';
        var mouseOffset = 100 * state.mouseOffsetFactor;
        if (!hasErrors && mouseOffset >= 0) {
          curValue = Util.formatValue(Util.interpolateValue(
              metricData.CurrentValue, state.mouseOffsetFactor,
              metricData.HistoryTimestamps, metricData.HistoryValues));
          extraCurValueClass = '.history';
        }

        return h('div.col-metric' + extraColMetricClass, {
          'title': hasErrors ?
              metricData.ErrMsg : metricData.Instance + ', ' + metricData.Zone,
          'ev-click': hg.send(globalState.channels.mouseClickOnMetric, {
            metricData: metricData,
            serviceName: rowData.rowHeader
          })
        }, [
          h('div.highlight-overlay'),
          renderMouseLine(mouseOffset),
          h('div.sparkline', {
            'ev-mousemove': new MouseMoveHandler(
                state.channels.mouseMoveOnSparkline),
            'ev-mouseout': hg.send(state.channels.mouseOutOfSparkline)
          }, [
            renderThreshold(thresholdValue),
            renderSparkline(points)
          ]),
          h('div.cur-value' + extraCurValueClass, [curValue])
        ]);
      });
      var items = [colHeader];
      items = items.concat(sparkLines);
      return h('div.col', items);
    });
    cols.unshift(h('div.row-header', Consts.getDisplayName(rowData.rowHeader)));
    return h('div.row', cols);
  });

  return h('div.status-table', rows);
}

/**
 * Renders sparkline for the given points.
 * @param {string} points - A string in the form of "x1,y1 x2,y2 ...".
 */
function renderSparkline(points) {
  return svg('svg', {
    'class': 'content',
    'viewBox': '0 0 100 100',
    'preserveAspectRatio': 'none'
  }, [
    svg('polyline', {'points': points}),
  ]);
}

/**
 * Renders threshold line.
 */
function renderThreshold(value) {
  return svg('svg', {
    'class': 'threshold',
    'viewBox': '0 0 100 100',
    'preserveAspectRatio': 'none'
  }, [
    svg('path', {
      'd': 'M 0 ' + value + ' L 100 ' + value,
      'stroke-dasharray': '2,2'
    }),
  ]);
}

/**
 * Renders mouse line at the given offset.
 * @param {Number} mouseOffset - The logical offset for the mouse line.
 */
function renderMouseLine(mouseOffset) {
  return svg('svg', {
    'class': 'mouse-line',
    'viewBox': '0 0 100 100',
    'preserveAspectRatio': 'none'
  }, [
    svg('polyline', {
      'points': mouseOffset + ',0 ' + mouseOffset + ',100'
    })
  ]);
}
