import { computed, set } from "@ember/object";
import { alias, equal, or, not } from "@ember/object/computed";
import { newPair, connectorContent, inputTypesContent, defaultSelectionType, defaultConnector } from '../lib/wizard-mapper';
import Component from "@ember/component";
import { observes } from "discourse-common/utils/decorators";
import { A } from "@ember/array";

export default Component.extend({
  classNameBindings: [':mapper-input', 'inputType'],
  inputType: alias('input.type'),
  isConditional: equal('inputType', 'conditional'),
  isAssignment: equal('inputType', 'assignment'),
  isAssociation: equal('inputType', 'association'),
  isValidation: equal('inputType', 'validation'),
  hasOutput: or('isConditional', 'isAssignment'),
  hasPairs: or('isConditional', 'isAssociation', 'isValidation'),
  canAddPair: not('isAssignment'),
  connectors: computed(function() { return connectorContent('output', this.input.type, this.options) }),
  inputTypes: computed(function() { return inputTypesContent(this.options) }),
  
  @observes('input.type')
  setupType() {
    if (this.hasPairs && (!this.input.pairs || this.input.pairs.length < 1)) {
      this.send('addPair');
    }
    
    if (this.hasOutput) {
      this.set('input.output', null);
      
      if (!this.input.outputConnector) {
        const options = this.options;
        this.set('input.output_type', defaultSelectionType('output', options));
        this.set('input.output_connector', defaultConnector('output', this.inputType, options));
      }
    }
  },
    
  actions: {
    addPair() {
      if (!this.input.pairs) {
        this.set('input.pairs', A());
      }
      
      const pairs = this.input.pairs;
      const pairCount = pairs.length + 1;
            
      pairs.forEach(p => (set(p, 'pairCount', pairCount)));
      
      pairs.pushObject(
        newPair(
          this.input.type, 
          Object.assign(
            {},
            this.options,
            { index: pairs.length, pairCount }
          )
        )
      );
    },
    
    removePair(pair) {
      const pairs = this.input.pairs;
      const pairCount = pairs.length - 1;
      
      pairs.forEach(p => (set(p, 'pairCount', pairCount)));
      pairs.removeObject(pair);
    }
  }
});