/**
 * @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.
 */
import '../../../styles/shared-styles.js';
import '../../../styles/gr-form-styles.js';
import '../../admin/gr-confirm-delete-item-dialog/gr-confirm-delete-item-dialog.js';
import '../../shared/gr-button/gr-button.js';
import '../../shared/gr-overlay/gr-overlay.js';
import '../../shared/gr-rest-api-interface/gr-rest-api-interface.js';
import {GestureEventListeners} from '@polymer/polymer/lib/mixins/gesture-event-listeners.js';
import {LegacyElementMixin} from '@polymer/polymer/lib/legacy/legacy-element-mixin.js';
import {PolymerElement} from '@polymer/polymer/polymer-element.js';
import {htmlTemplate} from './gr-identities_html.js';
import {getBaseUrl} from '../../../utils/url-util.js';

const AUTH = [
  'OPENID',
  'OAUTH',
];

/**
 * @extends PolymerElement
 */
class GrIdentities extends GestureEventListeners(
    LegacyElementMixin(
        PolymerElement)) {
  static get template() { return htmlTemplate; }

  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 = getBaseUrl() || '';
    let pathname = window.location.pathname;
    if (baseUrl) {
      pathname = '/' + pathname.substring(baseUrl.length);
    }
    return baseUrl + '/login/' + encodeURIComponent(pathname) + '?link';
  }
}

customElements.define(GrIdentities.is, GrIdentities);
