text: var _ = require('underscore');
  var StyleDefaults = require('./style-defaults/style-defaults');
  var SimpleStyleDefaults = require('./style-defaults/simple-style-defaults');
  var HeatmapDefaults = require('./style-defaults/heatmap-style-defaults');
  var AnimationDefaults = require('./style-defaults/animation-style-defaults');
  var SquareAggregationDefaults = require('./style-defaults/squares-aggregation-style-defaults');
  var HexabinsAggregationDefaults = require('./style-defaults/hexabins-aggregation-style-defaults');
  var RegionsAggregationDefaults = require('./style-defaults/regions-aggregation-style-defaults');
  
  var STYLE_MAP = {
    'none': {
      tooltipTranslationKey: 'editor.style.tooltip.none',
      labelTranslationKey: 'editor.style.types.none',
      checkIfValid: function (geometryType) {
        return !geometryType;
      },
      defaultStyles: StyleDefaults
    },
    'simple': {
      tooltipTranslationKey: 'editor.style.style-form.aggregation.tooltips.simple',
      labelTranslationKey: 'editor.style.types.simple',
      iconTemplate: require('./style-icons/points.tpl'),
      checkIfValid: function (geometryType) {
        return !!geometryType;
      },
      defaultStyles: SimpleStyleDefaults
    },
    'squares': {
      tooltipTranslationKey: 'editor.style.style-form.aggregation.tooltips.squares',
      labelTranslationKey: 'editor.style.types.squares',
      iconTemplate: require('./style-icons/squares.tpl'),
      checkIfValid: function (geometryType) {
        return geometryType === 'point';
      },
      defaultStyles: SquareAggregationDefaults
    },
    'hexabins': {
      tooltipTranslationKey: 'editor.style.style-form.aggregation.tooltips.hexabins',
      labelTranslationKey: 'editor.style.types.hexabins',
      iconTemplate: require('./style-icons/hexabins.tpl'),
      checkIfValid: function (geometryType) {
        return geometryType === 'point';
      },
      defaultStyles: HexabinsAggregationDefaults
    },
    'regions': {
      tooltipTranslationKey: 'editor.style.style-form.aggregation.tooltips.regions',
      labelTranslationKey: 'editor.style.types.regions',
      iconTemplate: require('./style-icons/regions.tpl'),
      checkIfValid: function (geometryType) {
        return geometryType === 'point';
      },
      defaultStyles: RegionsAggregationDefaults
    },
    'animation': {
      tooltipTranslationKey: 'editor.style.style-form.aggregation.tooltips.animation',
      labelTranslationKey: 'editor.style.types.animation',
      iconTemplate: require('./style-icons/animated.tpl'),
      checkIfValid: function (geometryType) {
        return geometryType === 'point';
      },
      defaultStyles: AnimationDefaults
    },
    'heatmap': {
      tooltipTranslationKey: 'editor.style.style-form.aggregation.tooltips.heatmap',
      labelTranslationKey: 'editor.style.types.heatmap',
      iconTemplate: require('./style-icons/heatmap.tpl'),
      checkIfValid: function (geometryType) {
        return geometryType === 'point';
      },
      defaultStyles: HeatmapDefaults
    }
  };
  
  module.exports = {
    getDefaultStyleAttrsByType: function (styleType, geometryType) {
      var StyleDefaultsKlass = STYLE_MAP[styleType].defaultStyles;
      return StyleDefaultsKlass.generateAttributes(geometryType);
    },
  
    getStyleTypes: function (currentType, geometryType) {
      return _.reduce(STYLE_MAP, function (memo, val, key) {
        if (currentType === key || (val.checkIfValid ? val.checkIfValid(geometryType) : true)) {
          memo.push({
            value: key,
            label: _t(val.labelTranslationKey),
            tooltip: _t(val.tooltipTranslationKey),
            iconTemplate: val.iconTemplate
          });
        }
        return memo;
      }, []);
    },
  
    getFormTemplateByType: function (styleType) {
      return STYLE_MAP[styleType].formTemplate;
    },
  
    getAggregationTypes: function () {
      return ['squares', 'hexabins', 'regions'];
    }
  };
  