/**
 * Plugin that provides the ability to filter through a recordset.
 * Uses the filter methods available on Y.Array (see arrayextras submodule) to filter the recordset.
 * @module recordset
 * @submodule recordset-filter
 */


var YArray = Y.Array,
Lang = Y.Lang;


/**
 * Plugin that provides the ability to filter through a recordset.
 * Uses the filter methods available on Y.Array (see arrayextras submodule) to filter the recordset.
 * @class RecordsetFilter
 */
function RecordsetFilter(config) {
    RecordsetFilter.superclass.constructor.apply(this, arguments);
}

Y.mix(RecordsetFilter, {
    NS: "filter",

    NAME: "recordsetFilter",

    ATTRS: {
    }

});


Y.extend(RecordsetFilter, Y.Plugin.Base, {


    /**
    Filter through the recordset with a custom filter function, or a key-value
    pair.

    @method filter
    @param {Function|String} filter A custom filter function or a string
        representing the key to filter by.
    @param {Any} [value] If filtering by key (_filter_ is a string), further
        filter by a specific value.
    @return {Recordset} A new filtered Recordset instance
    **/
    filter: function (filter, value) {
        var recs = this.get('host').get('records'),
            key;

        //If a key-value pair is passed in, generate a custom function
        if (value && Lang.isString(filter)) {
            key = filter;
            filter = function(item) {
                return (item.getValue(key) === value);
            };
        }

        //TODO: PARENT CHILD RELATIONSHIP
        return new Y.Recordset({
            records: YArray.filter(recs, filter)
        });
    },

    /**
    The inverse of filter. Executes the supplied function on each item. Returns
    a new Recordset containing the items that the supplied function returned
    `false` for.

    @method reject
    @param {Function} filter A boolean function, executed on each item.
    @return {Recordset} A new Recordset instance containing the items on which
        the supplied function returned false.
    **/
    reject: function (filter) {
        return new Y.Recordset({
            records: YArray.reject(this.get('host').get('records'), filter)
        });
    },

    /**
    Iterates over the Recordset, returning a new Recordset of all the elements
    that match the supplied regular expression

    @method grep
    @param {RegExp} pattern The regular expression to test against each record.
    @return {Recordset} A Recordset instance containing all the items in the
        collection that produce a match against the supplied regular
        expression. If no items match, an empty Recordset instance is returned.
    **/
    grep: function (pattern) {
        return new Y.Recordset({
            records: YArray.grep(this.get('host').get('records'), pattern)
        });
    }

    //TODO: Add more pass-through methods to arrayextras
});

Y.namespace("Plugin").RecordsetFilter = RecordsetFilter;
