/**
 * The Result object stores all calculated values for the aggregate dimensions
 * for a left/top item pair and all records that are used to calculate
 * those values.
 *
 * It is used by the {@link Ext.pivot.matrix.Local} matrix class.
 */
Ext.define('Ext.pivot.result.Local', {
    extend: 'Ext.pivot.result.Base',
 
    alias: 'pivotresult.local',
 
    alternateClassName: [
        'Mz.aggregate.matrix.Result'
    ],
 
    /**
     * @property {Ext.data.Model[]} records
     *
     * Array of records for the left/top axis keys pair. Only available for a {@link Ext.pivot.matrix.Local Local} matrix.
     */
    records:        null,
 
    constructor: function(config){
        this.records = [];
 
        return this.callParent(arguments);
    },
 
    destroy: function(){
        this.records.length = 0;
        this.records = null;
 
        return this.callParent(arguments);
    },
 
    /**
     * @method calculate
     * @inheritdoc
     */
    calculate: function(){
        var me = this,
            i, dimension,
            length = me.matrix.aggregate.getCount();
 
        // for each pivot aggregate dimension calculate the value and call addValue 
        for(= 0; i < length; i++){
            dimension = me.matrix.aggregate.getAt(i);
            me.addValue(dimension.getId(), Ext.callback(dimension.aggregatorFn, dimension.getScope() || 'self.controller', [me.records, dimension.dataIndex, me.matrix, me.leftKey, me.topKey], 0, me.matrix.cmp));
        }
    },
 
    /**
     * @method calculateByFn
     * @inheritdoc
     */
    calculateByFn: function(key, dataIndex, aggFn){
        var me = this,
            v;
 
        if(Ext.isString(aggFn)){
            aggFn = Ext.pivot.Aggregators[aggFn];
        }
 
        //<debug> 
        if(!Ext.isFunction(aggFn)){
            Ext.raise('Invalid function provided!');
        }
        //</debug> 
 
        v = aggFn(me.records, dataIndex, me.matrix, me.leftKey, me.topKey);
        me.addValue(key, v);
 
        return v;
    },
 
    /**
     * Add the specified record to the internal records storage.
     * These records will be used for calculating the pivot aggregate dimension values.
     * This should be used only when all calculations are done locally and not remotely.
     *
     * @param {Ext.data.Model} record
     */
    addRecord: function(record){
        this.records.push(record);
    },
 
    removeRecord: function(record){
        Ext.Array.remove(this.records, record);
    }
});