<!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="/core/analysis/analysis_link.html">
<link rel="import" href="/core/analysis/table_builder.html">
<link rel="import" href="/base/ui/dom_helpers.html">

<polymer-element name="tv-c-a-related-flows">
  <template>
    <style>
    :host {
      display: flex;
      flex-direction: column;
    }
    #table {
      flex: 1 1 auto;
      align-self: stretch;
    }
    </style>
    <tracing-analysis-nested-table id="table"></tracing-analysis-nested-table>
  </template>

  <script>
  'use strict';

  Polymer({
    ready: function() {
      this.inSelection_ = undefined;
      this.outSelection_ = undefined;
      this.internalSelection_ = undefined;

      this.$.table.tableColumns = [
        {
          title: 'Direction',
          value: function(row) { return row.direction; },
          width: '150px'
        },
        {
          title: 'Title',
          width: '100%',
          value: function(row) {
            var linkEl = document.createElement('tv-c-analysis-link');
            linkEl.setSelectionAndContent(function() {
                return new tv.c.Selection(row.event);
            });
            linkEl.appendChild(tv.b.ui.createSpan({
              textContent: row.event.title
            }));
            return linkEl;
          }
        }
      ];
    },

    clearFlows: function() {
      this.inSelection_ = undefined;
      this.outSelection_ = undefined;
      this.internalSelection_ = undefined;
      this.updateContents_();
    },

    setFlows: function(inSelection, outSelection, opt_internalSelection) {
      this.inSelection_ = inSelection;
      this.outSelection_ = outSelection;
      if (opt_internalSelection)
        this.internalSelection_ = opt_internalSelection;
      else
        this.internalSelection_ = new tv.c.Selection();
      this.updateContents_();
    },

    updateContents_: function() {
      var table = this.$.table;
      if (this.inSelection_ === undefined || this.outSelection_ === undefined) {
        table.tableRows = [];
        table.rebuild();
        return;
      }

      var rows = [];
      this.inSelection_.forEach(function(fe) {
        rows.push({
          direction: 'Incoming',
          event: fe
        });
      });
      this.outSelection_.forEach(function(fe) {
        rows.push({
          direction: 'Outgoing',
          event: fe
        });
      });
      this.internalSelection_.forEach(function(fe) {
        rows.push({
          direction: 'Internal',
          event: fe
        });
      });

      table.tableRows = rows;
      table.rebuild();
    }
  });
  </script>
</polymer-element>
