public static async Task <EncompassApiClient> CreateFromClientCredentialsAsync(IClientParameters parameters, string instanceId, CancellationToken cancellationToken = default)
        {
            Preconditions.NotNull(parameters, nameof(parameters));
            Preconditions.NotNullOrEmpty(instanceId, nameof(instanceId));

            //TODO HttpClient Private Method setup
            var client = new EncompassApiClient(parameters, new EncompassApiService(new HttpClient(), parameters));

            //removed token initialization
            return(client);
        }
        /// <summary>
        /// Creates a client object from an existing access token.
        /// </summary>
        /// <param name="parameters">The parameters to initialize the client object with.</param>
        /// <param name="accessToken">The access token to use.</param>
        /// <param name="cancellationToken">The token to monitor for cancellation requests. The default value is <see cref="CancellationToken.None"/>.</param>
        /// <returns></returns>
        public static async Task <EncompassApiClient> CreateFromAccessTokenAsync(IClientParameters parameters, string accessToken, CancellationToken cancellationToken = default)
        {
            throw new NotImplementedException();
            Preconditions.NotNull(parameters, nameof(parameters));
            Preconditions.NotNullOrEmpty(accessToken, nameof(accessToken));

            //TODO HttpClient Private Method setup
            var client = new EncompassApiClient(parameters, new EncompassApiService(new HttpClient(), parameters));

            //removed token initialization
            return(client);
        }
        /// <summary>
        /// Creates a client object from user credentials. It does not automatically retrieve a new token when the current one expires so most of the time you'll probably want to use the CreateAsync method instead.
        /// </summary>
        /// <param name="parameters">The parameters to initialize the client object with.</param>
        /// <param name="instanceId">The encompass instance id.</param>
        /// <param name="userId">The encompass user id.</param>
        /// <param name="password">The encompass user password.</param>
        /// <param name="cancellationToken">The token to monitor for cancellation requests. The default value is <see cref="CancellationToken.None"/>.</param>
        /// <returns></returns>
        public static async Task <EncompassApiClient> CreateFromUserCredentialsAsync(IClientParameters parameters, string instanceId, string userId, string password, CancellationToken cancellationToken = default)
        {
            Preconditions.NotNull(parameters, nameof(parameters));
            Preconditions.NotNullOrEmpty(instanceId, nameof(instanceId));
            Preconditions.NotNullOrEmpty(userId, nameof(userId));
            Preconditions.NotNullOrEmpty(password, nameof(password));

            var encompassTokenClientOptions = new EncompassTokenClientOptions
            {
                BaseUrl             = parameters.BaseAddress,
                ClientId            = parameters.ApiClientId,
                ClientSecret        = parameters.ApiClientSecret,
                EncompassInstanceId = instanceId,
                ClientName          = "EncompassTokenClient",
                Password            = password,
                Username            = userId,
                Retry            = true,
                RetryCount       = 3,
                TimeoutInSeconds = 30
            };

            IOptions <EncompassTokenClientOptions> options = Options.Create(encompassTokenClientOptions);

            var retryPolicy   = HttpPolicyExtensions.HandleTransientHttpError().RetryAsync(parameters.TimeoutRetryCount);
            var timeoutPolicy = Policy.TimeoutAsync <HttpResponseMessage>(parameters.Timeout);

            var serviceCollection = new ServiceCollection();

            serviceCollection.AddSingleton(options);

            serviceCollection.AddHttpClient(encompassTokenClientOptions.ClientName)
            .AddPolicyHandler(HttpPolicyExtensions.HandleTransientHttpError().RetryAsync(parameters.TimeoutRetryCount))
            .AddPolicyHandler(Policy.TimeoutAsync <HttpResponseMessage>(parameters.Timeout));

            serviceCollection.AddScoped <ITokenClient>(sp => new EncompassTokenClient(sp.GetService <IHttpClientFactory>().CreateClient("EncompassTokenClient"), options));

            serviceCollection.AddHttpClient("EncompassClient")
            .AddPolicyHandler(HttpPolicyExtensions.HandleTransientHttpError().RetryAsync(parameters.TimeoutRetryCount))
            .AddPolicyHandler(Policy.TimeoutAsync <HttpResponseMessage>(parameters.Timeout))
            .AddHttpMessageHandler(sp => new TokenHandler(sp.GetService <ITokenClient>()));

            var serviceProvider = serviceCollection.BuildServiceProvider();

            var httpClientFactory = serviceProvider.GetService <IHttpClientFactory>();
            var client            = new EncompassApiClient(parameters, new EncompassApiService(httpClientFactory.CreateClient("EncompassHttpClient"), parameters));

            return(client);
        }