/**
 * @license
 * Copyright (C) 2017 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.
 */
(function() {
  'use strict';

  /**
    * @appliesMixin Gerrit.FireMixin
    */
  class GrRepoDashboards extends Polymer.mixinBehaviors( [
    Gerrit.FireBehavior,
  ], Polymer.GestureEventListeners(
      Polymer.LegacyElementMixin(
          Polymer.Element))) {
    static get is() { return 'gr-repo-dashboards'; }

    static get properties() {
      return {
        repo: {
          type: String,
          observer: '_repoChanged',
        },
        _loading: {
          type: Boolean,
          value: true,
        },
        _dashboards: Array,
      };
    }

    _repoChanged(repo) {
      this._loading = true;
      if (!repo) { return Promise.resolve(); }

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

      this.$.restAPI.getRepoDashboards(this.repo, errFn).then(res => {
        if (!res) { return Promise.resolve(); }

        // Group by ref and sort by id.
        const dashboards = res.concat.apply([], res).sort((a, b) =>
          a.id < b.id ? -1 : 1);
        const dashboardsByRef = {};
        dashboards.forEach(d => {
          if (!dashboardsByRef[d.ref]) {
            dashboardsByRef[d.ref] = [];
          }
          dashboardsByRef[d.ref].push(d);
        });

        const dashboardBuilder = [];
        Object.keys(dashboardsByRef).sort().forEach(ref => {
          dashboardBuilder.push({
            section: ref,
            dashboards: dashboardsByRef[ref],
          });
        });

        this._dashboards = dashboardBuilder;
        this._loading = false;
        Polymer.dom.flush();
      });
    }

    _getUrl(project, id) {
      if (!project || !id) { return ''; }

      return Gerrit.Nav.getUrlForRepoDashboard(project, id);
    }

    _computeLoadingClass(loading) {
      return loading ? 'loading' : '';
    }

    _computeInheritedFrom(project, definingProject) {
      return project === definingProject ? '' : definingProject;
    }

    _computeIsDefault(isDefault) {
      return isDefault ? '✓' : '';
    }
  }

  customElements.define(GrRepoDashboards.is, GrRepoDashboards);
})();
