<!DOCTYPE html>
<!--
Copyright (c) 2013 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="/perf_insights/function_handle.html">
<link rel="import" href="/perf_insights/mre/mre_result.html">
<link rel="import" href="/tracing/base/utils.html">
<link rel="import" href="/tracing/ui/analysis/generic_object_view.html">
<link rel="import" href="/tracing/ui/base/dom_helpers.html">
<link rel="import" href="/tracing/ui/side_panel/side_panel.html">
<link rel="import" href="/tracing/value/value.html">

<polymer-element name="pi-ui-map-function-side-panel"
                 extends="tr-ui-side-panel">
  <template>
  <style>
  :host {
    display: flex;
    flex-direction: column;
    min-width: 400px;
  }

  #top-nav {
    display: flex;
    flex: 0 0 auto;
    flex-direction: row;
  }

  #current-map-result {
    display: flex;
    flex: 1 1 auto;
    overflow: auto;
  }
  #current-map-result > * {
    min-width: 0;
    min-height: 0;
  }

  </style>
  <div id="top-nav"></div>
  <div id="current-map-result">
  </div>
  </template>
  <script>
  'use strict';
  Polymer({
    created: function() {
      this.model_ = undefined;
      this.currentMapFunctionTypeInfo_ = undefined;

      // Unused, currently.
      this.rangeOfInterest_ = undefined;
      this.selection_ = undefined;
    },

    ready: function() {
      var functionsByName = pi.FunctionRegistry.allFunctionsByName;
      var mapFunctionOptions = Object.keys(functionsByName).map(
          function(functionName) {
            return {
              label: functionName,
              value: functionsByName[functionName]
            };
          });

      var selector = tr.ui.b.createSelector(
          this, 'currentMapFunctionTypeInfo',
          'perf_insights.map_function_side_panel.mapFunction',
          mapFunctionOptions[0].value,
          mapFunctionOptions);
      this.shadowRoot.querySelector('#top-nav').appendChild(selector);
    },

    get rangeOfInterest() {
      return this.rangeOfInterest_;
    },

    set rangeOfInterest(rangeOfInterest) {
      this.rangeOfInterest_ = rangeOfInterest;
    },

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

    set selection(selection) {
      this.selection_ = selection;
    },

    get model() {
      return this.model_;
    },

    set model(model) {
      this.model_ = model;
      this.updateContents_();
    },

    supportsModel: function(m) {
      return {
        supported: true
      };
    },

    get currentMapFunctionTypeInfo() {
      return this.currentMapFunctionTypeInfo_;
    },

    set currentMapFunctionTypeInfo(currentMapFunctionTypeInfo) {
      this.currentMapFunctionTypeInfo_ = currentMapFunctionTypeInfo;
      this.updateContents_();
    },

    updateContents_: function() {
      var mapResultEl = this.shadowRoot.querySelector('#current-map-result');
      mapResultEl.textContent = '';

      if (this.model_ === undefined ||
          this.currentMapFunctionTypeInfo === undefined) {
        return;
      }

      var gov = document.createElement('tr-ui-a-generic-object-view');
      mapResultEl.appendChild(gov);

      var result = new pi.mre.MreResult();
      var canonicalUrl = document.location.toString();

      try {
        this.currentMapFunctionTypeInfo.constructor(result, this.model_);
      } catch (ex) {
        ex = tr.b.normalizeException(ex);
        gov.object = ex.stack;
        return;
      }

      gov.object = results.allValues.map(function(v) {
        return v.asDict();
      });
    },

    get textLabel() {
      return 'MapFunction Debugger';
    }
  });
  </script>
</polymer-element>
