/**
 * This filter type will provide a combobox with a store. The options available in the store
 * can be configured.
 *
 * If no options are provided then they are extracted from the grid store
 */
Ext.define('Ext.grid.plugin.filterbar.filters.List', {
    extend: 'Ext.grid.plugin.filterbar.filters.SingleFilter',
    alias: 'grid.filterbar.list',

    requires: [
        'Ext.form.field.ComboBox'
    ],

    config: {
        /**
         * @cfg {String[]/Ext.data.Store} options
         *
         * An array of values or a store configuration
         */
        options: null
    },

    type: 'list',

    operator: '==',
    operators: ['==', '!=', 'empty', 'nempty'],

    fieldDefaults: {
        xtype: 'combobox',
        queryMode: 'local',
        forceSelection: true,
        editable: true,
        matchFieldWidth: true
    },

    constructor: function(config) {
        var me = this,
            options;

        me.callParent([config]);

        options = me.getOptions();

        if (!options) {
            me.monitorStore(me.getGridStore());
        }
    },

    destroy: function() {
        var me = this;

        Ext.destroy(me.storeListeners, me.gridListeners);

        me.callParent();
    },

    monitorStore: function(store) {
        var me = this;

        Ext.destroy(me.storeListeners);

        me.storeListeners = store.on({
            add: 'resetFieldStore',
            remove: 'resetFieldStore',
            load: 'resetFieldStore',
            scope: me,
            destroyable: true
        });
    },

    getFieldConfig: function() {
        var config = this.callParent();

        config.store = this.createOptionsStore();

        return config;
    },

    createOptionsStore: function() {
        var me = this,
            options = me.getOptions(),
            store = me.getGridStore();

        if (!options) {
            // no options provided so we need to extract them from the grid store
            options = Ext.Array.sort(store.collect(me.getDataIndex(), false, true));
        }

        return options;
    },

    resetFilter: function() {
        var me = this;

        if (me.resettingFilter) {
            return;
        }

        me.resettingFilter = true;
        me.monitorStore(me.getGridStore());
        me.callParent();
        me.resetFieldStore();
        me.resettingFilter = false;
    },

    resetFieldStore: function() {
        var me = this,
            field = me.getField();

        if (field) {
            field.setStore(me.createOptionsStore());

            if (me.active) {
                field.suspendEvents();
                field.setValue(me.filter.getValue());
                field.resumeEvents(true);
            }
        }
    }

});