private void PollingLoop(PollingLoopData data, Func<bool> poll)
        {
            try
            {
                var sleepMillSec = 8000;
                var loopMillSec = 90000;
                var startTime = DateTime.Now.TimeOfDay;

                for (int i = 0; i < 99 && (DateTime.Now.TimeOfDay.Milliseconds - startTime.Milliseconds) <= loopMillSec; ++i)
                {
                    // inside the loop cause other instances are also updating the order
                    data.Order = _orderService.GetOrderById(data.OrderId);

                    if (data.Settings == null)
                        data.Settings = _services.Settings.LoadSetting<AmazonPaySettings>(data.Order.StoreId);

                    if (data.Client == null)
                        data.Client = new AmazonPayClient(data.Settings);

                    if (!poll())
                        break;

                    Thread.Sleep(sleepMillSec);
                }
            }
            catch (OffAmazonPaymentsServiceException exc)
            {
                LogAmazonError(exc);
            }
            catch (Exception exc)
            {
                LogError(exc);
            }
        }
        private void EarlyPolling(int orderId, AmazonPaySettings settings)
        {
            // the Authorization object moves to the Open state after remaining in the Pending state for 30 seconds.

            AmazonPayApiData data;
            var d = new PollingLoopData(orderId);
            d.Settings = settings;

            PollingLoop(d, () =>
            {
                if (d.Order.AuthorizationTransactionId.IsNullOrEmpty())
                    return false;

                var details = _api.GetAuthorizationDetails(d.Client, d.Order.AuthorizationTransactionId, out data);

                if (!data.State.IsCaseInsensitiveEqual("pending"))
                {
                    ProcessAuthorizationResult(d.Client, d.Order, data, details);
                    return false;
                }
                return true;
            });

            PollingLoop(d, () =>
            {
                if (d.Order.CaptureTransactionId.IsNullOrEmpty())
                    return false;

                _api.GetCaptureDetails(d.Client, d.Order.CaptureTransactionId, out data);

                ProcessCaptureResult(d.Client, d.Order, data);

                return data.State.IsCaseInsensitiveEqual("pending");
            });
        }