<!--
  This in an HTML Import-able file that contains the definition
  of the following elements:

    <build-popup-sk>

  To use this file import it:

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

  Usage:

    <build-popup-sk></build-popup-sk>

  Properties:
    build - Object representing the details for a build. Expect these attributes:
        builder:     String, name of the builder which ran this build.
        buildslave:  String, name of the buildslave.
        color:       String, color to be used for build result display.
        comments:    Array of comment objects.
        commits:     Array of strings indicating which commits were part of the build.
        failedSteps: Array of strings indicating which steps failed.
        finished:    Number indicating the timestamp when the build finished, or zero if it is still running.
        master:      String indicating the master of the build.
        number:      Number indicating the build number of this build.
        results:     Number indicating the result status code of the build.

    buildbot_url_prefix: Prefix of the buildbot URL.

    commit_details: Object whose keys are commit hashes and values are objects with the following attributes:
        shortAuthor:  String, shortened version of the commit author.
        shortHash:    String, shortened version of the commit hash.
        shortSubject: String, shortened version of the commit subject.

    repo: The name (not the URL) of the repository of the commit.
    repo_base: The base URL for commits. Commit hashes will be appended to this.

  Methods:
    None.

  Events:
    None.

  Note:
    The unobfuscate-status-page extension relies on the name and contents of
    this element.
-->
<link rel="import" href="/res/imp/bower_components/iron-flex-layout/iron-flex-layout-classes.html">
<link rel="import" href="/res/imp/bower_components/paper-button/paper-button.html">
<link rel="import" href="/res/common/imp/comments-sk.html">
<link rel="import" href="status-popup.html">
<dom-module id="build-popup-sk">
  <style is="custom-style" include="status-popup iron-flex">
    a {
      color: inherit;
    }
    h3 {
      white-space: nowrap;
    }
    paper-button[raised].colored {
      background: #D95F02;
      color: #fff;
      font-size: 1.0em;
      padding:5px;
      border-radius: 3px;
    }
    .retry {
      color: inherit;
      background-color: inherit;
      text-decoration:none;
    }
  </style>
  <template>
    <div class="horizontal layout wrap">
      <div class="flex">
        <h3>
          <a target="_blank" href$="{{_makeBuildURL(build, buildbot_url_prefix)}}">
            <span>{{build.builder}}</span> #<span>{{build.number}}</span> <iron-icon icon="launch"></iron-icon>
          </a>
        </h3>
      </div>
      <template is="dom-if" if="[[build.retryUrl]]">
        <div>
          <a href$="[[build.retryUrl]]" target="_blank" class="retry">
            <paper-button raised class="colored" role="button">Re-run Job</paper-button>
          </a>
        </div>
      </template>
    </div>
    <table>
      <tr>
        <td>Status:</td>
        <td style$="{{_buildResultStyle(build)}}">{{_buildResultString(build)}}</td>
      </tr>
      <template is="dom-if" if="{{_hasFailedSteps(build)}}">
        <tr>
          <td>Failed steps:</td>
          <td>
            <template is="dom-repeat" items="{{build.failedSteps}}" as="step">
              <a target="_blank" href$="{{_makeBuildStepLogURL(build, buildbot_url_prefix, step)}}">{{step}}</a><br>
            </template>
          </td>
        </tr>
      </template>
      <tr>
        <td>Other Tasks Like This</td>
        <td>
          <a target="_blank" rel="noopener" href$="{{_makeDashboardBuilderURL(build)}}">
            <span>{{build.builder}}</span>
          </a>
        </td>
      </tr>
      <tr>
        <td>Bot</td>
        <td>
          <a target="_blank" rel="noopener" href$="{{_makeSlaveHostURL(build)}}">
            [[build.buildslave]]
          </a>
        </td>
      </tr>
    </table>
    <hr/>
    <h3>Blamelist</h3>
    <table>
      <template is="dom-repeat" items="{{build.commits}}" as="c">
        <tr>
          <td><a href$="{{_makeCommitURL(c, repo_base)}}">{{_commitHash(c, commit_details)}}</a></td>
          <td>{{_commitAuthor(c, commit_details)}}</td>
          <td>{{_commitSubject(c, commit_details)}}</td>
        </tr>
      </template>
    </table>
    <hr/>
    <comments-sk
        comments="{{build.comments}}"
        add_comment_url="{{_makeAddCommentURL(build, repo)}}"
        on-submit="_commentAdded"
        allow_add_comment
        allow_delete_comment
        collapsible>
    </comments-sk>
  </template>
  <script>
    Polymer({
      is: 'build-popup-sk',
      behaviors: [SkiaBehaviors.StatusPopup],
      properties: {
        build: {
          type: Object,
          value: function() { return {}; },
        },

        buildbot_url_prefix: {
          type: String,
          value: "",
        },

        commit_details: {
          type: Object,
          value: function() { return {}; },
        },

        repo: {
          type: String,
          value: "",
        },

        repo_base: {
          type: String,
          value: "",
        }
      },

      _commentAdded: function() {
        window.location.href = window.location.href;
      },
      _makeBuildURL: function(build, buildbot_url_prefix) {
        if (build.url) {
          return build.url;
        } else {
          return buildbot_url_prefix + 'builders/' + build.builder + '/builds/' + build.number;
        }
      },
      _buildResultStyle: function(build) {
        return 'color: ' + build.color;
      },
      _hasFailedSteps: function(build) {
        return build.failedSteps && build.failedSteps.length > 0;
      },
      _makeDashboardBuilderURL: function(build) {
        if (build.dashboardBuilderUrl) {
          return build.dashboardBuilderUrl;
        } else {
          return '';
        }
      },
      _makeSlaveHostURL: function(build) {
        if (build.slaveHostUrl) {
          return build.slaveHostUrl;
        } else {
          return '';
        }
      },
      _makeAddCommentURL: function(build, repo) {
        return '/json/' + repo + '/builds/' + build.master + '/' + build.builder + '/' + build.number + '/comments';
      },
      _makeBuildStepLogURL: function(build, buildbot_url_prefix, step) {
        return buildbot_url_prefix + 'builders/' + build.builder + '/builds/' + build.number + '/steps/' + step + '/logs/stdio';
      },
      _makeCommitURL: function(c, repo_base) {
        return repo_base + c;
      },
      _buildResultString: function(build) {
        return build.finished ? build.results == 0 ? 'success' : build.results == 1 ? 'success' : build.results == 3 ? 'success' : build.results == 2 ? 'failed' : build.results == 4 ? 'exception' : 'exception' : 'running';
      },
      _commitHash: function(c, commit_details) {
        return commit_details[c] ? commit_details[c].shortHash : "";
      },
      _commitAuthor: function(c, commit_details) {
        return commit_details[c] ? commit_details[c].shortAuthor : "";
      },
      _commitSubject: function(c, commit_details) {
        return commit_details[c] ? commit_details[c].shortSubject : "";
      },

    });
  </script>
</dom-module>
