<!-- The <gold-status-sk> element displays the status of gold

  Attributes:
    status: Input attribute that defines the current status. Should be in the format:
            {
              corpStatus: [
                {name: "svg", untriagedCount: 47, negativeCount:949 },
                {name: "colorImage", untriagedCount: 17, negativeCount:449 },
                {name: "gm", untriagedCount: 27, negativeCount:649 },
                {name: "image", untriagedCount: 61, negativeCount:9 }
              ],
              lastCommit: {
                hash: "136baaa927877e0f7fcc97acb456ee0d63f7f343",
                author: "username",
              }
            }

            The keys of corpStatus are the different corpora availalbe.

    corpus: Output attribute that reflects the currently selected corpus.

  Events:
    corpus-change: Fired whenever the corpus is changed by the user.

  Methods:
    setCorpus(corpus): Sets the current corpus to the given argument. It does
                       not fire a corpus-change event.
-->
<link rel="import" href="bower_components/polymer/polymer.html">
<link rel="import" href="bower_components/iron-flex-layout/iron-flex-layout-classes.html">
<dom-module id="gold-status-sk">
  <template>
    <style>
    .statusEntry {
      font-size: 12pt;
      display: inline-block;
      float: left;
      height: 48px;
      line-height: 48px;
      padding: 0 1em 0 1em;
      position: relative;
    }

    .statusEntry a {
      color: white;
    }
    </style>
    <template is="dom-if" if="{{status}}">
      <div class="statusEntry">
        <a href$="{{_commitURL(status.lastCommit.hash)}}" target="_blank">
           Last Commit: {{_lastCommitText(status)}}
        </a>
      </div>
    </template>
  </template>
  <script>
    Polymer({
      is: "gold-status-sk",

      properties: {
        status: {
          type: Object,
          value: null
        },
        corpus: {
          type: String,
          value: sk.app_config.defaultCorpus,
          notify: true,
          reflectToAttribute: true
        }
      },

      ready: function() {
        this.status = null;
        this._noFire = true;
        this._reload();
      },

      setCorpus: function(corpus) {
       // no longer used
      },

      // Load or reload the listing.
      _reload: function() {
        sk.get("/json/trstatus").then(JSON.parse).then(function (json) {
          if (JSON.stringify(json) != JSON.stringify(this.status)) {
            this.status = json;
          }

          this.async(this._reload, 3000);
        }.bind(this)).catch(function(errorMessage) {
          this.status = null;
          console.log("Status Error:", errorMessage);
          this.async(this._reload, 3000);
        }.bind(this));
      },

      _lastCommitText: function(status) {
        return this._limitTo(status.lastCommit.hash, 7) + " - " +  this._limitTo(status.lastCommit.author, 0);
      },

      // _limitTo is a custom filter that returns the first len characters of
      // a string or all characters before '(' - depending on len.
      _limitTo: function(val, len) {
        if (len > 0) {
          return val.substr(0, len);
        }
        var idx = val.indexOf('(');
        return val.substring(0, (idx === -1) ? val.length : idx);
      },

      // _commitURL returns the repository url for the given hash.
      _commitURL: function(hash) {
        var url = sk.app_config.baseRepoURL;
        if (!url) {
          // should never happen, but with Polymer, one can never be too cautious.
          return;
        }
        if (url.indexOf('github.com') !== -1) {
          return url + '/commit/' + hash;
        } else {
          return url + '/+show/' + hash;
        }
      }
    });
  </script>
</dom-module>
