/**
 * 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;
    }
});