/**
 * @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
    */
  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);
})();
