/**
 * That's a base class for the {@link Ext.grid.plugin.GroupingPanel} plugin
 * and it's shared by both toolkits.
 * @private
 */
Ext.define('Ext.grid.plugin.BaseGroupingPanel', {
    extend: 'Ext.plugin.Abstract',

    config: {
        panel: {
            xtype: 'groupingpanel',
            columnConfig: {
                xtype: 'groupingpanelcolumn'
            }
        },
        grid: null,
        bar: null,
        gridListeners: null
    },

    init: function(grid) {
        this.setGrid(grid);
    },

    /**
     * @private
     * AbstractComponent calls destroy on all its plugins at destroy time.
     */
    destroy: function() {
        this.setConfig({
            grid: null,
            bar: null,
            panel: null
        });
        this.callParent();
    },

    enable: function() {
        this.disabled = false;
        this.showGroupingPanel();
    },

    disable: function() {
        this.disabled = true;
        this.hideGroupingPanel();
    },

    /**
     * Show the grouping panel
     */
    showGroupingPanel: function() {
        var bar;

        this.setup();

        bar = this.getBar();

        bar.show();
    },

    /**
     * Hide the grouping panel
     */
    hideGroupingPanel: function() {
        var bar;

        this.setup();

        bar = this.getBar();

        bar.hide();
    },

    toggleGroupingPanel: function() {
        var bar;

        this.setup();

        bar = this.getBar();

        bar.setHidden(!bar.getHidden());
    },

    updateGrid: function(grid, oldGrid) {
        var me = this;

        Ext.destroy(me.listenersGrid);

        if (oldGrid) {
            oldGrid.showGroupingPanel = oldGrid.hideGroupingPanel = null;
        }

        if (grid) {
            grid.showGroupingPanel = Ext.bind(me.showGroupingPanel, me);
            grid.hideGroupingPanel = Ext.bind(me.hideGroupingPanel, me);

            if (grid.rendered) {
                me.onAfterGridRendered();
            }
            else {
                me.listenersGrid = grid.on(Ext.apply({
                    scope: me,
                    destroyable: true
                }, me.getGridListeners()));
            }

        }
    },

    updateBar: function(bar, oldBar) {
        var panel;

        Ext.destroy(oldBar);

        if (bar) {
            panel = bar.isXType('groupingpanel') ? bar : bar.down('groupingpanel');

            if (panel) {
                panel.setConfig({
                    grid: this.getGrid()
                });
            }
            //<debug>
            else {
                Ext.raise('Wrong grouping panel configuration! ' +
                    'No "groupingpanel" component available');
            }
            //</debug>
        }
    },

    onAfterGridRendered: function() {
        var me = this;

        if (me.disabled === true) {
            me.disable();
        }
        else {
            me.enable();
        }
    },

    addGroupingPanel: Ext.emptyFn,

    privates: {
        setup: function() {
            var me = this;

            if (me.doneSetup) {
                return;
            }

            me.doneSetup = true;
            me.setBar(me.addGroupingPanel());
        }
    }

});