/// <summary>
        /// Initializes a new instance of the <see cref="KinesisFirehoseSink"/> class.
        /// </summary>
        /// <param name="context">The <see cref="IPlugInContext"/> that contains configuration info, logger, metrics etc.</param>
        /// <param name="failoverSink">The <see cref="FailoverSink{AmazonKinesisFirehoseClient}"/> that defines failover sink class.</param>
        /// <param name="failoverSinkRegionStrategy">The <see cref="FailoverStrategy{AmazonKinesisFirehoseClient}"/> that defines failover sink region selection strategy.</param>
        public KinesisFirehoseSink(
            IPlugInContext context,
            FailoverSink <AmazonKinesisFirehoseClient> failoverSink,
            FailoverStrategy <AmazonKinesisFirehoseClient> failoverSinkRegionStrategy)
            : this(context, failoverSinkRegionStrategy.GetPrimaryRegionClient()) // Setup Kinesis Firehose Client with Primary Region
        {
            // Parse or default
            // Max wait interval between failback retry
            if (!int.TryParse(_config[ConfigConstants.MAX_FAILBACK_RETRY_INTERVAL_IN_MINUTES], out _maxFailbackRetryIntervalInMinutes))
            {
                _maxFailbackRetryIntervalInMinutes = ConfigConstants.DEFAULT_MIN_WAIT_BEFORE_REGION_FAILBACK_RETRY_IN_MINUTES;
            }
            else if (_maxFailbackRetryIntervalInMinutes < ConfigConstants.DEFAULT_MIN_WAIT_BEFORE_REGION_FAILBACK_RETRY_IN_MINUTES)
            {
                throw new ArgumentException(String.Format("Invalid \"{0}\" value, please provide positive integer greator than \"{1}\".",
                                                          ConfigConstants.MAX_FAILBACK_RETRY_INTERVAL_IN_MINUTES, ConfigConstants.DEFAULT_MIN_WAIT_BEFORE_REGION_FAILBACK_RETRY_IN_MINUTES));
            }

            // Failover Sink
            _failoverSink        = failoverSink;
            _failoverSinkEnabled = true;
            // Failover Sink Region Strategy
            _failoverSinkRegionStrategy = failoverSinkRegionStrategy;

            // Setup Primary Region Failback Timer
            _primaryRegionFailbackTimer           = new System.Timers.Timer(_maxFailbackRetryIntervalInMinutes * 60 * 1000);
            _primaryRegionFailbackTimer.Elapsed  += new ElapsedEventHandler(FailbackToPrimaryRegion);
            _primaryRegionFailbackTimer.AutoReset = true;
            _primaryRegionFailbackTimer.Start();
        }
        /// <inheritdoc/>
        public TAWSClient FailbackToPrimaryRegion(Throttle throttle)
        {
            _logger?.LogDebug($"FailoverSink id {Id} is trying to fail back to primary region.");
            // Setup client with Primary Region
            var client = _failoverSinkRegionStrategy.GetPrimaryRegionClient();

            if (client is not null)
            {
                // Reset Throttle
                throttle.SetSuccess();

                _logger?.LogInformation($"FailoverSink id {Id} failed back successfully to primary region {_failoverSinkRegionStrategy.GetCurrentRegion().Region.SystemName}.");
                return(client);
            }
            else
            {
                _logger?.LogDebug($"FailoverSink id {Id} fail back to primary region unsuccessful, primary region currently is down or in use.");
            }

            return(null);
        }