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

  Polymer({
    is: 'gr-identities',

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

    behaviors: [
      Gerrit.BaseUrlBehavior,
    ],

    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';
    },
  });
})();
