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

  Polymer({
    is: 'gr-email-editor',
    _legacyUndefinedCheck: true,

    properties: {
      hasUnsavedChanges: {
        type: Boolean,
        notify: true,
        value: false,
      },

      _emails: Array,
      _emailsToRemove: {
        type: Array,
        value() { return []; },
      },
      /** @type {?string} */
      _newPreferred: {
        type: String,
        value: null,
      },
    },

    loadData() {
      return this.$.restAPI.getAccountEmails().then(emails => {
        this._emails = emails;
      });
    },

    save() {
      const promises = [];

      for (const emailObj of this._emailsToRemove) {
        promises.push(this.$.restAPI.deleteAccountEmail(emailObj.email));
      }

      if (this._newPreferred) {
        promises.push(this.$.restAPI.setPreferredAccountEmail(
            this._newPreferred));
      }

      return Promise.all(promises).then(() => {
        this._emailsToRemove = [];
        this._newPreferred = null;
        this.hasUnsavedChanges = false;
      });
    },

    _handleDeleteButton(e) {
      const index = parseInt(Polymer.dom(e).localTarget
          .getAttribute('data-index'), 10);
      const email = this._emails[index];
      this.push('_emailsToRemove', email);
      this.splice('_emails', index, 1);
      this.hasUnsavedChanges = true;
    },

    _handlePreferredControlTap(e) {
      if (e.target.classList.contains('preferredControl')) {
        e.target.firstElementChild.click();
      }
    },

    _handlePreferredChange(e) {
      const preferred = e.target.value;
      for (let i = 0; i < this._emails.length; i++) {
        if (preferred === this._emails[i].email) {
          this.set(['_emails', i, 'preferred'], true);
          this._newPreferred = preferred;
          this.hasUnsavedChanges = true;
        } else if (this._emails[i].preferred) {
          this.set(['_emails', i, 'preferred'], false);
        }
      }
    },
  });
})();
