<!DOCTYPE html>
<!--
Copyright 2015 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->

<link rel="import" href="/tracing/base/units/energy_in_joules.html">
<link rel="import" href="/tracing/base/units/power_in_watts.html">
<link rel="import" href="/tracing/model/event_set.html">
<link rel="import" href="/tracing/ui/base/table.html">
<link rel="import" href="/tracing/ui/units/time_stamp_span.html">

<polymer-element name="tr-ui-a-power-sample-summary-table">
  <template>
    <tr-ui-b-table id="table"></tr-ui-b-table>
  </template>
  <script>
  'use strict';

  Polymer({
    ready: function() {
      this.$.table.tableColumns = [
        {
          title: 'Min power',
          width: '100px',
          value: function(row) {
            return tr.b.units.PowerInWatts.format(row.min / 1000.0);
          }
        },
        {
          title: 'Max power',
          width: '100px',
          value: function(row) {
            return tr.b.units.PowerInWatts.format(row.max / 1000.0);
          }
        },
        {
          title: 'Time-weighted average',
          width: '100px',
          value: function(row) {
            return tr.b.units.PowerInWatts.format(
                row.timeWeightedAverage / 1000.0);
          }
        },
        {
          title: 'Energy consumed',
          width: '100px',
          value: function(row) {
            return tr.b.units.EnergyInJoules.format(row.energyConsumed);
          }
        },
        {
          title: 'Sample count',
          width: '100%',
          value: function(row) { return row.sampleCount; }
        }
      ];
      this.samples = new tr.model.EventSet();
    },

    get samples() {
      return this.samples_;
    },

    set samples(samples) {
      if (samples === this.samples)
        return;

      this.samples_ =
          (samples === undefined) ? new tr.model.EventSet() : samples;
      this.updateContents_();
    },

    updateContents_: function() {
      if (this.samples.length === 0) {
        this.$.table.tableRows = [];
      } else {
        this.$.table.tableRows = [{
          min: this.getMin(),
          max: this.getMax(),
          timeWeightedAverage: this.getTimeWeightedAverage(),
          energyConsumed: this.getEnergyConsumed(),
          sampleCount: this.samples.length
        }];
      }

      this.$.table.rebuild();
    },

    getMin: function() {
      return Math.min.apply(null, this.samples.map(function(sample) {
        return sample.power;
      }));
    },

    getMax: function() {
      return Math.max.apply(null, this.samples.map(function(sample) {
        return sample.power;
      }));
    },

    /**
     * Returns a time-weighted average of the power consumption in between the
     * first sample (inclusive) and last sample (exclusive).
     */
    getTimeWeightedAverage: function() {
      var energyConsumed = this.getEnergyConsumed();

      if (energyConsumed === 'N/A')
        return 'N/A';

      // Energy consumed is returned in Joules, so we can convert it to power by
      // dividing by time and milliWatts by multiplying by 1000.
      return this.getEnergyConsumed() / this.samples.bounds.duration * 1000;
    },

    getEnergyConsumed: function() {
      if (this.samples.length < 2)
        return 'N/A';

      var bounds = this.samples.bounds;
      return this.samples[0].series.getEnergyConsumed(bounds.min, bounds.max);
    }
  });
  </script>
</polymer-element>
