<!--
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" type="text/css"></style>
<style type="text/css">
    .u-green {
        color: #388E3C;
    }

    .u-red {
        color: #D32F2F;
    }
</style>

<gr-verifiy-status-panel>
<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>

</gr-verifiy-status-panel> </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,
        },
        _verifystatus: {
             /** @type {Defs.verifystatus} */
             type: Object,
             computed: '_fetchData(revision)',
        },
    },
    attached() {
        this.plugin.attributeHelper(this).bind('revision', this._onRevisionChanged.bind(this));
    },

    _fetchData(revision) {
        const query ='/verify-status~verifications?sort=REPORTER&filter=CURRENT';
        const endpoint = '/changes/' + this.change.id + '/revisions/' +
                         this.__data__.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.set('verifystatus', {summary:summary, results: results});
        });
    },
    _onRevisionChanged(value) {
        console.log(`(attributeHelper.bind) revision number: ${value._number}`);
    },
});
/*}());*/
</script>
</dom-module>
