<!DOCTYPE html>
<!--
Copyright (c) 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/metrics/value_list.html">
<link rel="import" href="/tracing/ui/analysis/analysis_sub_view.html">
<link rel="import" href="/tracing/ui/analysis/single_event_sub_view.html">
<link rel="import" href="/tracing/value/ui/scalar_span.html">
<link rel="import" href="/tracing/value/unit.html">

<polymer-element name="tr-ui-a-single-user-expectation-sub-view"
    extends="tr-ui-a-sub-view">
  <script>
  'use strict';

  Polymer({
    created: function() {
      this.currentSelection_ = undefined;
      this.realView_ = undefined;
    },

    get selection() {
      return this.currentSelection_;
    },

    set selection(selection) {
      this.textContent = '';
      this.realView_ = document.createElement('tr-ui-a-single-event-sub-view');
      this.realView_.addEventListener('customize-rows',
          this.onCustomizeRows_.bind(this));

      this.appendChild(this.realView_);
      this.currentSelection_ = selection;
      this.realView_.setSelectionWithoutErrorChecks(selection);
    },

    get relatedEventsToHighlight() {
      if (!this.currentSelection_)
        return undefined;
      return this.currentSelection_[0].associatedEvents;
    },

    onCustomizeRows_: function(event) {
      var ue = this.selection[0];

      var valueList = new tr.metrics.ValueList();

      function runMetric(metricInfo) {
        try {
          metricInfo.constructor(valueList, ue.parentModel);
        } catch (failure) {
          console.error(metricInfo, failure);
        }
      }

      tr.metrics.MetricRegistry.getAllRegisteredTypeInfos().forEach(runMetric);

      // Metrics may have been computed more than once, so avoid displaying them
      // more than once by collecting them in a dictionary.
      // https://github.com/catapult-project/catapult/issues/2154
      var metricValues = {};

      valueList.valueDicts.forEach(function(value) {
        if (value.grouping_keys.userExpectationStableId !== ue.stableId)
          return;

        if ((value.type !== 'numeric') ||
            (value.numeric.type !== 'scalar'))
          return;

        metricValues[value.grouping_keys.name] = value.numeric;
      });

      for (var name in metricValues) {
        event.rows.push({
          name: name,
          value: tr.v.ui.createScalarSpan(metricValues[name].value, {
            unit: tr.v.Unit.fromJSON(metricValues[name].unit)
          })
        });
      }

      if (ue.rawCpuMs) {
        event.rows.push({
          name: 'Total CPU',
          value: tr.v.ui.createScalarSpan(ue.totalCpuMs, {
            unit: tr.v.Unit.byName.timeDurationInMs
          })
        });
      }
    }
  });
  </script>
</polymer-element>
