public static List <string> GetImportedItemFulfillments()
        {
            var getImportedItemFulfillmentsRetryPolicy = Policy.Handle <SqlException>()
                                                         .WaitAndRetry(4, _ => TimeSpan.FromSeconds(30), (ex, ts, count, context) =>
            {
                string errorMessage = "Error in GetImportedItemFulfillments";
                Log.Warning(ex, $"{errorMessage} . Retrying...");

                if (count == 4)
                {
                    Log.Error(ex, errorMessage);
                }
            });

            return(getImportedItemFulfillmentsRetryPolicy.Execute(() =>
            {
                RestClient client = new RestClient($"{BigCommerceHelper.baseUrl}/{bigCommerceOrderId}/shipments");
                RestRequest request = BigCommerceHelper.CreateNewGetRequest();

                IRestResponse shipmentsApiResponse = client.Execute(request);
                JArray parsedShipmentsApiResponse = BigCommerceHelper.ParseApiResponse(shipmentsApiResponse.Content);
                List <string> shipmentsOnOrder = new List <string>();

                foreach (var shipment in parsedShipmentsApiResponse)
                {
                    Shipment parsedShipment = JsonConvert.DeserializeObject <Shipment>(shipment.ToString());
                    string netsuiteItemFulfillmentId = parsedShipment.NetSuiteItemFulfillmentId;
                    shipmentsOnOrder.Add(netsuiteItemFulfillmentId);
                }

                Log.Information("shipmentsOnOrder {@shipmentsOnOrder}", shipmentsOnOrder);

                return shipmentsOnOrder;
            }));
        }
        public static List <Product> GetProductsOnOrder(string productsUrl)
        {
            var getProductsOnOrderRetryPolicy = Policy.Handle <SqlException>()
                                                .WaitAndRetry(4, _ => TimeSpan.FromSeconds(30), (ex, ts, count, context) =>
            {
                string errorMessage = "Error in GetProductsOnOrder";
                Log.Warning(ex, $"{errorMessage} . Retrying...");

                if (count == 4)
                {
                    Log.Error(ex, errorMessage);
                }
            });

            return(getProductsOnOrderRetryPolicy.Execute(() =>
            {
                RestClient client = new RestClient(productsUrl);
                RestRequest request = BigCommerceHelper.CreateNewGetRequest();

                IRestResponse productsApiResponse = client.Execute(request);
                JArray parsedProductsApiResponse = BigCommerceHelper.ParseApiResponse(productsApiResponse.Content);
                List <Product> productsOnOrder = new List <Product>();

                foreach (var product in parsedProductsApiResponse)
                {
                    Product parsedProduct = JsonConvert.DeserializeObject <Product>(product.ToString());
                    productsOnOrder.Add(parsedProduct);
                }

                Log.Information("productsOnOrder {@productsOnOrder}", productsOnOrder);

                return productsOnOrder;
            }));
        }
        public static ShippingAddress GetCustomerShippingAddress(string shippingAddressUrl)
        {
            var getCustomerShippingAddressRetryPolicy = Policy.Handle <SqlException>()
                                                        .WaitAndRetry(4, _ => TimeSpan.FromSeconds(30), (ex, ts, count, context) =>
            {
                string errorMessage = "Error in GetCustomerShippingAddress";
                Log.Warning(ex, $"{errorMessage} . Retrying...");

                if (count == 4)
                {
                    Log.Error(ex, errorMessage);
                }
            });

            return(getCustomerShippingAddressRetryPolicy.Execute(() =>
            {
                RestClient client = new RestClient(shippingAddressUrl);
                RestRequest request = BigCommerceHelper.CreateNewGetRequest();

                IRestResponse shippingAddressApiResponse = client.Execute(request);
                JArray parsedShippingAddressApiResponse = BigCommerceHelper.ParseApiResponse(shippingAddressApiResponse.Content);

                // There will only be one shipping address, so we get the address at the first index
                ShippingAddress parsedShippingAddress = JsonConvert.DeserializeObject <ShippingAddress>(parsedShippingAddressApiResponse[0].ToString());
                Log.Information("Shipping address id: {@shippingAddressId}", parsedShippingAddress.id);

                return parsedShippingAddress;
            }));
        }
        public static Shipment PostShipmentToBigCommerce(Shipment shipmentToCreate)
        {
            RestClient client = new RestClient($"{BigCommerceHelper.baseUrl}/{bigCommerceOrderId}/shipments");

            string      jsonRequest = JsonConvert.SerializeObject(shipmentToCreate);
            RestRequest request     = BigCommerceHelper.CreateNewPostRequest(jsonRequest);

            IRestResponse shipmentApiResponse = client.Execute(request);

            // If there is an error, the API will send the response as a JArray instead of JObject
            try
            {
                Shipment shipmentCreated = JsonConvert.DeserializeObject <Shipment>(shipmentApiResponse.Content);
                Log.Information($"Shipment created in Big Commerce. Shipment id: {shipmentCreated.ShipmentId}, Big Commerce order id: {bigCommerceOrderId}");

                return(shipmentCreated);
            }
            catch (Exception ex)
            {
                JArray bigCommerceErrorResponse = BigCommerceHelper.ParseApiResponse(shipmentApiResponse.Content);

                string errorMessage = $"Invalid shipment request. Error: {bigCommerceErrorResponse}";
                Log.Error($"Error in PostShipmentToBigCommerce. {errorMessage}");

                throw new Exception(errorMessage);
            }
        }
        private static JArray GetOrdersAwaitingShipment()
        {
            RestClient  client  = new RestClient($"{BigCommerceHelper.baseUrl}?status_id=9");
            RestRequest request = BigCommerceHelper.CreateNewGetRequest();

            IRestResponse jsonResponse   = client.Execute(request);
            JArray        parsedResponse = BigCommerceHelper.ParseApiResponse(jsonResponse.Content);

            return(parsedResponse);
        }
        public static ShippingAddress GetCustomerShippingAddress(string shippingAddressUrl)
        {
            RestClient  client  = new RestClient(shippingAddressUrl);
            RestRequest request = BigCommerceHelper.CreateNewGetRequest();

            IRestResponse shippingAddressApiResponse       = client.Execute(request);
            JArray        parsedShippingAddressApiResponse = BigCommerceHelper.ParseApiResponse(shippingAddressApiResponse.Content);

            ShippingAddress parsedShippingAddress = JsonConvert.DeserializeObject <ShippingAddress>(parsedShippingAddressApiResponse[0].ToString());

            Log.Information("parsedShippingAddress {@parsedShippingAddress}", parsedShippingAddress);

            return(parsedShippingAddress);
        }
        public static JArray GetOrdersByStatus(int statusId)
        {
            RestClient  client  = new RestClient($"{getOrdersByStatusBaseUrl}{statusId}");
            RestRequest request = BigCommerceHelper.CreateNewGetRequest();

            string jsonResponse = client.Execute(request).Content;

            // Handles if there are no orders for a given status
            if (jsonResponse == "")
            {
                return(new JArray());
            }

            return(BigCommerceHelper.ParseApiResponse(jsonResponse));
        }
        public static JArray GetOrdersAwaitingFulfillment()
        {
            RestClient  client  = new RestClient($"{BigCommerceHelper.baseUrl}?status_id={awaitingFulfillmentStatusId}");
            RestRequest request = BigCommerceHelper.CreateNewGetRequest();

            string jsonResponse = client.Execute(request).Content;
            JArray parsedResponse;

            // Handles if there are no orders for a given status
            if (jsonResponse == "")
            {
                parsedResponse = new JArray();
            }
            else
            {
                parsedResponse = BigCommerceHelper.ParseApiResponse(jsonResponse);
            }

            return(parsedResponse);
        }
        public static List <Product> GetProductsOnOrder(string productsUrl)
        {
            RestClient  client  = new RestClient(productsUrl);
            RestRequest request = BigCommerceHelper.CreateNewGetRequest();

            IRestResponse  productsApiResponse       = client.Execute(request);
            JArray         parsedProductsApiResponse = BigCommerceHelper.ParseApiResponse(productsApiResponse.Content);
            List <Product> productsOnOrder           = new List <Product>();

            foreach (var product in parsedProductsApiResponse)
            {
                Product parsedProduct = JsonConvert.DeserializeObject <Product>(product.ToString());

                // Map rate and amount values to the NetSuite expected names
                parsedProduct.Rate   = Convert.ToDouble(parsedProduct.BasePrice);
                parsedProduct.Amount = Convert.ToDouble(parsedProduct.BaseTotal);

                productsOnOrder.Add(parsedProduct);
            }

            Log.Information("productsOnOrder {@productsOnOrder}", productsOnOrder);

            return(productsOnOrder);
        }