function postShippingMethod(args) {

    const validator = new InputValidator(args, ERROR_TYPE);
    validator
        .checkArguments()
        .mandatoryParameter('id')
        .mandatoryParameter('shippingMethodId');
    if (validator.error) {
        return validator.buildErrorResponse();
    }

    let languageParser = new LanguageParser(args);
    let cartMapper = new CartMapper(languageParser);

    const cart = new CommerceToolsCart(args, createClient, cartMapper.mapCart.bind(cartMapper));
    // cart data for cart update action
    const data = {
        actions: [{
            action: 'setShippingMethod',
            shippingMethod: {
                typeId: 'shipping-method',
                id: args.shippingMethodId
            }
        }]
    };

    return cart
        .byId(args.id)
        .postCartData(args.id, data);
}
/**
 * This action adds a new entry to a cart. When the cart id is empty a new cart will be created with the new cart entry.
 *
 * @param   {string} args.CT_PROJECTKEY        commerceTools project key
 * @param   {string} args.CT_CLIENTID          commerceTools client id
 * @param   {string} args.CT_CLIENTSECRET      commerceTools client secret
 * @param   {string} args.CT_API_HOST          optional commerceTools API host uri
 * @param   {string} args.CT_AUTH_HOST         optional commerceTools AUTH host uri
 *
 * @param   {string} args.id                   cart id
 * @param   {string} args.cartEntryId          cart entry id
 *
 * @return  {Promise}                          the cart containing the remaining cart entries
 */
function deleteCartEntry(args) {
    const validator = new InputValidator(args, ERROR_TYPE);
    validator
        .checkArguments()
        .mandatoryParameter('id')
        .mandatoryParameter('cartEntryId')
        .matchRegexp('cartEntryId', InputValidator.CART_ENTRY_ID_REGEXP);
    if (validator.error) {
        return validator.buildErrorResponse();
    }

    let languageParser = new LanguageParser(args);
    let cartMapper = new CartMapper(languageParser);

    const cart = new CommerceToolsCart(args, createClient, cartMapper.mapCart.bind(cartMapper));
        // cart data for cart remove action
        const data = {
            actions: [
                {
                    action: 'removeLineItem',
                    lineItemId: args.cartEntryId
                }
            ]
        };
    return cart.postCartData(args.id, data);

}
/**
 * This action gets the available payment methods for a cart that exists in commerce tools.
 *
 * @param   {string} args.CT_PROJECTKEY        commerceTools project key
 * @param   {string} args.CT_CLIENTID          commerceTools client id
 * @param   {string} args.CT_CLIENTSECRET      commerceTools client secret
 * @param   {string} args.CT_API_HOST          optional commerceTools API host uri
 * @param   {string} args.CT_AUTH_HOST         optional commerceTools AUTH host uri
 *
 * @param   {string} args.id                   the id of a cart
 */
function getPaymentMethods(args) {
    const validator = new InputValidator(args, ERROR_TYPE);

    validator
        .checkArguments()
        .mandatoryParameter('id');
    if (validator.error) {
        return validator.buildErrorResponse();
    }

    return Promise.resolve(_generateMockResponse());
}
/**
 * This action retrieves a customer by id.
 *
 * @param   {string} args.CT_PROJECTKEY        commerceTools project key
 * @param   {string} args.CT_CLIENTID          commerceTools client id
 * @param   {string} args.CT_CLIENTSECRET      commerceTools client secret
 * @param   {string} args.CT_API_HOST          optional commerceTools API host uri
 * @param   {string} args.CT_AUTH_HOST         optional commerceTools AUTH host uri
 * @param   {string} args.id                   the id of the customer
 *
 * @return  {Customer}                         a Customer object
 */
function getCustomerById(args) {

    const validator = new InputValidator(args, ERROR_TYPE);

    validator.checkArguments().mandatoryParameter('id')
    if (validator.error) {
        return validator.buildErrorResponse();
    }

    let languageParser = new LanguageParser(args);
    let customerMapper = new CustomerMapper(languageParser);

    const commerceToolsCustomer = new CommerceToolsCustomer(args, createClient, customerMapper.mapCustomer.bind(customerMapper));
    return commerceToolsCustomer
        .byId(args.id)
        .get();
}
/**
 * This action creates a payment and adds it to a cart.
 *
 * @param   {string} args.CT_PROJECTKEY        commerceTools project key
 * @param   {string} args.CT_CLIENTID          commerceTools client id
 * @param   {string} args.CT_CLIENTSECRET      commerceTools client secret
 * @param   {string} args.CT_API_HOST          optional commerceTools API host uri
 * @param   {string} args.CT_AUTH_HOST         optional commerceTools AUTH host uri
 *
 * @param   {string}  args.id                  cart id
 * @param   {Payment} args.payment             a CCIF payment object
 *
 */
function postPayment(args) {
    const validator = new InputValidator(args, ERROR_TYPE);
    validator
        .checkArguments()
        .mandatoryParameter('id')
        .mandatoryParameter('payment');
    if (validator.error) {
        return validator.buildErrorResponse();
    }

    let languageParser = new LanguageParser(args);
    let cartMapper = new CartMapper(languageParser);
    let paymentMapper = new PaymentMapper();
    
    const cartPaymentClient = new CommerceToolsCartPayment(args, createClient, cartMapper.mapCart.bind(cartMapper), paymentMapper.mapPayment.bind(paymentMapper), paymentMapper.mapPaymentDraft.bind(paymentMapper), false);

    return cartPaymentClient.addCartPayment(args.id, args.payment);
}