/**
 * @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';

  const GROUP_EVENTS = ['ADD_GROUP', 'REMOVE_GROUP'];

  Polymer({
    is: 'gr-group-audit-log',

    properties: {
      groupId: String,
      _auditLog: Array,
      _loading: {
        type: Boolean,
        value: true,
      },
    },

    behaviors: [
      Gerrit.ListViewBehavior,
    ],

    attached() {
      this.fire('title-change', {title: 'Audit Log'});
    },

    ready() {
      this._getAuditLogs();
    },

    _getAuditLogs() {
      if (!this.groupId) { return ''; }

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

      return this.$.restAPI.getGroupAuditLog(this.groupId, errFn)
          .then(auditLog => {
            if (!auditLog) {
              this._auditLog = [];
              return;
            }
            this._auditLog = auditLog;
            this._loading = false;
          });
    },

    _status(item) {
      return item.disabled ? 'Disabled' : 'Enabled';
    },

    itemType(type) {
      let item;
      switch (type) {
        case 'ADD_GROUP':
        case 'ADD_USER':
          item = 'Added';
          break;
        case 'REMOVE_GROUP':
        case 'REMOVE_USER':
          item = 'Removed';
          break;
        default:
          item = '';
      }
      return item;
    },

    _isGroupEvent(type) {
      return GROUP_EVENTS.indexOf(type) !== -1;
    },

    _computeGroupUrl(group) {
      if (group && group.url && group.id) {
        return Gerrit.Nav.getUrlForGroup(group.id);
      }

      return '';
    },

    _getIdForUser(account) {
      return account._account_id ? ' (' + account._account_id + ')' : '';
    },

    _getNameForGroup(group) {
      if (group && group.name) {
        return group.name;
      } else if (group && group.id) {
        // The URL encoded id of the member
        return decodeURIComponent(group.id);
      }

      return '';
    },
  });
})();
