public async Task <PublishDeltaResult> PublishProductDeltas(IEnumerable <Product> products, IEnumerable <DeletedProductSku> deletedProducts, IEnumerable <AccountPrice> accountPrices, IEnumerable <DeletedAccountPrice> deletedAccountPrices, string accessKey)
        {
            var deltas             = new List <ProcessedProductDelta>();
            var publishDeltaResult = new PublishDeltaResult();
            var endpoint           = RegionEndpoints.GetRegionEndpoints(region);
            var fullEndpoint       = $"{endpoint.APIEndpoint}{deltaEndpointSuffix}";

            try
            {
                deltas = ConversionManager.ProcessProductDeltas(products, deletedProducts, accountPrices, deletedAccountPrices, accessKey);
            }
            catch (Exception e)
            {
                return(new PublishDeltaResult
                {
                    Success = false,
                    Errors = new List <PublishDeltaError> {
                        new PublishDeltaError {
                            Error = e.Message,
                            Skus = products.Count() > 0 ? products.Select(prod => prod.Sku) : null,
                            DeletedSkus = deletedProducts.Count() > 0 ? deletedProducts.Select(deletedProd => deletedProd.Sku) : null,
                            AccountPrices = accountPrices,
                            DeletedAccountPrices = deletedAccountPrices
                        }
                    }
                });
            }

            foreach (var delta in deltas)
            {
                try
                {
                    var json        = JSONSerialization.SerializeToJSON(delta);
                    var deltaResult = await HttpCalls.Post <DeltaResult>(json, fullEndpoint);

                    publishDeltaResult.Tokens.Add(deltaResult.Token);
                }
                catch (Exception e)
                {
                    publishDeltaResult.Errors.Add(new PublishDeltaError {
                        Error                = e.Message,
                        Skus                 = products.Count() > 0 ? products.Select(prod => prod.Sku) : null,
                        DeletedSkus          = deletedProducts.Count() > 0 ? deletedProducts.Select(deletedProd => deletedProd.Sku) : null,
                        AccountPrices        = accountPrices,
                        DeletedAccountPrices = deletedAccountPrices
                    });
                }
            }

            publishDeltaResult.Success = publishDeltaResult.Errors.Count == 0;
            return(publishDeltaResult);
        }
        public async Task <PublishDeltaResult> PublishDeltasAsync()
        {
            if (!_feedsValid)
            {
                return(new PublishDeltaResult {
                    Success = false, Error = "Feeds not yet successfully validated"
                });
            }

            var publishManager = new PublishManager(_accessKey, _secretKey, _region);
            var publishResult  = new PublishDeltaResult();

            if (!_productsPushed)
            {
                publishResult = await publishManager.PublishProductDeltas(_productCollection.GetItems(), _deletedProductCollection.GetItems(), _accountPriceCollection.GetItems(), _deletedAccountPriceCollection.GetItems(), _accessKey);

                _productsPushed = true;
            }

            return(publishResult);
        }