<!--
  This in an HTML Import-able file that contains the JS and HTML Templates for
  the version-sk element.

  To use this file import it:

    <link href="/res/imp/version-sk.html" rel="import" />

  Properties:
    commit - The Git commit hash of the running code.

    short_commit - A shortened versioned of commit.

    date - The build date of the running code.

  Methods:
    None.

  Events:
    None.
-->
<link rel="import" href="/res/imp/bower_components/polymer/polymer.html">
<link rel="import" href="/res/imp/bower_components/iron-icons/iron-icons.html">
<link rel="import" href="/res/imp/bower_components/paper-icon-button/paper-icon-button.html">
<link rel="import" href="/res/imp/bower_components/paper-tooltip/paper-tooltip.html">
<dom-module id="version-sk">
  <template>
    <style>
    :host {
      font-size: 15px;
      color: var(--version-sk-color, #000000);
    }
    paper-icon-button {
      --iron-icon-height: 15px;
      --iron-icon-width: 15px;
      padding: 0px;
    }
    .hidden {
      visibility: hidden;
    }
    </style>
    <span>
      <paper-icon-button id="reloadButton" icon="icons:refresh" on-click="_reload" class$="{{_buttonClass(_needReload)}}"></paper-icon-button>
      <paper-tooltip for="reloadButton">A new version is available. Click to reload.</paper-tooltip>
      version: <a id="link" href$="{{_commitUrl(commit)}}" title$="{{date}}" target="_blank">{{short_commit}}</a>
    </span>
  </template>
  <script>
  (function() {
    Polymer({
      is: "version-sk",

      properties: {
        /**
         * The Git commit hash of the running code.
         */
        commit: {
          type: String,
          value: "???",
          readOnly: true,
        },

        /**
         * A shortened versioned of commit.
         */
        short_commit: {
          type: String,
          computed: "_shortCommit(commit)",
        },

        /**
         * The build date of the running code.
         */
        date: {
          type: String,
          value: "???",
          readOnly: true,
        },

        _needReload: {
          type: Boolean,
          value: false,
        },
      },

      ready: function() {
        this._getVersion();
        setInterval(function() {
          this._getVersion();
        }.bind(this), 300000);
      },

      _buttonClass: function(needReload) {
        if (!needReload) {
          return "hidden";
        }
        return "";
      },

      _commitUrl: function(commit) {
        return "https://skia.googlesource.com/buildbot/+show/" + commit;
      },

      _getVersion: function() {
        sk.get("/json/version").then(JSON.parse).then(function(json) {
          if (this.commit == "???") {
            this._setCommit(json.commit);
            this._setDate(json.date);
          } else if (this.commit != json.commit) {
            console.log("Need reload!");
            this._needReload = true;
          }
        }.bind(this));
      },

      _reload: function() {
        window.location.href = window.location.href;
      },

      _shortCommit: function(commit) {
        return commit.substring(0, 7);
      },
    });
  }());
  </script>
</dom-module>
