(function(root, factory) {

if (typeof module === 'object' && module.exports) {
    // CommonJS-like environments that support module.exports, like Node.
    module.exports = factory(require('../ApiClient'), require('./InvocationContext'), require('../CommonUtil'), require('../ResponseWrapper'), require('./Base')
, require('../handlers/RetrieveFundingAccountsHandler')
, require('../handlers/RetrieveFundingAccountsPageHandler'), require('../OrbipayApiError'));
  }
}(this, function(ApiClient, InvocationContext, CommonUtil, ResponseWrapper, Base, RetrieveFundingAccountsHandler, RetrieveFundingAccountsPageHandler, OrbipayApiError) {
  'use strict';

    /**
    * The FundingAccounts wrapper module.
    * @module wrappers/FundingAccounts
    */
  var exports = function() {

  };
  exports.constructFromObject = function (data, obj) {
        if (data) {
            obj = obj || new exports();
            if (data.hasOwnProperty('list')) {
		var FundingAccount = require('./FundingAccount');
                obj['list'] = ApiClient.convertToType(data['list'], [FundingAccount]);
            }
            if (data.hasOwnProperty('total_results_count')) {
                obj['total_results_count'] = data['total_results_count'];
            }
            if (data.hasOwnProperty('has_more_results')) {
                obj['has_more_results'] = data['has_more_results'];
            }
            if (data.hasOwnProperty('url')) {
                obj['url'] = data['url'];
            }
            if (data.hasOwnProperty('from_index')) {
                obj['from_index'] = data['from_index'];
            }
            if (data.hasOwnProperty('to_index')) {
                obj['to_index'] = data['to_index'];
            }
            if (data.hasOwnProperty('query_id')) {
                obj['query_id'] = data['query_id'];
            }
            if (data.hasOwnProperty('ID_CUSTOMER')) {
                obj['ID_CUSTOMER'] = data['ID_CUSTOMER'];
            }
            if (data.hasOwnProperty('page_size')) {
                obj['page_size'] = data['page_size'];
            }
            if (data.hasOwnProperty('account_number')) {
                obj['account_number'] = data['account_number'];
            }
            if (data.hasOwnProperty('status')) {
                obj['status'] = data['status'];
            }
            if (data.hasOwnProperty('aba_routing_number')) {
                obj['aba_routing_number'] = data['aba_routing_number'];
            }
            if (data.hasOwnProperty('account_type')) {
                obj['account_type'] = data['account_type'];
            }
            if (data.hasOwnProperty('account_subtype')) {
                obj['account_subtype'] = data['account_subtype'];
            }
        }
        return obj;
  };


  exports.prototype = Object.create(Base.prototype);
  exports.prototype.constructor = exports;

    /**
    * @member [FundingAccount] list
    */
  exports.prototype['list'] = undefined;
    /**
    * The total number of funding accounts of the customer matching the search criteria.
    * @member {String} total_results_count
    */
  exports.prototype['total_results_count'] = undefined;
    /**
    * true if there are more results or pages
    * @member {String} has_more_results
    */
  exports.prototype['has_more_results'] = undefined;
    /**
    * This URL fetches the next or previous set of funding accounts, based on the presence of after_object or before_object parameter.
    * @member {String} url
    */
  exports.prototype['url'] = undefined;
    /**
    * The id of the object before which the previous set of objects are to be retrieved.
    * @member {String} from_index
    */
  exports.prototype['from_index'] = undefined;
    /**
    * The id of the object after which the next set of objects are to be retrieved.
    * @member {String} to_index
    */
  exports.prototype['to_index'] = undefined;
    /**
    * The query id of the object.
    * @member {String} query_id
    */
  exports.prototype['query_id'] = undefined;
    /**
    * The unique identifier assigned by EBPP to the customer.
    * @member {String} ID_CUSTOMER
    */
  exports.prototype['ID_CUSTOMER'] = undefined;
    /**
    * The maximum number of objects returned in the query.
    * @member {String} page_size
    */
  exports.prototype['page_size'] = undefined;
    /**
    * The Account Number to get details of.
    * @member {String} account_number
    */
  exports.prototype['account_number'] = undefined;
    /**
    * The status of the funding account in EBPP. This can take multiple values in the format key=value1&key=value2....
    * @member [String] status
    */
  exports.prototype['status'] = undefined;
    /**
    * The ABA/Routing number for the bank account.
    * @member {String} aba_routing_number
    */
  exports.prototype['aba_routing_number'] = undefined;
    /**
    * The type of the funding account. This can take multiple values in the format key=value1&key=value2....
    * @member [String] account_type
    */
  exports.prototype['account_type'] = undefined;
    /**
    * The sub type of the funding account. This is derived by EBPP in the case of card funding accounts.
    * @member {String} account_subtype
    */
  exports.prototype['account_subtype'] = undefined;

  /**
  * @param  {String} client_key - The client_key of FundingAccounts. 
  * @return {module:wrappers/FundingAccounts} The instance of <code>FundingAccounts</code>.
  */
  exports.prototype.forClient = function (client_key) {
        var _this = this;
	    Base.prototype.forClient.call(_this,client_key);
        return _this;
  };
  /**
  * @param  {String} channel - The channel of FundingAccounts. 
  * @return {module:wrappers/FundingAccounts} The instance of <code>FundingAccounts</code>.
  */
  exports.prototype.videChannel = function (channel) {
        var _this = this;
	    Base.prototype.videChannel.call(_this,channel);
        return _this;
  };
  /**
  * @param  {String} aba_routing_number - The aba_routing_number of FundingAccounts. 
  * @param  [String] account_type - The account_type of FundingAccounts. 
  * @param  {String} account_subtype - The account_subtype of FundingAccounts. 
  * @param  {String} account_number - The account_number of FundingAccounts. 
  * @param  [String] status - The status of FundingAccounts. 
  * @param  {String} page_size - The page_size of FundingAccounts. 
  * @param  {String} query_id - The query_id of FundingAccounts. 
  * @param  {String} from_index - The from_index of FundingAccounts. 
  * @param  {String} to_index - The to_index of FundingAccounts. 
  * @return {module:wrappers/FundingAccounts} The instance of <code>FundingAccounts</code>.
  */
  exports.prototype.findBy = function (filterParameters) {
        var _this = this;
        if(filterParameters){
        
        _this['aba_routing_number'] = CommonUtil.getValuesFromMultiMap(filterParameters, 'aba_routing_number', false);
        _this['account_type'] = CommonUtil.getValuesFromMultiMap(filterParameters, 'account_type', true);
        
        
        _this['account_subtype'] = CommonUtil.getValuesFromMultiMap(filterParameters, 'account_subtype', false);
        
        _this['account_number'] = CommonUtil.getValuesFromMultiMap(filterParameters, 'account_number', false);
        _this['status'] = CommonUtil.getValuesFromMultiMap(filterParameters, 'status', true);
        
        
        _this['page_size'] = CommonUtil.getValuesFromMultiMap(filterParameters, 'page_size', false);
        
        _this['query_id'] = CommonUtil.getValuesFromMultiMap(filterParameters, 'query_id', false);
        
        _this['from_index'] = CommonUtil.getValuesFromMultiMap(filterParameters, 'from_index', false);
        
        _this['to_index'] = CommonUtil.getValuesFromMultiMap(filterParameters, 'to_index', false);
        }
        return _this;
  };
  /**
  * @param  {String} ID_CUSTOMER - The ID_CUSTOMER of FundingAccounts. 
  * @return {module:wrappers/FundingAccounts} The instance of <code>FundingAccounts</code>.
  */
  exports.prototype.forCustomer = function (id_customer) {
        var _this = this;

        _this['ID_CUSTOMER'] = id_customer;


        return _this;
  };

  exports.prototype.retrievedBy = function (requestor, requestor_type) {
        var _this = this;
        _this.requestedBy(requestor, requestor_type);
        return _this;
  };

  exports.prototype.get = function (invocation_context, callback, live_mode, api_end_point) {
        var _this = this;
        var internalCallback = function (errorMessage, parsedData, httpResponse, exception) {
            try {
                var response = ResponseWrapper.wrapResponse(exports, exception, errorMessage, parsedData, httpResponse);
                if (callback) {
                    callback(response['exception'], response['data'])
                }
            } catch (e) {
                exception = OrbipayApiError.getDefaultException(e);
                if (callback) {
                    callback(exception)
                }
            }
        };
        try {
			_this.withContext(invocation_context, live_mode, api_end_point);
			var handler = new RetrieveFundingAccountsHandler();
			if (callback && CommonUtil.isFunction(callback)) {
			    return handler.process(_this, internalCallback);
			} else {
			    return handler.process(_this);
			}
		}
		catch (e){
		    var error = OrbipayApiError.getDefaultException(e);
		    if (callback) {
		        callback(error)
		    }
        }
  };
  exports.prototype.getPage = function (invocation_context, callback, live_mode, api_end_point) {
        var _this = this;
        var internalCallback = function (errorMessage, parsedData, httpResponse, exception) {
            try {
                var response = ResponseWrapper.wrapResponse(exports, exception, errorMessage, parsedData, httpResponse);
                if (callback) {
                    callback(response['exception'], response['data'])
                }
            } catch (e) {
                exception = OrbipayApiError.getDefaultException(e);
                if (callback) {
                    callback(exception)
                }
            }
        };
        try {
			_this.withContext(invocation_context, live_mode, api_end_point);
			var handler = new RetrieveFundingAccountsPageHandler();
			if (callback && CommonUtil.isFunction(callback)) {
			    return handler.process(_this, internalCallback);
			} else {
			    return handler.process(_this);
			}
		}
		catch (e){
		    var error = OrbipayApiError.getDefaultException(e);
		    if (callback) {
		        callback(error)
		    }
        }
  };

  return exports;

}));