/// <summary>
        /// Gets the shipping methods.
        /// </summary>
        /// <param name="storefront">The storefront.</param>
        /// <param name="visitorContext">The visitor context.</param>
        /// <param name="option">The option.</param>
        /// <returns>The manager response where the shipping methods are returned in the result.</returns>
        public ManagerResponse <Connect.Services.Orders.GetShippingMethodsResult, IReadOnlyCollection <ShippingMethod> > GetShippingMethods([NotNull] CommerceStorefront storefront, [NotNull] VisitorContext visitorContext, [NotNull] ShippingOption option)
        {
            Assert.ArgumentNotNull(storefront, "storefront");
            Assert.ArgumentNotNull(visitorContext, "visitorContext");
            Assert.ArgumentNotNull(option, "option");

            // TODO: Remove hard coded language - will be fixed in connect.
            var request = new Connect.Services.Orders.GetShippingMethodsRequest("en-us", option, null);

            var result = this.ShippingServiceProvider.GetShippingMethods <Connect.Services.Orders.GetShippingMethodsRequest, Connect.Services.Orders.GetShippingMethodsResult>(request);

            Helpers.LogSystemMessages(result.SystemMessages, result);
            return(new ManagerResponse <Connect.Services.Orders.GetShippingMethodsResult, IReadOnlyCollection <ShippingMethod> >(result, result.ShippingMethods));
        }
        /// <summary>
        /// Gets the shipping methods.
        /// </summary>
        /// <param name="storefront">The storefront.</param>
        /// <param name="visitorContext">The visitor context.</param>
        /// <param name="inputModel">The input model.</param>
        /// <returns>
        /// The manager response where the shipping methods are returned in the Result.
        /// </returns>
        public ManagerResponse <Connect.Services.Orders.GetShippingMethodsResult, IReadOnlyCollection <ShippingMethod> > GetShippingMethods([NotNull] CommerceStorefront storefront, [NotNull] VisitorContext visitorContext, [NotNull] GetShippingMethodsInputModel inputModel)
        {
            Assert.ArgumentNotNull(storefront, "storefront");
            Assert.ArgumentNotNull(visitorContext, "visitorContext");
            Assert.ArgumentNotNull(inputModel, "inputModel");

            var errorResult = new Connect.Services.Orders.GetShippingMethodsResult {
                Success = false
            };
            var cartResult = this.CartManager.GetCurrentCart(storefront, visitorContext);

            if (!cartResult.ServiceProviderResult.Success || cartResult.Result == null)
            {
                errorResult.SystemMessages.ToList().AddRange(cartResult.ServiceProviderResult.SystemMessages);
                return(new ManagerResponse <Connect.Services.Orders.GetShippingMethodsResult, IReadOnlyCollection <ShippingMethod> >(errorResult, null));
            }

            var cart = cartResult.Result;

            var preferenceType = InputModelExtension.GetShippingOptionType(inputModel.ShippingPreferenceType);

            if (inputModel.Lines != null && inputModel.Lines.Any())
            {
                // We only support a single line at a time, hence accessing element 0 is ok.
                preferenceType = InputModelExtension.GetShippingOptionType(inputModel.Lines[0].ShippingPreferenceType);
            }

            // TODO: Remove hard coded language - will be fixed in connect.
            var request = new Connect.Services.Orders.GetShippingMethodsRequest(
                "en-us",
                new ShippingOption {
                ShippingOptionType = preferenceType
            },
                (inputModel.ShippingAddress != null) ? inputModel.ShippingAddress.ToParty() : null)
            {
                Cart  = cart,
                Lines = (inputModel.Lines != null) ? inputModel.Lines.ToCommerceCartLines().Cast <CartLine>().ToList() : null
            };

            var result = this.ShippingServiceProvider.GetShippingMethods <Connect.Services.Orders.GetShippingMethodsRequest, Connect.Services.Orders.GetShippingMethodsResult>(request);

            Helpers.LogSystemMessages(errorResult.SystemMessages, errorResult);
            return(new ManagerResponse <Connect.Services.Orders.GetShippingMethodsResult, IReadOnlyCollection <ShippingMethod> >(result, result.ShippingMethods));
        }
        /// <summary>
        /// Gets the shipping methods.
        /// </summary>
        /// <param name="storefront">The storefront.</param>
        /// <param name="visitorContext">The visitor context.</param>
        /// <param name="inputModel">The input model.</param>
        /// <returns>
        /// The manager response where the shipping methods are returned in the Result.
        /// </returns>
        public ManagerResponse<Connect.Services.Orders.GetShippingMethodsResult, IReadOnlyCollection<ShippingMethod>> GetShippingMethods([NotNull] CommerceStorefront storefront, [NotNull] VisitorContext visitorContext, [NotNull] GetShippingMethodsInputModel inputModel)
        {
            Assert.ArgumentNotNull(storefront, "storefront");
            Assert.ArgumentNotNull(visitorContext, "visitorContext");
            Assert.ArgumentNotNull(inputModel, "inputModel");

            var errorResult = new Connect.Services.Orders.GetShippingMethodsResult { Success = false };
            var cartResult = this.CartManager.GetCurrentCart(storefront, visitorContext);
            if (!cartResult.ServiceProviderResult.Success || cartResult.Result == null)
            {
                errorResult.SystemMessages.ToList().AddRange(cartResult.ServiceProviderResult.SystemMessages);
                return new ManagerResponse<Connect.Services.Orders.GetShippingMethodsResult, IReadOnlyCollection<ShippingMethod>>(errorResult, null);
            }

            var cart = cartResult.Result;

            var preferenceType = InputModelExtension.GetShippingOptionType(inputModel.ShippingPreferenceType);
            if (inputModel.Lines != null && inputModel.Lines.Any())
            {
                // We only support a single line at a time, hence accessing element 0 is ok.
                preferenceType = InputModelExtension.GetShippingOptionType(inputModel.Lines[0].ShippingPreferenceType);
            }

            // TODO: Remove hard coded language - will be fixed in connect.
            var request = new Connect.Services.Orders.GetShippingMethodsRequest(
                "en-us",
                new ShippingOption { ShippingOptionType = preferenceType },
                (inputModel.ShippingAddress != null) ? inputModel.ShippingAddress.ToParty() : null)
                {
                    Cart = cart,
                    Lines = (inputModel.Lines != null) ? inputModel.Lines.ToCommerceCartLines().Cast<CartLine>().ToList() : null
                };

            var result = this.ShippingServiceProvider.GetShippingMethods<Connect.Services.Orders.GetShippingMethodsRequest, Connect.Services.Orders.GetShippingMethodsResult>(request);

            Helpers.LogSystemMessages(errorResult.SystemMessages, errorResult);
            return new ManagerResponse<Connect.Services.Orders.GetShippingMethodsResult, IReadOnlyCollection<ShippingMethod>>(result, result.ShippingMethods);
        }
        /// <summary>
        /// Gets the shipping methods.
        /// </summary>
        /// <param name="storefront">The storefront.</param>
        /// <param name="visitorContext">The visitor context.</param>
        /// <param name="option">The option.</param>
        /// <returns>The manager response where the shipping methods are returned in the result.</returns>
        public ManagerResponse<Connect.Services.Orders.GetShippingMethodsResult, IReadOnlyCollection<ShippingMethod>> GetShippingMethods([NotNull] CommerceStorefront storefront, [NotNull] VisitorContext visitorContext, [NotNull] ShippingOption option)
        {
            Assert.ArgumentNotNull(storefront, "storefront");
            Assert.ArgumentNotNull(visitorContext, "visitorContext");
            Assert.ArgumentNotNull(option, "option");

            // TODO: Remove hard coded language - will be fixed in connect.
            var request = new Connect.Services.Orders.GetShippingMethodsRequest("en-us", option, null);

            var result = this.ShippingServiceProvider.GetShippingMethods<Connect.Services.Orders.GetShippingMethodsRequest, Connect.Services.Orders.GetShippingMethodsResult>(request);

            Helpers.LogSystemMessages(result.SystemMessages, result);
            return new ManagerResponse<Connect.Services.Orders.GetShippingMethodsResult, IReadOnlyCollection<ShippingMethod>>(result, result.ShippingMethods);
        }