import { getOwner } from 'discourse-common/lib/get-owner';
import { newInput, selectionTypes } from '../lib/wizard-mapper';
import { default as discourseComputed, observes, on } from 'discourse-common/utils/decorators';
import { later } from "@ember/runloop";
import Component from "@ember/component";
import { A } from "@ember/array";

export default Component.extend({
  classNames: 'wizard-mapper',
  
  didReceiveAttrs() {
    if (this.inputs && this.inputs.constructor !== Array) {
      later(() => this.set('inputs', null));
    }
  },
  
  @discourseComputed('inputs.@each.type')
  canAdd(inputs) {
    return !inputs ||
           inputs.constructor !== Array ||
           inputs.every(i => {
             return ['assignment','association'].indexOf(i.type) === -1;
           });
  },
  
  @discourseComputed('options.@each.inputType')
  inputOptions(options) {
    let result = {
      inputTypes: options.inputTypes || 'assignment,conditional',
      inputConnector: options.inputConnector || 'or',
      pairConnector: options.pairConnector || null,
      outputConnector: options.outputConnector || null,
      context: options.context || null
    }
        
    let inputTypes = ['key', 'value', 'output'];
    inputTypes.forEach(type => {
      result[`${type}Placeholder`] = options[`${type}Placeholder`] || null;
      result[`${type}DefaultSelection`] = options[`${type}DefaultSelection`] || null;
    });
    
    selectionTypes.forEach(type => {
      if (options[`${type}Selection`] !== undefined) {
        result[`${type}Selection`] = options[`${type}Selection`]
      } else {
        result[`${type}Selection`] = type === 'text' ? true : false;
      }
    });
                    
    return result;
  },
  
  onUpdate() {
  },

  actions: {
    add() {
      if (!this.get('inputs')) {
        this.set('inputs', A());
      }

      this.get('inputs').pushObject(
        newInput(this.inputOptions, this.inputs.length)
      );
      
      this.onUpdate(this.property, 'input');
    },

    remove(input) {
      const inputs = this.inputs;
      inputs.removeObject(input);
            
      if (inputs.length) {
        inputs[0].set('connector', null);
      }
      
      this.onUpdate(this.property, 'input');
    },
    
    inputUpdated(component, type) {
      this.onUpdate(this.property, component, type);
    }
  }
});