/**
 * @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 AUTH = [
    'OPENID',
    'OAUTH',
  ];

  /**
   * @appliesMixin Gerrit.BaseUrlMixin
   * @extends Polymer.Element
   */
  class GrIdentities extends Polymer.mixinBehaviors( [
    Gerrit.BaseUrlBehavior,
  ], Polymer.GestureEventListeners(
      Polymer.LegacyElementMixin(
          Polymer.Element))) {
    static get is() { return 'gr-identities'; }

    static get properties() {
      return {
        _identities: Object,
        _idName: String,
        serverConfig: Object,
        _showLinkAnotherIdentity: {
          type: Boolean,
          computed: '_computeShowLinkAnotherIdentity(serverConfig)',
        },
      };
    }

    loadData() {
      return this.$.restAPI.getExternalIds().then(id => {
        this._identities = id;
      });
    }

    _computeIdentity(id) {
      return id && id.startsWith('mailto:') ? '' : id;
    }

    _computeHideDeleteClass(canDelete) {
      return canDelete ? 'show' : '';
    }

    _handleDeleteItemConfirm() {
      this.$.overlay.close();
      return this.$.restAPI.deleteAccountIdentity([this._idName])
          .then(() => { this.loadData(); });
    }

    _handleConfirmDialogCancel() {
      this.$.overlay.close();
    }

    _handleDeleteItem(e) {
      const name = e.model.get('item.identity');
      if (!name) { return; }
      this._idName = name;
      this.$.overlay.open();
    }

    _computeIsTrusted(item) {
      return item ? '' : 'Untrusted';
    }

    filterIdentities(item) {
      return !item.identity.startsWith('username:');
    }

    _computeShowLinkAnotherIdentity(config) {
      if (config && config.auth &&
          config.auth.git_basic_auth_policy) {
        return AUTH.includes(
            config.auth.git_basic_auth_policy.toUpperCase());
      }

      return false;
    }

    _computeLinkAnotherIdentity() {
      const baseUrl = this.getBaseUrl() || '';
      let pathname = window.location.pathname;
      if (baseUrl) {
        pathname = '/' + pathname.substring(baseUrl.length);
      }
      return baseUrl + '/login/' + encodeURIComponent(pathname) + '?link';
    }
  }

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