/**

 * This class is used internally by `{@link Ext.data.Session#getSaveBatch}` and is

 * not intended for direct use. It can be studied as an example of implementing a visitor

 * to pass to `{@link Ext.data.Session#visitData}`.

 * @protected

 * @since 5.0.0

 */

Ext.define('Ext.data.session.BatchVisitor', {

    map: null,



    constructor: function (batch) {

        this.batch = batch;

    },



    getBatch: function (sort) {

        var map = this.map,

            batch = this.batch,

            bucket, entity, name, operation, proxy;



        if (map) {

            if (!batch) {

                batch = new Ext.data.Batch();

            }



            for (name in map) {

                bucket = map[name];

                entity = bucket.entity; // the entity class

                proxy = entity.getProxy();



                delete bucket.entity; // so we don't think its an operation

                for (operation in bucket) {

                    operation = proxy.createOperation(operation, {

                        records: bucket[operation]

                    });

                    operation.entityType = entity;



                    batch.add(operation);

                }

            }

        }



        if (batch && sort !== false) {

            batch.sort();

        }



        return batch;

    },



    onDirtyRecord: function (record) {

        var me = this,

            operation = record.phantom ? 'create'

                : (record.dropped ? 'destroy' : 'update'),

            name = record.$className,

            map = (me.map || (me.map = {})),

            bucket = (map[name] || (map[name] = {

                entity: record.self

            }));



        //  User: {

        //      entity: User,

        //      create: [

        //          { id: 20, name: 'Don' }

        //      ]

        //  }

        bucket = bucket[operation] || (bucket[operation] = []);

        bucket.push(record);

    }

});