Show:
import Ember from 'ember';

import FdDataTypes from '../utils/fd-datatypes';
import FdEditformControl from '../objects/fd-editform-control';
import FdEditformGroup from '../objects/fd-editform-group';
import FdEditformTab from '../objects/fd-editform-tab';

export default Ember.Component.extend({
  /**
    Contains stage's enums.

    @property enums
    @type Ember.A()
    @default undefined
  */
  enums: undefined,

  /**
    Contains stage's typemap.

    @property typemap
    @type Ember.A()
    @default undefined
  */
  typemap: undefined,

  /**
    Contains stage's types.

    @property fbtypes
    @type Ember.A()
    @default undefined
  */
  fbtypes: undefined,

  /**
    @private
    @property _selectedIsControl
    @readOnly
    @type Boolean
  */
  _selectedIsControl: Ember.computed('selectedControl', function() {
    return this.get('selectedControl') instanceof FdEditformControl;
  }).readOnly(),

  /**
    @private
    @property _selectedIsGroup
    @readOnly
    @type Boolean
  */
  _selectedIsGroup: Ember.computed('selectedControl', function() {
    return this.get('selectedControl') instanceof FdEditformGroup;
  }).readOnly(),

  /**
    @private
    @property _selectedIsTab
    @readOnly
    @type Boolean
  */
  _selectedIsTab: Ember.computed('selectedControl', function() {
    return this.get('selectedControl') instanceof FdEditformTab;
  }).readOnly(),

  /**
    The selected control.

    @property selectedControl
    @type FdEditformControl|FdEditformGroup|FdEditformTab
  */
  selectedControl: undefined,

  /**
    Observer, checks if selected control changed and changes selectedType.

    @method selectedControlChanged
  */
  selectedControlChanged: Ember.observer('selectedControl', function() {
    let selectedControl = this.get('selectedControl');
    this.set('selectedType', this.getTranslationString(selectedControl.type));
  }),

  _dataTypes: FdDataTypes.create(),

  _readonly: Ember.computed.empty('selectedControl'),

  /**
    All types with properties.

    @property types
    @type Ember.A()
    @default undefined
  */
  types: undefined,

  /**
    Strings shown to user.

    @property typesAsStrings
    @type Ember.A()
  */
  typesAsStrings: undefined,

  /**
    Dictionary: type to locale key.

    @property typeToString
    @type Object
  */
  typeToString: {
    string: 'components.fd-visual-control.typeName.stringControlType',
    bool: 'components.fd-visual-control.typeName.boolControlType',
    char: 'components.fd-visual-control.typeName.charControlType',
    guid: 'components.fd-visual-control.typeName.guidControlType',
    decimal: 'components.fd-visual-control.typeName.decimalControlType',
    double: 'components.fd-visual-control.typeName.doubleControlType',
    float: 'components.fd-visual-control.typeName.floatControlType',
    sbyte: 'components.fd-visual-control.typeName.sbyteControlType',
    short: 'components.fd-visual-control.typeName.shortControlType',
    byte: 'components.fd-visual-control.typeName.byteControlType',
    int: 'components.fd-visual-control.typeName.intControlType',
    long: 'components.fd-visual-control.typeName.longControlType',
    uint: 'components.fd-visual-control.typeName.uintControlType',
    ushort: 'components.fd-visual-control.typeName.ushortControlType',
    ulong: 'components.fd-visual-control.typeName.ulongControlType',
    date: 'components.fd-visual-control.typeName.dateControlType', //?
    time: 'components.fd-visual-control.typeName.dateControlType', //?
    file: 'components.fd-visual-control.typeName.fileControlType',
    dropdown: 'components.fd-visual-control.typeName.drowdownControlType',
    lookup: 'components.fd-visual-control.typeName.lookupControlType',
  },

  /**
    Gets translated string for type.

    @method getTranslationString
    @return String
  */
  getTranslationString(type) {
    let userString;
    let tts = this.get('typeToString');
    userString = tts[type];

    if (userString === undefined) {
      for (let ts in tts) {
        if (type.toLowerCase().indexOf(ts) !== -1) {
          userString = tts[ts];
          break;
        }
      }
    }

    if (userString === undefined) {
      userString = type;
    }

    return userString;
  },

  /**
    Gets types array from stage.

    @method getAllTypes
  */
  getAllTypes() {
    let typemap = this.get('typemap');
    let enums = this.get('enums');
    let fbtypes = this.get('fbtypes');
    let ret = Ember.A();
    let retStrings = Ember.A();

    for (let type of typemap) {
      let obj = {};
      obj.type = type.name;
      if (type.name.indexOf('null') !== -1 || type.name.indexOf('Null') !== -1) {
        obj.nullable = true;
      } else {
        obj.nullable = false;
      }

      obj.userString = this.getTranslationString(obj.type);
      retStrings.push(obj.userString);
      ret.push(obj);
    }

    for (let sEnum of enums.content) {
      let obj = {};
      obj.type = sEnum._data.nameStr;
      if (obj.type.indexOf('null') !== -1 || obj.type.indexOf('Null') !== -1) {
        obj.nullable = true;
      } else {
        obj.nullable = false;
      }

      obj.userString = this.getTranslationString(obj.type);
      retStrings.push(obj.userString);
      ret.push(obj);
    }

    for (let type of fbtypes.content) {
      let obj = {};
      obj.type = type._data.caption;
      if (obj.type.indexOf('null') !== -1 || obj.type.indexOf('Null') !== -1) {
        obj.nullable = true;
      } else {
        obj.nullable = false;
      }

      obj.userString = this.getTranslationString(obj.type);
      retStrings.push(obj.userString);
      ret.push(obj);
    }

    if (ret.length !== 0) {
      this.set('types', ret);
      this.set('typesAsStrings', retStrings);
    } else {
      this.set('types', [
        {
          nullable: false,
          type: 'bool',
          userString: 'components.fd-visual-control.typeName.boolControlType'
        },
        {
          nullable: false,
          type: 'int',
          userString: 'components.fd-visual-control.typeName.boolintControlType'
        },
        {
          nullable: false,
          type: 'string',
          userString: 'components.fd-visual-control.typeName.dateControlType'
        }
      ]);
      this.set('typesAsStrings', [
        'components.fd-visual-control.typeName.stringControlType',
        'components.fd-visual-control.typeName.boolControlType',
        'components.fd-visual-control.typeName.intControlType',
        'components.fd-visual-control.typeName.dateControlType'
      ]);
    }

  },

  /**
    Contains selected type locale key.

    @property selectedType
    @type String
  */
  selectedType: undefined,

  allowNull: Ember.computed('selectedControl.notNull', {
    get() {
      return !this.get('selectedControl.notNull');
    },

    set(key, value) {
      return this.set('selectedControl.notNull', !value);
    },
  }),

  defaultValueControl: Ember.computed('selectedControl.type', function() {
    switch (this.get('selectedControl.type')) {
      default:
        return 'flexberry-textbox';
    }
  }),

  /**
    Initialization hook.

    @method init
  */
  init() {
    this._super(...arguments);
    this.getAllTypes();
  },

  actions: {
    /**
      Action, triggered by dropdown selection changed.

      @method actions.onDropDownSelectionChanged
    */
    onDropDownSelectionChanged() {
      let selectedType = this.get('selectedType');
      let tts = this.get('typeToString');
      for (let tt in tts) {
        if (tts[tt] === selectedType) {
          this.set('selectedControl.type', tt);
          break;
        }
      }
    },
  }
});