<!--
Copyright (C) 2015 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.
-->

<link rel="import" href="../bower_components/polymer/polymer.html">
<link rel="import" href="../behaviors/rest-client-behavior.html">
<link rel="import" href="gr-ajax.html">
<link rel="import" href="gr-change-list.html">

<dom-module id="gr-change-list-view">
  <template>
    <style>
      :host {
        background-color: var(--view-background-color);
        display: block;
        margin: 0 1.25rem;
      }
      .loading {
        margin-top: 1em;
        color: #666;
        background-color: #f1f2f3;
      }
      gr-change-list {
        margin-top: 1em;
        width: 100%;
      }
      nav {
        margin-bottom: 1em;
        padding: .5em 0;
        text-align: center;
      }
      nav a {
        display: inline-block;
      }
      nav a:first-of-type {
        margin-right: .5em;
      }
      [hidden] {
        display: none !important;
      }
    </style>
    <gr-ajax
        auto
        url="/changes/"
        params="[[_computeQueryParams(_query, _offset)]]"
        last-response="{{_changes}}"
        loading="{{_loading}}"></gr-ajax>
    <div class="loading" hidden$="[[!_loading]]">Loading...</div>
    <div hidden$="[[_loading]]" hidden>
      <gr-change-list
          changes="{{_changes}}"
          selected-index="{{viewState.selectedChangeIndex}}"
          show-star="[[loggedIn]]"></gr-change-list>
      <nav>
        <a href$="[[_computeNavLink(_query, _offset, -1)]]"
           hidden$="[[_hidePrevArrow(_offset)]]">&larr; Prev</a>
        <a href$="[[_computeNavLink(_query, _offset, 1)]]"
           hidden$="[[_hideNextArrow(_changes.length)]]">Next &rarr;</a>
      </nav>
    </div>
  </template>
  <script>
  (function() {
    'use strict';

    var DEFAULT_NUM_CHANGES = 25;

    Polymer({
      is: 'gr-change-list-view',

      /**
       * Fired when the title of the page should change.
       *
       * @event title-change
       */

      properties: {
        /**
         * URL params passed from the router.
         */
        params: {
          type: Object,
          observer: '_paramsChanged',
        },

        /**
         * True when user is logged in.
         */
        loggedIn: {
          type: Boolean,
          value: false,
        },

        /**
         * State persisted across restamps of the element.
         */
        viewState: {
          type: Object,
          notify: true,
          value: function() { return {}; },
        },

        /**
         * Currently active query.
         */
        _query: String,

        /**
         * Offset of currently visible query results.
         */
        _offset: Number,

        /**
         * Change objects loaded from the server.
         */
        _changes: Array,

        /**
         * For showing a "loading..." string during ajax requests.
         */
        _loading: {
          type: Boolean,
          value: true,
        },
      },

      behaviors: [ Gerrit.RESTClientBehavior ],

      attached: function() {
        this.fire('title-change', {title: this._query});
      },

      _paramsChanged: function(value) {
        if (value.view != this.tagName.toLowerCase()) { return; }

        this._query = value.query;
        this._offset = value.offset || 0;
        if (this.viewState.query != this._query ||
            this.viewState.offset != this._offset) {
          this.set('viewState.selectedChangeIndex', 0);
          this.set('viewState.query', this._query);
          this.set('viewState.offset', this._offset);
        }

        this.fire('title-change', {title: this._query});
      },

      _computeQueryParams: function(query, offset) {
        var options = this.listChangesOptionsToHex(
            this.ListChangesOption.LABELS,
            this.ListChangesOption.DETAILED_ACCOUNTS
        );
        var obj = {
          n: DEFAULT_NUM_CHANGES,  // Number of results to return.
          O: options,
          S: offset || 0,
        };
        if (query && query.length > 0) {
          obj.q = query;
        }
        return obj;
      },

      _computeNavLink: function(query, offset, direction) {
        // Offset could be a string when passed from the router.
        offset = +(offset || 0);
        var newOffset = Math.max(0, offset + (25 * direction));
        var href = '/q/' + query;
        if (newOffset > 0) {
          href += ',' + newOffset;
        }
        return href;
      },

      _hidePrevArrow: function(offset) {
        return offset == 0;
      },

      _hideNextArrow: function(changesLen) {
        return changesLen < DEFAULT_NUM_CHANGES;
      },

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