<!--
Copyright (C) 2019 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<dom-module id="verify-status">
  <script type="text/javascript">
    if (window.Polymer) {
      Gerrit.install(function(plugin) {
          plugin.registerCustomComponent(
          'change-metadata-item', 'gr-verify-status-panel');
      });
    }
  </script>
</dom-module>

<dom-module id="gr-verify-status-panel">
  <template>
    <style include="gr-form-styles"></style>
    <style>
        .u-green {
            color: #388E3C;
        }
        .u-red {
            color: #D32F2F;
        }
    </style>
    <div id="verify-status">
        <span class="u-green">Passed: [[verifyStatus.summary.passed]]</span>,
        <span class="u-red">Failed: [[verifyStatus.summary.failed]]</span>,
        <span class="u-black">Not done: [[verifyStatus.summary.notdone]]</span>
    </div>
    <div class="separatedSection style-scope gr-change-metadata"
        style="margin-top: 0; padding: 0">
      <table class="test_result_table">
        <tbody>
            <template is="dom-repeat" items="{{verifyStatus.results}}">
            <tr>
                <td class="cell verifiedstatus"><a href$="[[item.url]]">[[item.name]]</a></td>
                <td class="cell verifiedstatus verifiedstatus_value">[[item.value]]</td>
            </tr>
            </template>
        </tbody>
      </table>
    </div>
  </template>
  <script type="text/javascript">
    (function() {
      'use strict';
      const Defs = {};
      /**
       * @typedef {{
       *   summary: Object,
       *   results: Array,
       * }}
       */
      Defs.verifyStatus;

      Polymer({
        is: 'gr-verify-status-panel',

        properties: {
            verifyStatus: {
                /** @type {Defs.verifystatus} */
                type: Object,
            },
            revision: {
                type: Object,
            },
            change: {
                type: Object,
            }
        },

        attached() {
            this._fetchData(this.revision);
        },

        _fetchData(revision) {
          if (!revision) return;
          const query ='/verify-status~verifications?sort=REPORTER&filter=CURRENT';
          const endpoint = '/changes/' + this.change.id + '/revisions/' +
                           revision._number + query;

          const errFn = response => {
              this.fire('page-error', {response});
          };

          this.plugin.restApi().get(endpoint, errFn).then(r => {
              let summary = {failed:0, passed:0, notdone:0};
              let results = [];
              for (let checkid in r) {
                  let check= r[checkid];
                  if (check.value == '0') {
                      summary.notdone +=1;}
                  else if (check.value == 1) {
                      summary.passed +=1;
                  }
                  else {
                      summary.failed +=1;
                  }
                  results.push(check);
              };

              this.verifyStatus = {summary, results};
          });
        },
      });
    }());
  </script>
</dom-module>
