text: import { inject as service } from '@ember/service';
  import Component from '@ember/component';
  import C from 'ui/utils/constants';
  import layout from './template';
  import { get, set, setProperties, computed } from '@ember/object';
  
  export default Component.extend({
    access:            service(),
    intl:              service(),
    globalStore:       service(),
    layout,
    allowTeams:        true,
    checking:          false,
    addInput:          '',
    allPrincipals:     null,
    selected:          null,
    selectExactOnBlur: true,
    includeLocal:      true,
    searchOnlyGroups:  false,
  
    init() {
      this._super(...arguments);
  
      set(this, 'allPrincipals', get(this, 'globalStore').all('principal'));
  
      if (this.initialPrincipal) {
        setProperties(this, {
          selected: this.initialPrincipal,
          filter:   this.initialPrincipal.name,
        });
      }
    },
  
    actions: {
      add() {
        if ( get(this, 'checking') ) {
          return;
        }
  
        const addInput = get(this, 'addInput');
  
        if ( !addInput ) {
          set(this, 'selected', null);
  
          if (this.action) {
            this.action(null);
          }
  
          // console.log('@add:Cleared principal');
  
          return;
        }
  
        set(this, 'checking', true);
  
        var input = get(addInput, 'value').trim();
        let match = get(this, 'allPrincipals').findBy('id', input);
  
        if (match) {
          this.send('selectExact', match);
  
          set(this, 'checking', false);
        } else {
          get(this, 'globalStore').rawRequest({
            url:    `principals/${ encodeURIComponent(input) }`,
            method: 'GET',
          }).then((xhr) => {
            if ( xhr.status === 204 ) {
              return;
            }
  
            if ( xhr.body && typeof xhr.body === 'object' ) {
              let principal = get(xhr, 'body');
  
              this.send('selectExact', principal);
            }
          }).catch((xhr) => {
            if (this.onError) {
              this.onError(`Principal not found: ${  xhr.statusText }`);
            }
          })
            .finally(() => {
              set(this, 'checking', false);
            });
        }
      },
  
      addObject(info) {
        if (this.action) {
          this.action(info);
        }
  
        setProperties(this, {
          selected: info,
          filter:   get(info, 'name')
        });
        // console.log('@addObject:Set principal:', JSON.stringify(info));
      },
  
      selectExact(match) {
        const cur = get(this, 'selected');
  
        if ( !cur ) {
          if (this.action) {
            this.action(match);
          }
  
          setProperties(this, {
            addInput: '',
            selected: match
          });
          // console.log('@selectExact:Set principal:', JSON.stringify(match));
        }
      },
    },
  
    showDropdown: computed('access.provider', function() {
      return get(this, 'access.provider') !== 'localauthconfig';
    }),
  
    addDisabled: computed('addInput.value', 'checking', function() {
      let input = get(this, 'addInput.value') || '';
  
      return get(this, 'checking') || input.trim().length === 0;
    }),
  
    dropdownChoices: computed('allPrincipals.@each.{logicalType,id}', 'allowTeams', function() {
      var allowTeams = get(this, 'allowTeams');
  
      return get(this, 'allPrincipals').filter((principal) => {
        var type = get(principal, 'parsedExternalType');
        var logicalType = get(principal, 'logicalType');
  
        // Don't show other junk that was added to the store after load
        if ( !get(principal, '_mine') ) {
          return false;
        }
  
        // Don't show people
        if ( logicalType === C.PROJECT.PERSON ) {
          return false;
        }
  
        // Don't show teams if disabled
        if ( !allowTeams && type === C.PROJECT.TYPE_GITHUB_TEAM ) {
          return false;
        }
  
        return true;
      }).sortBy('logicalTypeSort', 'profileUrl', 'name');
    }),
  
    dropdownLabel: computed('access.provider', 'intl.locale', function() {
      let out = '';
      let intl = get(this, 'intl');
  
      if ( get(this, 'access.provider') === 'githubconfig' ) {
        out = intl.t('inputIdentity.dropdownLabel.teams');
      } else {
        out = intl.t('inputIdentity.dropdownLabel.groups');
      }
  
      return out;
    }),
  });
  