/// <summary>
        /// Trata respostas Rest do Api
        /// </summary>
        /// <param name="result">Retorno tratado (faced)</param>
        /// <param name="response">Retorno da Api</param>
        private static void TrataResposta(BoletoCloudResponse result, IRestResponse response)
        {
            if (response.StatusCode == HttpStatusCode.Created || response.StatusCode == HttpStatusCode.OK)
            {
                // Sucesso na geração (HttpStatusCode.Created) ou consulta (HttpStatusCode.OK)
                if (response.Headers.Any(t => t.Name == "X-BoletoCloud-Version"))
                {
                    result.VersaoApiBoletoCloud = response.Headers.FirstOrDefault(t => t.Name == "X-BoletoCloud-Version").Value.ToString();
                }

                if (response.Headers.Any(t => t.Name == "X-BoletoCloud-Token"))
                {
                    result.Token = response.Headers.FirstOrDefault(t => t.Name == "X-BoletoCloud-Token").Value.ToString();
                }

                if (response.Headers.Any(t => t.Name == "X-BoletoCloud-NIB-Nosso-Numero"))
                {
                    result.NossoNumero = response.Headers.FirstOrDefault(t => t.Name == "X-BoletoCloud-NIB-Nosso-Numero").Value.ToString();
                }

                if (response.Headers.Any(t => t.Name == "Content-Type"))
                {
                    result.ContentType = response.Headers.FirstOrDefault(t => t.Name == "Content-Type").Value.ToString();
                }

                if (response.Headers.Any(t => t.Name == "Location"))
                {
                    result.Location = response.Headers.FirstOrDefault(t => t.Name == "Location").Value.ToString();
                }

                result.Sucesso = true;

                result.Mensagem = response.StatusCode == HttpStatusCode.Created ?
                                  $"Boleto n. {result.NossoNumero} gerado com sucesso" :
                                  "Consulta realizada com sucesso";

                result.Boleto = response.RawBytes;
            }
            else
            {
                // Falha
                ResponseError error = Newtonsoft.Json.JsonConvert.DeserializeObject <ResponseError>(response.Content);

                result.Sucesso       = false;
                result.Erro.TipoErro = error.erro.tipo;
                result.Erro.Codigo   = error.erro.status;

                for (int i = 0; i < error.erro.causas.Count; i++)
                {
                    result.Erro.Mensagens.Add($"{error.erro.causas[i].codigo} - {error.erro.causas[i].mensagem}");
                }
            }
        }
        /// <summary>
        /// Consome Api do Boleto Cloud para geração de boleto
        /// </summary>
        /// <returns></returns>
        public BoletoCloudResponse GeraBoleto()
        {
            if (BoletoInfo == null)
            {
                throw new ArgumentNullException("BoletoInfo");
            }

            if (string.IsNullOrEmpty(this.Config.Url))
            {
                throw new ArgumentNullException("Url da Api não configurada");
            }

            if (string.IsNullOrEmpty(this.Config.Token))
            {
                throw new ArgumentNullException("Token da Api não configurado");
            }

            if (BoletoInfo.Instrucoes.Count > 8)
            {
                throw new IndexOutOfRangeException("Permitido somente 8 linhas de Instruções");
            }

            var result = new BoletoCloudResponse();
            var client = new RestClient(this.Config.Url);

            var request = new RestRequest(Method.POST);

            request.AddHeader("Postman-Token", "74f4691e-79f3-4934-8167-c464d9a26e53");
            request.AddHeader("cache-control", "no-cache");
            request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
            request.AddHeader("Authorization", $"Basic {this.Config.AuthorizationHash}");
            request.AddParameter("undefined", FillParameters(), ParameterType.RequestBody);

            IRestResponse response = client.Execute(request);

            if (response.ResponseStatus == ResponseStatus.Error && response.ErrorException != null)
            {
                throw response.ErrorException;
            }

            TrataResposta(result, response);

            return(result);
        }
        /// <summary>
        /// Consome Api do Boleto Cloud para consulta de boletos gerados
        /// </summary>
        /// <param name="token">Token retornado na geração do boleto</param>
        /// <returns></returns>
        public BoletoCloudResponse ConsultaBoleto(string token)
        {
            if (string.IsNullOrEmpty(token))
            {
                throw new ArgumentNullException("Token para consulta não informado");
            }

            if (string.IsNullOrEmpty(this.Config.Url))
            {
                throw new ArgumentNullException("Url da Api não configurada");
            }

            if (string.IsNullOrEmpty(this.Config.Token))
            {
                throw new ArgumentNullException("Token da Api não configurado");
            }

            var result = new BoletoCloudResponse();
            var client = new RestClient($"{this.Config.Url}/{token}");

            var request = new RestRequest(Method.GET);

            request.AddHeader("Postman-Token", "41a04afb-9aeb-4755-8ffd-c97380c04dfd");
            request.AddHeader("cache-control", "no-cache");
            request.AddHeader("Authorization", $"Basic {this.Config.AuthorizationHash}");
            IRestResponse response = client.Execute(request);

            if (response.ResponseStatus == ResponseStatus.Error && response.ErrorException != null)
            {
                throw response.ErrorException;
            }

            TrataResposta(result, response);

            return(result);
        }