/**
 * Base implementation of a result object.
 *
 * The Result object stores all calculated values for the aggregate dimensions
 * for a left/top item pair.
 */
Ext.define('Ext.pivot.result.Base', {
 
    alias: 'pivotresult.base',
 
    mixins: [
        'Ext.mixin.Factoryable'
    ],
 
    /**
     * @cfg {String} leftKey (required)
     *
     *  Key of left axis item or grandTotalKey
     */
    leftKey:        '',
    /**
     * @cfg {String} topKey (required)
     *
     * Key of top axis item or grandTotalKey
     */
    topKey:         '',
    /**
     * @property {Boolean} dirty
     *
     * Set this flag on true if you modified at least one record in this result.
     * The grid cell will be marked as dirty in such a case.
     */
    dirty:          false,
 
    /**
     * @property {Object} values
     *
     * Object that stores all calculated values for each pivot aggregate.
     * The object keys are the dimension ids.
     *
     * @private
     */
    values:         null,
    /**
     * @property {Ext.pivot.matrix.Base} matrix
     * @readonly
     *
     * Reference to the matrix object
     */
    matrix:         null,
 
    constructor: function(config){
        var me = this;
 
        Ext.apply(me, config || {});
        me.values = {};
 
        return me.callParent(arguments);
    },
 
    destroy: function(){
        var me = this;
 
        me.matrix = me.values = null;
        me.leftAxisItem = me.topAxisItem = null;
 
        return me.callParent(arguments);
    },
 
    /**
     * @method
     * Calculate all pivot aggregate dimensions for the internal records. Useful when using a
     * {@link Ext.pivot.matrix.Local Local} matrix.
     *
     */
    calculate: Ext.emptyFn,
 
    /**
     * @method
     *
     * Besides the calculation functions defined on your aggregate dimension you could
     * calculate values based on other store fields and custom functions.
     *
     * @param key The generated value will be stored in the result under this key for later extraction
     * @param dataIndex The dataIndex that should be used on the records for doing calculations
     * @param aggFn Your custom function
     */
    calculateByFn: Ext.emptyFn,
 
    /**
     * Add the calculated value for an aggregate dimension to the internal values storage
     *
     * @param dimensionId
     * @param value
     */
    addValue: function(dimensionId, value){
        this.values[dimensionId] = value;
    },
 
    /**
     * Returns the calculated value for the specified aggregate dimension
     *
     * @param dimensionId
     */
    getValue: function(dimensionId){
        return this.values[dimensionId];
    },
 
    /**
     * Check if the value was already calculated for the specified dimension
     *
     * @param dimensionId
     * @return {Boolean} 
     */
    hasValue: function(dimensionId) {
        return (dimensionId in this.values);
    },
 
    /**
     * Returns the left axis item
     *
     * @returns {Ext.pivot.axis.Item} 
     */
    getLeftAxisItem: function(){
        return this.matrix.leftAxis.items.getByKey(this.leftKey);
    },
 
    /**
     * Returns the top axis item
     *
     * @returns {Ext.pivot.axis.Item} 
     */
    getTopAxisItem: function(){
        return this.matrix.topAxis.items.getByKey(this.topKey);
    }
});