/**
 * This container can host D3 drawing components that need a pivot configurator
 * plugin.
 */
Ext.define('Ext.pivot.d3.AbstractContainer', {
    extend: 'Ext.panel.Panel',

    requires: [
        'Ext.pivot.d3.HeatMap',
        'Ext.pivot.plugin.Configurator'
    ],

    // this makes the pivot configurator plugin work with this container
    isPivotComponent: true,

    config: {
        /**
         * @cfg {Ext.pivot.matrix.Base} matrix (required)
         *
         * This is the pivot matrix used by the pivot D3 container. All axis and aggregate
         * dimensions should be defined here.
         *
         * Needed by this pivot container so that the configurator plugin can call getMatrix.
         *
         * This matrix is also used by the {@link #drawing}.
         */
        matrix: {
            type: 'local'
        },

        /**
         * @cfg {Ext.Component} drawing
         *
         * Configuration object for the item that will be added to this container
         */
        drawing: {
            xtype: 'pivotheatmap'
        },

        /**
         * @cfg {Ext.pivot.plugin.Configurator} configurator
         *
         * Configuration object for the pivot Configurator plugin.
         */
        configurator: null
    },

    destroy: function() {
        this.setMatrix(null);
        this.callParent();
    },

    addDrawing: function() {
        this.add(Ext.applyIf({
            matrix: this.getMatrix()
        }, this.getDrawing()));
    },

    applyMatrix: function(newMatrix, oldMatrix) {
        Ext.destroy(oldMatrix);

        if (newMatrix == null) {
            return newMatrix;
        }

        if (newMatrix && newMatrix.isPivotMatrix) {
            newMatrix.cmp = this;

            return newMatrix;
        }

        Ext.applyIf(newMatrix, {
            type: 'local'
        });
        newMatrix.cmp = this;

        return Ext.Factory.pivotmatrix(newMatrix);
    },

    applyConfigurator: function(plugin) {
        return plugin ? this.addPlugin(plugin) : null;
    },

    updateConfigurator: function(plugin, oldPlugin) {
        if (oldPlugin) {
            this.removePlugin(oldPlugin);
        }
    }
});
