<!-- The <by-blame-page-sk> custom element declaration.

  A container element to display the current untriaged digests grouped by
  blames.

  Attributes:
    None

  Methods:
    pageSelected: This function has to be called if the page is selected
    via a route. It's  equivalent to the ready function, when we don't
    want to trigger loading the content unless a user selects the page.

  Events:
    None

  Mailboxes:
    None

-->

<link rel="import" href="bower_components/polymer/polymer.html">
<link rel="import" href="../common/imp/commit-panel.html" />

<link rel="import" href="shared-styles.html">
<link rel="import" href="activity-sk.html">

<dom-module id="byblame-page-sk">
  <template>
    <style include="shared-styles">
      commits-panel-sk,
      table {
        margin: 1em;
        display: block;
      }

      .byBlameWrapper {
        margin-left: 1em;
        margin-right: 1.5em;
        margin-top: 1em;
        margin-bottom: 2.5em;
      }

      .group {
        background: white;
        margin-bottom: 2em;
        margin-left: 0;
        margin-right: 0;
        margin-top: 0;
        border: solid 1px gray;
        padding: 1em;
        box-shadow: 11px 11px 31px 1px rgba(0, 0, 0, 0.52);
      }

      td, th {
        padding: 0.3em;
      }

      th {
        text-align: left;
      }

    </style>
    <div class="byBlameWrapper">
      <activity-sk id="activityMain" busy="{{_hideAll}}"></activity-sk>
      <div hidden$="{{_hideAll}}">
        <div hidden$="{{_hasEntries(data)}}">
          No untriaged digests.
        </div>

        <template is="dom-repeat" items="{{data}}">
          <div class="group">
            <a target="_blank" href$="/search?blame={{item.groupID}}&unt=true&head=true&{{_queryStr}}">
              {{item.nDigests}} digest(s) need triaging
            </a>

            <template is="dom-if" if="{{_noBlames(item)}}">
              <h3>No blamelist.</h3>
            </template>

            <template is="dom-if" if="{{!_noBlames(item)}}">
              <h3>Blame</h3>
              <commits-panel-sk commitinfo="[[item.commits]]" progress="[[_showProgress]]" repo="[[_repo]]"></commits-panel-sk>
            </template>

            <h3>Tests Affected</h3>
            <div>
              {{item.nTests}} tests affected.
            </div>

            <template is="dom-if" if="{{_hasAffectedTests(item)}}">
              <table>
                <tr><th>Test</th><th>Num Digests</th><th>Example</th></tr>
                <template is="dom-repeat" items="{{item.affectedTests}}">
                <tr>
                  <td>{{item.test}}</td><td>{{item.num}}</td>
                  <td><a target=_blank href$="{{_detailHref(item)}}">
                  {{item.sample_digest}}</a></td>
                </tr>
                </template>
              </table>
            </template>
          </div>
        </template>
      </div>
    </div>
  </template>

  <script>
    Polymer({
    	is: "byblame-page-sk",

      behaviors: [gold.PageStateBehavior],

      properties:{
        data: {
          type: Array,
          value: []
        },
        _repo: {
          type: String,
          value: sk.app_config.baseRepoURL
        },
        _showProgress: {
          type: Boolean,
          value: sk.app_config.showBotProgress
        }
      },

      ready: function() {
        this._setDefaultState(gold.defaultByBlameState, true);
      },

      // pageSelected is called by the router when this view enters the foreground.
    	pageSelected: function(ctx) {
        this._initState(ctx, this._getDefaultStateWithCorpus());
        this.set('_queryStr', window.location.search.slice(1));
        this._load();
    	},

      // pageDeselected is called by the router when this view enters the background.
      pageDeselected: function(routeName) {},

      _load: function() {
        var q = window.location.search;
        this.$.activityMain.startSpinner("Loading ...");
        sk.get("/json/byblame" + q).then(JSON.parse).then(function (json) {
          // Send the commits to the mailboxes identified by the group id.
          this.set('data', json.data);
          this.$.activityMain.stopSpinner();
        }.bind(this)).catch(function(e) {
          this.$.activityMain.stopSpinner();
          sk.errorMessage(e);
        }.bind(this));
      },

      _detailHref: function(item) {
        return '/detail' + gold.detailQuery(item.test, item.sample_digest);
      },

      _hasEntries: function(data) {
        return data && (data.length > 0);
      },

      _noBlames: function(item) {
        return !item.commits || (item.commits.lenght == 0);
      },

      _hasAffectedTests: function(item) {
        return !!item.affectedTests && (item.affectedTests.length > 0);
      }
    });
  </script>
</dom-module>
