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

  class GrGpgEditor extends Polymer.GestureEventListeners(
      Polymer.LegacyElementMixin(
          Polymer.Element)) {
    static get is() { return 'gr-gpg-editor'; }

    static get properties() {
      return {
        hasUnsavedChanges: {
          type: Boolean,
          value: false,
          notify: true,
        },
        _keys: Array,
        /** @type {?} */
        _keyToView: Object,
        _newKey: {
          type: String,
          value: '',
        },
        _keysToRemove: {
          type: Array,
          value() { return []; },
        },
      };
    }

    loadData() {
      this._keys = [];
      return this.$.restAPI.getAccountGPGKeys().then(keys => {
        if (!keys) {
          return;
        }
        this._keys = Object.keys(keys)
            .map(key => {
              const gpgKey = keys[key];
              gpgKey.id = key;
              return gpgKey;
            });
      });
    }

    save() {
      const promises = this._keysToRemove.map(key => {
        this.$.restAPI.deleteAccountGPGKey(key.id);
      });

      return Promise.all(promises).then(() => {
        this._keysToRemove = [];
        this.hasUnsavedChanges = false;
      });
    }

    _showKey(e) {
      const el = Polymer.dom(e).localTarget;
      const index = parseInt(el.getAttribute('data-index'), 10);
      this._keyToView = this._keys[index];
      this.$.viewKeyOverlay.open();
    }

    _closeOverlay() {
      this.$.viewKeyOverlay.close();
    }

    _handleDeleteKey(e) {
      const el = Polymer.dom(e).localTarget;
      const index = parseInt(el.getAttribute('data-index'), 10);
      this.push('_keysToRemove', this._keys[index]);
      this.splice('_keys', index, 1);
      this.hasUnsavedChanges = true;
    }

    _handleAddKey() {
      this.$.addButton.disabled = true;
      this.$.newKey.disabled = true;
      return this.$.restAPI.addAccountGPGKey({add: [this._newKey.trim()]})
          .then(key => {
            this.$.newKey.disabled = false;
            this._newKey = '';
            this.loadData();
          }).catch(() => {
            this.$.addButton.disabled = false;
            this.$.newKey.disabled = false;
          });
    }

    _computeAddButtonDisabled(newKey) {
      return !newKey.length;
    }
  }

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