/**
 * @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';
import '../../../styles/gr-form-styles';
import '../../admin/gr-confirm-delete-item-dialog/gr-confirm-delete-item-dialog';
import '../../shared/gr-button/gr-button';
import '../../shared/gr-overlay/gr-overlay';
import '../../shared/gr-rest-api-interface/gr-rest-api-interface';
import {GestureEventListeners} from '@polymer/polymer/lib/mixins/gesture-event-listeners';
import {LegacyElementMixin} from '@polymer/polymer/lib/legacy/legacy-element-mixin';
import {PolymerElement} from '@polymer/polymer/polymer-element';
import {htmlTemplate} from './gr-identities_html';
import {getBaseUrl} from '../../../utils/url-util';
import {customElement, property} from '@polymer/decorators';
import {AccountExternalIdInfo, ServerInfo} from '../../../types/common';
import {GrOverlay} from '../../shared/gr-overlay/gr-overlay';
import {PolymerDomRepeatEvent} from '../../../types/types';
import {appContext} from '../../../services/app-context';

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

export interface GrIdentities {
  $: {
    overlay: GrOverlay;
  };
}

@customElement('gr-identities')
export class GrIdentities extends GestureEventListeners(
  LegacyElementMixin(PolymerElement)
) {
  static get template() {
    return htmlTemplate;
  }

  @property({type: Array})
  _identities: AccountExternalIdInfo[] = [];

  @property({type: String})
  _idName?: string;

  @property({type: Object})
  serverConfig?: ServerInfo;

  @property({
    type: Boolean,
    computed: '_computeShowLinkAnotherIdentity(serverConfig)',
  })
  _showLinkAnotherIdentity?: boolean;

  private readonly restApiService = appContext.restApiService;

  loadData() {
    return this.restApiService.getExternalIds().then(id => {
      this._identities = id ?? [];
    });
  }

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

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

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

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

  _handleDeleteItem(e: PolymerDomRepeatEvent<AccountExternalIdInfo>) {
    const name = e.model.item.identity;
    if (!name) {
      return;
    }
    this._idName = name;
    this.$.overlay.open();
  }

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

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

  _computeShowLinkAnotherIdentity(config?: ServerInfo) {
    if (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';
  }
}

declare global {
  interface HTMLElementTagNameMap {
    'gr-identities': GrIdentities;
  }
}
