/**
 * This class extends the dimension item to be able to provide additional settings
 * in the configurator plugin.
 */
Ext.define('Ext.pivot.plugin.configurator.Field', {
    extend: 'Ext.pivot.dimension.Item',
 
    requires: [
        'Ext.pivot.plugin.configurator.FieldSettings'
    ],
 
    config: {
        /**
         * The CellEditing plugin uses an `editor` config on the dimension
         * to be able to set the editor for the aggregate dimensions.
         * When the CellEditing plugin is used together with the Configurator
         * plugin then this config is lost if the dimensions are reconfigured.
         * @private
         */
        editor: null,
        
        /**
         * @cfg {Ext.pivot.plugin.configurator.FieldSettings} settings
         *
         * Define special restrictions or configurations for this field.
         */
        settings: {}
    },
 
    isField: true,
 
    clone: function() {
        return new Ext.pivot.plugin.configurator.Field(
            Ext.applyIf({ id: Ext.id() }, this.getInitialConfig())
        );
    },
 
    getConfiguration: function(serializable) {
        var cfg = this.callParent([serializable]);
 
        if (cfg.settings) {
            cfg.settings = cfg.settings.getConfig();
        }
 
        return cfg;
    },
 
    updateAggregator: function(agg, oldAgg) {
        var settings, fns;
 
        this.callParent([agg, oldAgg]);
 
        if (agg) {
            settings = this.getSettings();
            fns = settings.getAggregators();
 
            if (fns.length === 0) {
                Ext.Array.remove(settings.getAllowed(), 'aggregate');
            }
            else {
                Ext.Array.include(fns, agg);
            }
        }
    },
 
    getSettings: function() {
        var ret = this.settings;
 
        if (!ret) {
            ret = new Ext.pivot.plugin.configurator.FieldSettings({});
            this.setSettings(ret);
        }
 
        return ret;
    },
 
    applySettings: function(settings, obj) {
 
        if (settings == null || (settings && settings.isFieldSettings)) {
            return settings;
        }
 
        if (settings) {
            if (!obj) {
                obj = this.getSettings();
            }
 
            obj.setConfig(settings);
        }
 
        if (obj) {
            this.setAggregator(this.getAggregator());
        }
 
        return obj;
    },
 
    getFieldText: function() {
        var header = this.getHeader();
 
        if (this.isAggregate) {
            header += ' (' + this.getAggText() + ')';
        }
 
        return header;
    },
 
    getAggText: function(fn) {
        var Agg = Ext.pivot.Aggregators,
            f = fn || this.getAggregator();
 
        if (Ext.isFunction(f)) {
            return Agg.customText;
        }
 
        return Agg[+ 'Text'] || Agg.customText;
    }
});