/// <summary>
        ///     Inits and requests a redirectUrl for bank account sychronisation
        /// </summary>
        /// <param name="stateToken"></param>
        /// <param name="returnUrl"></param>
        /// <param name="accountIds"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException"></exception>
        /// <exception cref="ArgumentException"></exception>
        public async Task <Uri> GetRedirectUriForSyncAccountsAsync(string stateToken, string returnUrl, List <string> accountIds)
        {
            if (accountIds == null)
            {
                throw new ArgumentNullException(nameof(accountIds));
            }

            if (accountIds.Count == 0)
            {
                throw new ArgumentException(nameof(accountIds) + " empty.");
            }

            if (string.IsNullOrEmpty(returnUrl))
            {
                throw new ArgumentException("Value cannot be null or empty.", nameof(returnUrl));
            }

            var init        = new InitiationApi(this.Configuration, this.Logger);
            var shieldToken = await init.CreateSyncShieldTokenAsync(new ShieldTokenSyncRequest(
                                                                        stateToken,
                                                                        returnUrl,
                                                                        accountIds))
                              .ConfigureAwait(false);

            return(new Uri(shieldToken.Location));
        }
        /// <summary>
        ///     Inits and requests a redirectUrl for a shieldToken
        /// </summary>
        /// <param name="stateToken"></param>
        /// <param name="returnUrl"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentException"></exception>
        public async Task <Uri> GetRedirectUriForShieldTokenAsync(string stateToken, string returnUrl)
        {
            if (string.IsNullOrEmpty(returnUrl))
            {
                throw new ArgumentException("Value cannot be null or whitespace.", nameof(returnUrl));
            }

            var init        = new InitiationApi(this.Configuration, this.Logger);
            var shieldToken = await init.CreateConnectShieldTokenAsync(new ShieldTokenRequest(stateToken, returnUrl)).ConfigureAwait(false);

            return(new Uri(shieldToken.Location));
        }
        /// <summary>
        ///     Inits and requests a redirectUrl for a payment
        /// </summary>
        /// <param name="stateToken"></param>
        /// <param name="redirectUri"></param>
        /// <param name="accountId"></param>
        /// <param name="payment"></param>
        /// <param name="tanSchemeId"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException"></exception>
        /// <exception cref="ArgumentException"></exception>
        public async Task <Uri> GetRedirectUriForPaymentAsync(
            string stateToken,
            string redirectUri,
            string accountId,
            Payment payment,
            string tanSchemeId)
        {
            if (payment == null)
            {
                throw new ArgumentNullException(nameof(payment));
            }

            if (string.IsNullOrEmpty(redirectUri))
            {
                throw new ArgumentException("Value cannot be null or empty.", nameof(redirectUri));
            }

            if (string.IsNullOrEmpty(accountId))
            {
                throw new ArgumentException("Value cannot be null or empty.", nameof(accountId));
            }

            if (string.IsNullOrEmpty(tanSchemeId))
            {
                throw new ArgumentException("Value cannot be null or empty.", nameof(tanSchemeId));
            }

            var init        = new InitiationApi(this.Configuration, this.Logger);
            var shieldToken = await init
                              .CreatePaymentShieldTokenAsync(new ShieldTokenPISRequest(
                                                                 stateToken,
                                                                 redirectUri,
                                                                 accountId,
                                                                 payment,
                                                                 tanSchemeId)).ConfigureAwait(false);

            return(new Uri(shieldToken.Location));
        }