=begin
#Selling Partner APIs for Fulfillment Outbound

#The Selling Partner API for Fulfillment Outbound lets you create applications that help a seller fulfill Multi-Channel Fulfillment orders using their inventory in Amazon's fulfillment network. You can get information on both potential and existing fulfillment orders.

OpenAPI spec version: 2020-07-01

Generated by: https://github.com/swagger-api/swagger-codegen.git
Swagger Codegen version: 3.0.33
=end

module AmzSpApi::FulfillmentOutbound_20200701
  class FbaOutboundApi
    attr_accessor :api_client

    def initialize(api_client = ApiClient.default)
      @api_client = api_client
    end
    # Requests that Amazon stop attempting to fulfill the fulfillment order indicated by the specified order identifier.  **Usage Plan:**  | Rate (requests per second) | Burst | | ---- | ---- | | 2 | 30 |  For more information, see \"Usage Plans and Rate Limits\" in the Selling Partner API documentation.
    # @param seller_fulfillment_order_id The identifier assigned to the item by the seller when the fulfillment order was created.
    # @param [Hash] opts the optional parameters
    # @return [CancelFulfillmentOrderResponse]
    def cancel_fulfillment_order(seller_fulfillment_order_id, opts = {})
      data, _status_code, _headers = cancel_fulfillment_order_with_http_info(seller_fulfillment_order_id, opts)
      data
    end

    # Requests that Amazon stop attempting to fulfill the fulfillment order indicated by the specified order identifier.  **Usage Plan:**  | Rate (requests per second) | Burst | | ---- | ---- | | 2 | 30 |  For more information, see \&quot;Usage Plans and Rate Limits\&quot; in the Selling Partner API documentation.
    # @param seller_fulfillment_order_id The identifier assigned to the item by the seller when the fulfillment order was created.
    # @param [Hash] opts the optional parameters
    # @return [Array<(CancelFulfillmentOrderResponse, Integer, Hash)>] CancelFulfillmentOrderResponse data, response status code and response headers
    def cancel_fulfillment_order_with_http_info(seller_fulfillment_order_id, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug 'Calling API: FbaOutboundApi.cancel_fulfillment_order ...'
      end
      # verify the required parameter 'seller_fulfillment_order_id' is set
      if @api_client.config.client_side_validation && seller_fulfillment_order_id.nil?
        fail ArgumentError, "Missing the required parameter 'seller_fulfillment_order_id' when calling FbaOutboundApi.cancel_fulfillment_order"
      end
      # resource path
      local_var_path = '/fba/outbound/2020-07-01/fulfillmentOrders/{sellerFulfillmentOrderId}/cancel'.sub('{' + 'sellerFulfillmentOrderId' + '}', seller_fulfillment_order_id.to_s)

      # query parameters
      query_params = opts[:query_params] || {}

      # header parameters
      header_params = opts[:header_params] || {}
      # HTTP header 'Accept' (if needed)
      header_params['Accept'] = @api_client.select_header_accept(['application/json'])

      # form parameters
      form_params = opts[:form_params] || {}

      # http body (model)
      post_body = opts[:body] 

      return_type = opts[:return_type] || 'CancelFulfillmentOrderResponse' 

      auth_names = opts[:auth_names] || []
      data, status_code, headers = @api_client.call_api(:PUT, local_var_path,
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names,
        :return_type => return_type)

      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: FbaOutboundApi#cancel_fulfillment_order\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end
    # Requests that Amazon ship items from the seller's inventory in Amazon's fulfillment network to a destination address.  **Usage Plan:**  | Rate (requests per second) | Burst | | ---- | ---- | | 2 | 30 |  For more information, see \"Usage Plans and Rate Limits\" in the Selling Partner API documentation.
    # @param body 
    # @param [Hash] opts the optional parameters
    # @return [CreateFulfillmentOrderResponse]
    def create_fulfillment_order(body, opts = {})
      data, _status_code, _headers = create_fulfillment_order_with_http_info(body, opts)
      data
    end

    # Requests that Amazon ship items from the seller&#x27;s inventory in Amazon&#x27;s fulfillment network to a destination address.  **Usage Plan:**  | Rate (requests per second) | Burst | | ---- | ---- | | 2 | 30 |  For more information, see \&quot;Usage Plans and Rate Limits\&quot; in the Selling Partner API documentation.
    # @param body 
    # @param [Hash] opts the optional parameters
    # @return [Array<(CreateFulfillmentOrderResponse, Integer, Hash)>] CreateFulfillmentOrderResponse data, response status code and response headers
    def create_fulfillment_order_with_http_info(body, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug 'Calling API: FbaOutboundApi.create_fulfillment_order ...'
      end
      # verify the required parameter 'body' is set
      if @api_client.config.client_side_validation && body.nil?
        fail ArgumentError, "Missing the required parameter 'body' when calling FbaOutboundApi.create_fulfillment_order"
      end
      # resource path
      local_var_path = '/fba/outbound/2020-07-01/fulfillmentOrders'

      # query parameters
      query_params = opts[:query_params] || {}

      # header parameters
      header_params = opts[:header_params] || {}
      # HTTP header 'Accept' (if needed)
      header_params['Accept'] = @api_client.select_header_accept(['application/json'])
      # HTTP header 'Content-Type'
      header_params['Content-Type'] = @api_client.select_header_content_type(['application/json'])

      # form parameters
      form_params = opts[:form_params] || {}

      # http body (model)
      post_body = opts[:body] || @api_client.object_to_http_body(body) 

      return_type = opts[:return_type] || 'CreateFulfillmentOrderResponse' 

      auth_names = opts[:auth_names] || []
      data, status_code, headers = @api_client.call_api(:POST, local_var_path,
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names,
        :return_type => return_type)

      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: FbaOutboundApi#create_fulfillment_order\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end
    # Creates a fulfillment return.   **Usage Plan:**  | Rate (requests per second) | Burst | | ---- | ---- | | 2 | 30 |  For more information, see \"Usage Plans and Rate Limits\" in the Selling Partner API documentation.
    # @param body 
    # @param seller_fulfillment_order_id An identifier assigned by the seller to the fulfillment order at the time it was created. The seller uses their own records to find the correct SellerFulfillmentOrderId value based on the buyer&#x27;s request to return items.
    # @param [Hash] opts the optional parameters
    # @return [CreateFulfillmentReturnResponse]
    def create_fulfillment_return(body, seller_fulfillment_order_id, opts = {})
      data, _status_code, _headers = create_fulfillment_return_with_http_info(body, seller_fulfillment_order_id, opts)
      data
    end

    # Creates a fulfillment return.   **Usage Plan:**  | Rate (requests per second) | Burst | | ---- | ---- | | 2 | 30 |  For more information, see \&quot;Usage Plans and Rate Limits\&quot; in the Selling Partner API documentation.
    # @param body 
    # @param seller_fulfillment_order_id An identifier assigned by the seller to the fulfillment order at the time it was created. The seller uses their own records to find the correct SellerFulfillmentOrderId value based on the buyer&#x27;s request to return items.
    # @param [Hash] opts the optional parameters
    # @return [Array<(CreateFulfillmentReturnResponse, Integer, Hash)>] CreateFulfillmentReturnResponse data, response status code and response headers
    def create_fulfillment_return_with_http_info(body, seller_fulfillment_order_id, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug 'Calling API: FbaOutboundApi.create_fulfillment_return ...'
      end
      # verify the required parameter 'body' is set
      if @api_client.config.client_side_validation && body.nil?
        fail ArgumentError, "Missing the required parameter 'body' when calling FbaOutboundApi.create_fulfillment_return"
      end
      # verify the required parameter 'seller_fulfillment_order_id' is set
      if @api_client.config.client_side_validation && seller_fulfillment_order_id.nil?
        fail ArgumentError, "Missing the required parameter 'seller_fulfillment_order_id' when calling FbaOutboundApi.create_fulfillment_return"
      end
      # resource path
      local_var_path = '/fba/outbound/2020-07-01/fulfillmentOrders/{sellerFulfillmentOrderId}/return'.sub('{' + 'sellerFulfillmentOrderId' + '}', seller_fulfillment_order_id.to_s)

      # query parameters
      query_params = opts[:query_params] || {}

      # header parameters
      header_params = opts[:header_params] || {}
      # HTTP header 'Accept' (if needed)
      header_params['Accept'] = @api_client.select_header_accept(['application/json', 'payload'])
      # HTTP header 'Content-Type'
      header_params['Content-Type'] = @api_client.select_header_content_type(['application/json'])

      # form parameters
      form_params = opts[:form_params] || {}

      # http body (model)
      post_body = opts[:body] || @api_client.object_to_http_body(body) 

      return_type = opts[:return_type] || 'CreateFulfillmentReturnResponse' 

      auth_names = opts[:auth_names] || []
      data, status_code, headers = @api_client.call_api(:PUT, local_var_path,
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names,
        :return_type => return_type)

      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: FbaOutboundApi#create_fulfillment_return\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end
    # Returns a list of inventory items that are eligible for the fulfillment feature you specify.  **Usage Plan:**  | Rate (requests per second) | Burst | | ---- | ---- | | 2 | 30 |  For more information, see \"Usage Plans and Rate Limits\" in the Selling Partner API documentation.
    # @param marketplace_id The marketplace for which to return a list of the inventory that is eligible for the specified feature.
    # @param feature_name The name of the feature for which to return a list of eligible inventory.
    # @param [Hash] opts the optional parameters
    # @option opts [String] :next_token A string token returned in the response to your previous request that is used to return the next response page. A value of null will return the first page.
    # @return [GetFeatureInventoryResponse]
    def get_feature_inventory(marketplace_id, feature_name, opts = {})
      data, _status_code, _headers = get_feature_inventory_with_http_info(marketplace_id, feature_name, opts)
      data
    end

    # Returns a list of inventory items that are eligible for the fulfillment feature you specify.  **Usage Plan:**  | Rate (requests per second) | Burst | | ---- | ---- | | 2 | 30 |  For more information, see \&quot;Usage Plans and Rate Limits\&quot; in the Selling Partner API documentation.
    # @param marketplace_id The marketplace for which to return a list of the inventory that is eligible for the specified feature.
    # @param feature_name The name of the feature for which to return a list of eligible inventory.
    # @param [Hash] opts the optional parameters
    # @option opts [String] :next_token A string token returned in the response to your previous request that is used to return the next response page. A value of null will return the first page.
    # @return [Array<(GetFeatureInventoryResponse, Integer, Hash)>] GetFeatureInventoryResponse data, response status code and response headers
    def get_feature_inventory_with_http_info(marketplace_id, feature_name, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug 'Calling API: FbaOutboundApi.get_feature_inventory ...'
      end
      # verify the required parameter 'marketplace_id' is set
      if @api_client.config.client_side_validation && marketplace_id.nil?
        fail ArgumentError, "Missing the required parameter 'marketplace_id' when calling FbaOutboundApi.get_feature_inventory"
      end
      # verify the required parameter 'feature_name' is set
      if @api_client.config.client_side_validation && feature_name.nil?
        fail ArgumentError, "Missing the required parameter 'feature_name' when calling FbaOutboundApi.get_feature_inventory"
      end
      # resource path
      local_var_path = '/fba/outbound/2020-07-01/features/inventory/{featureName}'.sub('{' + 'featureName' + '}', feature_name.to_s)

      # query parameters
      query_params = opts[:query_params] || {}
      query_params[:'marketplaceId'] = marketplace_id
      query_params[:'nextToken'] = opts[:'next_token'] if !opts[:'next_token'].nil?

      # header parameters
      header_params = opts[:header_params] || {}
      # HTTP header 'Accept' (if needed)
      header_params['Accept'] = @api_client.select_header_accept(['application/json', 'payload'])

      # form parameters
      form_params = opts[:form_params] || {}

      # http body (model)
      post_body = opts[:body] 

      return_type = opts[:return_type] || 'GetFeatureInventoryResponse' 

      auth_names = opts[:auth_names] || []
      data, status_code, headers = @api_client.call_api(:GET, local_var_path,
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names,
        :return_type => return_type)

      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: FbaOutboundApi#get_feature_inventory\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end
    # Returns the number of items with the sellerSKU you specify that can have orders fulfilled using the specified feature. Note that if the sellerSKU isn't eligible, the response will contain an empty skuInfo object.  **Usage Plan:**  | Rate (requests per second) | Burst | | ---- | ---- | | 2 | 30 |  For more information, see \"Usage Plans and Rate Limits\" in the Selling Partner API documentation.
    # @param marketplace_id The marketplace for which to return the count.
    # @param feature_name The name of the feature.
    # @param seller_sku Used to identify an item in the given marketplace. SellerSKU is qualified by the seller&#x27;s SellerId, which is included with every operation that you submit.
    # @param [Hash] opts the optional parameters
    # @return [GetFeatureSkuResponse]
    def get_feature_sku(marketplace_id, feature_name, seller_sku, opts = {})
      data, _status_code, _headers = get_feature_sku_with_http_info(marketplace_id, feature_name, seller_sku, opts)
      data
    end

    # Returns the number of items with the sellerSKU you specify that can have orders fulfilled using the specified feature. Note that if the sellerSKU isn&#x27;t eligible, the response will contain an empty skuInfo object.  **Usage Plan:**  | Rate (requests per second) | Burst | | ---- | ---- | | 2 | 30 |  For more information, see \&quot;Usage Plans and Rate Limits\&quot; in the Selling Partner API documentation.
    # @param marketplace_id The marketplace for which to return the count.
    # @param feature_name The name of the feature.
    # @param seller_sku Used to identify an item in the given marketplace. SellerSKU is qualified by the seller&#x27;s SellerId, which is included with every operation that you submit.
    # @param [Hash] opts the optional parameters
    # @return [Array<(GetFeatureSkuResponse, Integer, Hash)>] GetFeatureSkuResponse data, response status code and response headers
    def get_feature_sku_with_http_info(marketplace_id, feature_name, seller_sku, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug 'Calling API: FbaOutboundApi.get_feature_sku ...'
      end
      # verify the required parameter 'marketplace_id' is set
      if @api_client.config.client_side_validation && marketplace_id.nil?
        fail ArgumentError, "Missing the required parameter 'marketplace_id' when calling FbaOutboundApi.get_feature_sku"
      end
      # verify the required parameter 'feature_name' is set
      if @api_client.config.client_side_validation && feature_name.nil?
        fail ArgumentError, "Missing the required parameter 'feature_name' when calling FbaOutboundApi.get_feature_sku"
      end
      # verify the required parameter 'seller_sku' is set
      if @api_client.config.client_side_validation && seller_sku.nil?
        fail ArgumentError, "Missing the required parameter 'seller_sku' when calling FbaOutboundApi.get_feature_sku"
      end
      # resource path
      local_var_path = '/fba/outbound/2020-07-01/features/inventory/{featureName}/{sellerSku}'.sub('{' + 'featureName' + '}', feature_name.to_s).sub('{' + 'sellerSku' + '}', seller_sku.to_s)

      # query parameters
      query_params = opts[:query_params] || {}
      query_params[:'marketplaceId'] = marketplace_id

      # header parameters
      header_params = opts[:header_params] || {}
      # HTTP header 'Accept' (if needed)
      header_params['Accept'] = @api_client.select_header_accept(['application/json', 'payload'])

      # form parameters
      form_params = opts[:form_params] || {}

      # http body (model)
      post_body = opts[:body] 

      return_type = opts[:return_type] || 'GetFeatureSkuResponse' 

      auth_names = opts[:auth_names] || []
      data, status_code, headers = @api_client.call_api(:GET, local_var_path,
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names,
        :return_type => return_type)

      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: FbaOutboundApi#get_feature_sku\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end
    # Returns a list of features available for Multi-Channel Fulfillment orders in the marketplace you specify, and whether the seller for which you made the call is enrolled for each feature.  **Usage Plan:**  | Rate (requests per second) | Burst | | ---- | ---- | | 2 | 30 |  For more information, see \"Usage Plans and Rate Limits\" in the Selling Partner API documentation.
    # @param marketplace_id The marketplace for which to return the list of features.
    # @param [Hash] opts the optional parameters
    # @return [GetFeaturesResponse]
    def get_features(marketplace_id, opts = {})
      data, _status_code, _headers = get_features_with_http_info(marketplace_id, opts)
      data
    end

    # Returns a list of features available for Multi-Channel Fulfillment orders in the marketplace you specify, and whether the seller for which you made the call is enrolled for each feature.  **Usage Plan:**  | Rate (requests per second) | Burst | | ---- | ---- | | 2 | 30 |  For more information, see \&quot;Usage Plans and Rate Limits\&quot; in the Selling Partner API documentation.
    # @param marketplace_id The marketplace for which to return the list of features.
    # @param [Hash] opts the optional parameters
    # @return [Array<(GetFeaturesResponse, Integer, Hash)>] GetFeaturesResponse data, response status code and response headers
    def get_features_with_http_info(marketplace_id, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug 'Calling API: FbaOutboundApi.get_features ...'
      end
      # verify the required parameter 'marketplace_id' is set
      if @api_client.config.client_side_validation && marketplace_id.nil?
        fail ArgumentError, "Missing the required parameter 'marketplace_id' when calling FbaOutboundApi.get_features"
      end
      # resource path
      local_var_path = '/fba/outbound/2020-07-01/features'

      # query parameters
      query_params = opts[:query_params] || {}
      query_params[:'marketplaceId'] = marketplace_id

      # header parameters
      header_params = opts[:header_params] || {}
      # HTTP header 'Accept' (if needed)
      header_params['Accept'] = @api_client.select_header_accept(['application/json', 'payload'])

      # form parameters
      form_params = opts[:form_params] || {}

      # http body (model)
      post_body = opts[:body] 

      return_type = opts[:return_type] || 'GetFeaturesResponse' 

      auth_names = opts[:auth_names] || []
      data, status_code, headers = @api_client.call_api(:GET, local_var_path,
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names,
        :return_type => return_type)

      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: FbaOutboundApi#get_features\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end
    # Returns the fulfillment order indicated by the specified order identifier.  **Usage Plan:**  | Rate (requests per second) | Burst | | ---- | ---- | | 2 | 30 |  For more information, see \"Usage Plans and Rate Limits\" in the Selling Partner API documentation.
    # @param seller_fulfillment_order_id The identifier assigned to the item by the seller when the fulfillment order was created.
    # @param [Hash] opts the optional parameters
    # @return [GetFulfillmentOrderResponse]
    def get_fulfillment_order(seller_fulfillment_order_id, opts = {})
      data, _status_code, _headers = get_fulfillment_order_with_http_info(seller_fulfillment_order_id, opts)
      data
    end

    # Returns the fulfillment order indicated by the specified order identifier.  **Usage Plan:**  | Rate (requests per second) | Burst | | ---- | ---- | | 2 | 30 |  For more information, see \&quot;Usage Plans and Rate Limits\&quot; in the Selling Partner API documentation.
    # @param seller_fulfillment_order_id The identifier assigned to the item by the seller when the fulfillment order was created.
    # @param [Hash] opts the optional parameters
    # @return [Array<(GetFulfillmentOrderResponse, Integer, Hash)>] GetFulfillmentOrderResponse data, response status code and response headers
    def get_fulfillment_order_with_http_info(seller_fulfillment_order_id, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug 'Calling API: FbaOutboundApi.get_fulfillment_order ...'
      end
      # verify the required parameter 'seller_fulfillment_order_id' is set
      if @api_client.config.client_side_validation && seller_fulfillment_order_id.nil?
        fail ArgumentError, "Missing the required parameter 'seller_fulfillment_order_id' when calling FbaOutboundApi.get_fulfillment_order"
      end
      # resource path
      local_var_path = '/fba/outbound/2020-07-01/fulfillmentOrders/{sellerFulfillmentOrderId}'.sub('{' + 'sellerFulfillmentOrderId' + '}', seller_fulfillment_order_id.to_s)

      # query parameters
      query_params = opts[:query_params] || {}

      # header parameters
      header_params = opts[:header_params] || {}
      # HTTP header 'Accept' (if needed)
      header_params['Accept'] = @api_client.select_header_accept(['application/json', 'payload'])

      # form parameters
      form_params = opts[:form_params] || {}

      # http body (model)
      post_body = opts[:body] 

      return_type = opts[:return_type] || 'GetFulfillmentOrderResponse' 

      auth_names = opts[:auth_names] || []
      data, status_code, headers = @api_client.call_api(:GET, local_var_path,
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names,
        :return_type => return_type)

      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: FbaOutboundApi#get_fulfillment_order\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end
    # Returns a list of fulfillment order previews based on shipping criteria that you specify.  **Usage Plan:**  | Rate (requests per second) | Burst | | ---- | ---- | | 2 | 30 |  For more information, see \"Usage Plans and Rate Limits\" in the Selling Partner API documentation.
    # @param body 
    # @param [Hash] opts the optional parameters
    # @return [GetFulfillmentPreviewResponse]
    def get_fulfillment_preview(body, opts = {})
      data, _status_code, _headers = get_fulfillment_preview_with_http_info(body, opts)
      data
    end

    # Returns a list of fulfillment order previews based on shipping criteria that you specify.  **Usage Plan:**  | Rate (requests per second) | Burst | | ---- | ---- | | 2 | 30 |  For more information, see \&quot;Usage Plans and Rate Limits\&quot; in the Selling Partner API documentation.
    # @param body 
    # @param [Hash] opts the optional parameters
    # @return [Array<(GetFulfillmentPreviewResponse, Integer, Hash)>] GetFulfillmentPreviewResponse data, response status code and response headers
    def get_fulfillment_preview_with_http_info(body, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug 'Calling API: FbaOutboundApi.get_fulfillment_preview ...'
      end
      # verify the required parameter 'body' is set
      if @api_client.config.client_side_validation && body.nil?
        fail ArgumentError, "Missing the required parameter 'body' when calling FbaOutboundApi.get_fulfillment_preview"
      end
      # resource path
      local_var_path = '/fba/outbound/2020-07-01/fulfillmentOrders/preview'

      # query parameters
      query_params = opts[:query_params] || {}

      # header parameters
      header_params = opts[:header_params] || {}
      # HTTP header 'Accept' (if needed)
      header_params['Accept'] = @api_client.select_header_accept(['application/json', 'payload'])
      # HTTP header 'Content-Type'
      header_params['Content-Type'] = @api_client.select_header_content_type(['application/json'])

      # form parameters
      form_params = opts[:form_params] || {}

      # http body (model)
      post_body = opts[:body] || @api_client.object_to_http_body(body) 

      return_type = opts[:return_type] || 'GetFulfillmentPreviewResponse' 

      auth_names = opts[:auth_names] || []
      data, status_code, headers = @api_client.call_api(:POST, local_var_path,
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names,
        :return_type => return_type)

      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: FbaOutboundApi#get_fulfillment_preview\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end
    # Returns delivery tracking information for a package in an outbound shipment for a Multi-Channel Fulfillment order.  **Usage Plan:**  | Rate (requests per second) | Burst | | ---- | ---- | | 2 | 30 |  For more information, see \"Usage Plans and Rate Limits\" in the Selling Partner API documentation.
    # @param package_number The unencrypted package identifier returned by the getFulfillmentOrder operation.
    # @param [Hash] opts the optional parameters
    # @return [GetPackageTrackingDetailsResponse]
    def get_package_tracking_details(package_number, opts = {})
      data, _status_code, _headers = get_package_tracking_details_with_http_info(package_number, opts)
      data
    end

    # Returns delivery tracking information for a package in an outbound shipment for a Multi-Channel Fulfillment order.  **Usage Plan:**  | Rate (requests per second) | Burst | | ---- | ---- | | 2 | 30 |  For more information, see \&quot;Usage Plans and Rate Limits\&quot; in the Selling Partner API documentation.
    # @param package_number The unencrypted package identifier returned by the getFulfillmentOrder operation.
    # @param [Hash] opts the optional parameters
    # @return [Array<(GetPackageTrackingDetailsResponse, Integer, Hash)>] GetPackageTrackingDetailsResponse data, response status code and response headers
    def get_package_tracking_details_with_http_info(package_number, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug 'Calling API: FbaOutboundApi.get_package_tracking_details ...'
      end
      # verify the required parameter 'package_number' is set
      if @api_client.config.client_side_validation && package_number.nil?
        fail ArgumentError, "Missing the required parameter 'package_number' when calling FbaOutboundApi.get_package_tracking_details"
      end
      # resource path
      local_var_path = '/fba/outbound/2020-07-01/tracking'

      # query parameters
      query_params = opts[:query_params] || {}
      query_params[:'packageNumber'] = package_number

      # header parameters
      header_params = opts[:header_params] || {}
      # HTTP header 'Accept' (if needed)
      header_params['Accept'] = @api_client.select_header_accept(['application/json', 'payload'])

      # form parameters
      form_params = opts[:form_params] || {}

      # http body (model)
      post_body = opts[:body] 

      return_type = opts[:return_type] || 'GetPackageTrackingDetailsResponse' 

      auth_names = opts[:auth_names] || []
      data, status_code, headers = @api_client.call_api(:GET, local_var_path,
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names,
        :return_type => return_type)

      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: FbaOutboundApi#get_package_tracking_details\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end
    # Returns a list of fulfillment orders fulfilled after (or at) a specified date-time, or indicated by the next token parameter.  **Usage Plan:**  | Rate (requests per second) | Burst | | ---- | ---- | | 2 | 30 |  For more information, see \"Usage Plans and Rate Limits\" in the Selling Partner API documentation.
    # @param [Hash] opts the optional parameters
    # @option opts [DateTime] :query_start_date A date used to select fulfillment orders that were last updated after (or at) a specified time. An update is defined as any change in fulfillment order status, including the creation of a new fulfillment order.
    # @option opts [String] :next_token A string token returned in the response to your previous request.
    # @return [ListAllFulfillmentOrdersResponse]
    def list_all_fulfillment_orders(opts = {})
      data, _status_code, _headers = list_all_fulfillment_orders_with_http_info(opts)
      data
    end

    # Returns a list of fulfillment orders fulfilled after (or at) a specified date-time, or indicated by the next token parameter.  **Usage Plan:**  | Rate (requests per second) | Burst | | ---- | ---- | | 2 | 30 |  For more information, see \&quot;Usage Plans and Rate Limits\&quot; in the Selling Partner API documentation.
    # @param [Hash] opts the optional parameters
    # @option opts [DateTime] :query_start_date A date used to select fulfillment orders that were last updated after (or at) a specified time. An update is defined as any change in fulfillment order status, including the creation of a new fulfillment order.
    # @option opts [String] :next_token A string token returned in the response to your previous request.
    # @return [Array<(ListAllFulfillmentOrdersResponse, Integer, Hash)>] ListAllFulfillmentOrdersResponse data, response status code and response headers
    def list_all_fulfillment_orders_with_http_info(opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug 'Calling API: FbaOutboundApi.list_all_fulfillment_orders ...'
      end
      # resource path
      local_var_path = '/fba/outbound/2020-07-01/fulfillmentOrders'

      # query parameters
      query_params = opts[:query_params] || {}
      query_params[:'queryStartDate'] = opts[:'query_start_date'] if !opts[:'query_start_date'].nil?
      query_params[:'nextToken'] = opts[:'next_token'] if !opts[:'next_token'].nil?

      # header parameters
      header_params = opts[:header_params] || {}
      # HTTP header 'Accept' (if needed)
      header_params['Accept'] = @api_client.select_header_accept(['application/json', 'payload'])

      # form parameters
      form_params = opts[:form_params] || {}

      # http body (model)
      post_body = opts[:body] 

      return_type = opts[:return_type] || 'ListAllFulfillmentOrdersResponse' 

      auth_names = opts[:auth_names] || []
      data, status_code, headers = @api_client.call_api(:GET, local_var_path,
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names,
        :return_type => return_type)

      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: FbaOutboundApi#list_all_fulfillment_orders\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end
    # Returns a list of return reason codes for a seller SKU in a given marketplace.  **Usage Plan:**  | Rate (requests per second) | Burst | | ---- | ---- | | 2 | 30 |  For more information, see \"Usage Plans and Rate Limits\" in the Selling Partner API documentation.
    # @param seller_sku The seller SKU for which return reason codes are required.
    # @param language The language that the TranslatedDescription property of the ReasonCodeDetails response object should be translated into.
    # @param [Hash] opts the optional parameters
    # @option opts [String] :marketplace_id The marketplace for which the seller wants return reason codes.
    # @option opts [String] :seller_fulfillment_order_id The identifier assigned to the item by the seller when the fulfillment order was created. The service uses this value to determine the marketplace for which the seller wants return reason codes.
    # @return [ListReturnReasonCodesResponse]
    def list_return_reason_codes(seller_sku, language, opts = {})
      data, _status_code, _headers = list_return_reason_codes_with_http_info(seller_sku, language, opts)
      data
    end

    # Returns a list of return reason codes for a seller SKU in a given marketplace.  **Usage Plan:**  | Rate (requests per second) | Burst | | ---- | ---- | | 2 | 30 |  For more information, see \&quot;Usage Plans and Rate Limits\&quot; in the Selling Partner API documentation.
    # @param seller_sku The seller SKU for which return reason codes are required.
    # @param language The language that the TranslatedDescription property of the ReasonCodeDetails response object should be translated into.
    # @param [Hash] opts the optional parameters
    # @option opts [String] :marketplace_id The marketplace for which the seller wants return reason codes.
    # @option opts [String] :seller_fulfillment_order_id The identifier assigned to the item by the seller when the fulfillment order was created. The service uses this value to determine the marketplace for which the seller wants return reason codes.
    # @return [Array<(ListReturnReasonCodesResponse, Integer, Hash)>] ListReturnReasonCodesResponse data, response status code and response headers
    def list_return_reason_codes_with_http_info(seller_sku, language, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug 'Calling API: FbaOutboundApi.list_return_reason_codes ...'
      end
      # verify the required parameter 'seller_sku' is set
      if @api_client.config.client_side_validation && seller_sku.nil?
        fail ArgumentError, "Missing the required parameter 'seller_sku' when calling FbaOutboundApi.list_return_reason_codes"
      end
      # verify the required parameter 'language' is set
      if @api_client.config.client_side_validation && language.nil?
        fail ArgumentError, "Missing the required parameter 'language' when calling FbaOutboundApi.list_return_reason_codes"
      end
      # resource path
      local_var_path = '/fba/outbound/2020-07-01/returnReasonCodes'

      # query parameters
      query_params = opts[:query_params] || {}
      query_params[:'sellerSku'] = seller_sku
      query_params[:'language'] = language
      query_params[:'marketplaceId'] = opts[:'marketplace_id'] if !opts[:'marketplace_id'].nil?
      query_params[:'sellerFulfillmentOrderId'] = opts[:'seller_fulfillment_order_id'] if !opts[:'seller_fulfillment_order_id'].nil?

      # header parameters
      header_params = opts[:header_params] || {}
      # HTTP header 'Accept' (if needed)
      header_params['Accept'] = @api_client.select_header_accept(['application/json', 'payload'])

      # form parameters
      form_params = opts[:form_params] || {}

      # http body (model)
      post_body = opts[:body] 

      return_type = opts[:return_type] || 'ListReturnReasonCodesResponse' 

      auth_names = opts[:auth_names] || []
      data, status_code, headers = @api_client.call_api(:GET, local_var_path,
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names,
        :return_type => return_type)

      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: FbaOutboundApi#list_return_reason_codes\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end
    # Updates and/or requests shipment for a fulfillment order with an order hold on it.  **Usage Plan:**  | Rate (requests per second) | Burst | | ---- | ---- | | 2 | 30 |  For more information, see \"Usage Plans and Rate Limits\" in the Selling Partner API documentation.
    # @param body 
    # @param seller_fulfillment_order_id The identifier assigned to the item by the seller when the fulfillment order was created.
    # @param [Hash] opts the optional parameters
    # @return [UpdateFulfillmentOrderResponse]
    def update_fulfillment_order(body, seller_fulfillment_order_id, opts = {})
      data, _status_code, _headers = update_fulfillment_order_with_http_info(body, seller_fulfillment_order_id, opts)
      data
    end

    # Updates and/or requests shipment for a fulfillment order with an order hold on it.  **Usage Plan:**  | Rate (requests per second) | Burst | | ---- | ---- | | 2 | 30 |  For more information, see \&quot;Usage Plans and Rate Limits\&quot; in the Selling Partner API documentation.
    # @param body 
    # @param seller_fulfillment_order_id The identifier assigned to the item by the seller when the fulfillment order was created.
    # @param [Hash] opts the optional parameters
    # @return [Array<(UpdateFulfillmentOrderResponse, Integer, Hash)>] UpdateFulfillmentOrderResponse data, response status code and response headers
    def update_fulfillment_order_with_http_info(body, seller_fulfillment_order_id, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug 'Calling API: FbaOutboundApi.update_fulfillment_order ...'
      end
      # verify the required parameter 'body' is set
      if @api_client.config.client_side_validation && body.nil?
        fail ArgumentError, "Missing the required parameter 'body' when calling FbaOutboundApi.update_fulfillment_order"
      end
      # verify the required parameter 'seller_fulfillment_order_id' is set
      if @api_client.config.client_side_validation && seller_fulfillment_order_id.nil?
        fail ArgumentError, "Missing the required parameter 'seller_fulfillment_order_id' when calling FbaOutboundApi.update_fulfillment_order"
      end
      # resource path
      local_var_path = '/fba/outbound/2020-07-01/fulfillmentOrders/{sellerFulfillmentOrderId}'.sub('{' + 'sellerFulfillmentOrderId' + '}', seller_fulfillment_order_id.to_s)

      # query parameters
      query_params = opts[:query_params] || {}

      # header parameters
      header_params = opts[:header_params] || {}
      # HTTP header 'Accept' (if needed)
      header_params['Accept'] = @api_client.select_header_accept(['application/json'])
      # HTTP header 'Content-Type'
      header_params['Content-Type'] = @api_client.select_header_content_type(['application/json'])

      # form parameters
      form_params = opts[:form_params] || {}

      # http body (model)
      post_body = opts[:body] || @api_client.object_to_http_body(body) 

      return_type = opts[:return_type] || 'UpdateFulfillmentOrderResponse' 

      auth_names = opts[:auth_names] || []
      data, status_code, headers = @api_client.call_api(:PUT, local_var_path,
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names,
        :return_type => return_type)

      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: FbaOutboundApi#update_fulfillment_order\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end
  end
end
