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

  Attributes:
    None

  Events:
    None

  Methods:
    None
-->
<link rel="import" href="/res/imp/bower_components/iron-ajax/iron-ajax.html">
<dom-module id="fuzzer-status-sk">
  <template>
  <style>
  :host{
    color: #000000;
  }
  </style>
    <div>
      Last Commit In Fuzz: <a href$="{{_getLink(current)}}" target="_blank">{{_getShortHash(current)}}
      - {{_getAuthor(current)}}</a>
    </div>
    <div>
      Updated: {{last_updated}} ago
    </div>
    <template is="dom-if" if="{{pending}}">
      <div>
        Update in progress: <a href$="{{_getLink(pending)}}" target="_blank">{{_getShortHash(pending)}}
        - {{_getAuthor(pending)}}</a>
      </div>
    </template>
    <iron-ajax auto url="/json/status" handle-as="json" last-response="{{_status}}"></iron-ajax>
  </template>
  <script>
  Polymer({
    is: "fuzzer-status-sk",

    properties: {
      _status: {
        type: Object,
        value: function() {
          return {
            current: {
              hash: "Loading",
              author: "loading (Loading)"
            },
            pending: {}
          };
        }
      },
      current: {
        type: Object,
        computed: "_getCurrent(_status)"
      },
      last_updated: {
        type: String,
        computed: "_getLastUpdated(_status)"
      },
      pending: {
        type: Object,
        computed: "_getPending(_status)"
      }
    },

    _getCurrent: function(status){
      return status.current;
    },

    _getLastUpdated: function(status){
      return sk.human.diffDate(status.lastUpdated);
    },

    _getPending: function(status){
      // Empty object is not considered falsey, so we check to see if it is empty.
      if (!status.pending || !status.pending.hash) {
        return undefined;
      }
      return status.pending;
    },

    _getShortHash: function(status) {
      return status.hash.substr(0, 7);
    },

    _getAuthor: function(status) {
      var a = status.author;
      var idx = a.indexOf('(');
      return a.substring(0, (idx === -1) ? a.length : idx);
    },

    _getLink:function(status) {
      return "https://skia.googlesource.com/skia/+/" + status.hash;
    }
  });
  </script>
</dom-module>
