// Copyright (C) 2016 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';

  const DEFAULT_SECTIONS = [
    {
      name: 'Work in progress',
      query: 'is:open owner:${user} is:wip',
      selfOnly: true,
    },
    {
      name: 'Outgoing reviews',
      query: 'is:open owner:${user} -is:wip',
    },
    {
      name: 'Incoming reviews',
      query: 'is:open ((reviewer:${user} -owner:${user} -is:ignored) OR ' +
          'assignee:${user}) -is:wip',
    },
    {
      name: 'Recently closed',
      query: 'is:closed (owner:${user} OR reviewer:${user} OR ' +
          'assignee:${user})',
      suffixForDashboard: '-age:4w limit:10',
    },
  ];

  Polymer({
    is: 'gr-dashboard-view',

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

    properties: {
      account: {
        type: Object,
        value() { return {}; },
      },
      /** @type {{ selectedChangeIndex: number }} */
      viewState: Object,
      params: {
        type: Object,
      },

      _results: Array,
      _sectionMetadata: {
        type: Array,
        value() { return DEFAULT_SECTIONS; },
      },

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

    observers: [
      '_userChanged(params.user)',
    ],

    behaviors: [
      Gerrit.RESTClientBehavior,
    ],

    get options() {
      return this.listChangesOptionsToHex(
          this.ListChangesOption.LABELS,
          this.ListChangesOption.DETAILED_ACCOUNTS,
          this.ListChangesOption.REVIEWED
      );
    },

    _computeTitle(user) {
      if (user === 'self') {
        return 'My Reviews';
      }
      return 'Dashboard for ' + user;
    },

    /**
     * Allows a refresh if menu item is selected again.
     */
    _userChanged(user) {
      if (!user) { return; }

      // NOTE: This method may be called before attachment. Fire title-change
      // in an async so that attachment to the DOM can take place first.
      this.async(
          () => this.fire('title-change', {title: this._computeTitle(user)}));

      this._loading = true;
      const sections = this._sectionMetadata.filter(
          section => (user === 'self' || !section.selfOnly));
      const queries =
          sections.map(
              section => this._dashboardQueryForSection(section, user));
      this.$.restAPI.getChanges(null, queries, null, this.options)
          .then(results => {
            this._results = sections.map((section, i) => {
              return {
                sectionName: section.name,
                query: queries[i],
                results: results[i],
              };
            });
            this._loading = false;
          }).catch(err => {
            this._loading = false;
            console.warn(err.message);
          });
    },

    _dashboardQueryForSection(section, user) {
      const query =
          section.suffixForDashboard ?
          section.query + ' ' + section.suffixForDashboard :
          section.query;
      return query.replace(/\$\{user\}/g, user);
    },

  });
})();
