// @tag enterprise
/**
 * @class Ext.data.amf.RemotingMessage
 * Represents a remote call to be sent to the server.
 */
Ext.define('Ext.data.amf.RemotingMessage', {
    alias: 'data.amf.remotingmessage',
 
    config: {
 
        $flexType: 'flex.messaging.messages.RemotingMessage',
 
        /**
         * @property {Array} body - typically an array of parameters to pass to a method call
         */
        body: [],
 
        /**
         * @property {String} clientID - identifies the calling client.
         */
        clientId: "",
 
        /**
         * @property {String} destination - the service destination on the server
         */
        destination: "",
 
        /**
         * @property {Object} headers - the headers to attach to the message.
         * Would typically contain the DSEndpoint and DSId fields.
         */
        headers: [],
 
        /**
         * @property {String} messageId - message identifier
         */
        messageId: "",
 
        /**
         * @property {String} operation - the method name to call
         */
        operation: "",
 
        /**
         * @property {Array} source - should be empty for security purposes
         */
        source: "",
 
        /**
         * @property {Number} timestamp - when the message was created
         */
        timestamp: [],
 
        /**
         * @property {Number} timeToLive - how long the message is still valid for passing
         */
        timeToLive: []
    },
 
    /**
     * Creates new message.
     * @param {Object} config Configuration options
     */
    constructor: function(config) {
        this.initConfig(config);
    },
 
    /**
     * Returns an AMFX encoded version of the message.
     */
    encodeMessage: function() {
        var encoder = Ext.create('Ext.data.amf.XmlEncoder'),
            cleanObj;
 
        // eslint-disable-next-line max-len
        cleanObj = Ext.copyTo({}, this, "$flexType,body,clientId,destination,headers,messageId,operation,source,timestamp,timeToLive", true);
        encoder.writeObject(cleanObj);
 
        return encoder.body;
    }
});