/// <inheritdoc />
        public ReserveProfileResult ReserveProfile(ProfileReserveRequest reserveRequest)
        {
            var result = new ReserveProfileResult();
            var t2Node = this.xServerPeerList.GetPeers().Where(n => n.Tier == (int)TierLevel.Two).OrderBy(n => n.ResponseTime).FirstOrDefault();

            if (t2Node != null)
            {
                string xServerURL = Utils.GetServerUrl(t2Node.NetworkProtocol, t2Node.NetworkAddress, t2Node.NetworkPort);
                var    client     = new RestClient(xServerURL);
                client.UseNewtonsoftJson();
                var reserveProfileRequest = new RestRequest("/reserveprofile", Method.POST);
                var request = JsonConvert.SerializeObject(reserveRequest);
                reserveProfileRequest.AddParameter("application/json; charset=utf-8", request, ParameterType.RequestBody);
                reserveProfileRequest.RequestFormat = DataFormat.Json;

                var reserveProfileResult = client.Execute <ReserveProfileResult>(reserveProfileRequest);
                if (reserveProfileResult.StatusCode == HttpStatusCode.OK)
                {
                    if (reserveProfileResult.Data == null)
                    {
                        result.Success = false;
                    }
                    else
                    {
                        result         = reserveProfileResult.Data;
                        result.Success = true;
                    }
                }
                else
                {
                    var errorResponse = JsonConvert.DeserializeObject <ErrorResponse>(reserveProfileResult.Content);
                    if (errorResponse != null)
                    {
                        result.ResultMessage = errorResponse.errors[0].message;
                    }
                    else
                    {
                        result.ResultMessage = "Failed to access xServer";
                    }
                    result.Success = false;
                }
            }
            else
            {
                result.ResultMessage = "Not connected to any tier 2 servers";
            }
            return(result);
        }
        /// <summary>
        ///     Register a new profile.
        /// </summary>
        public async Task <ReserveProfileResult> ReserveProfile(ProfileReserveRequest profileRegisterRequest)
        {
            ReserveProfileResult result = new ReserveProfileResult();

            if (!networkFeatures.ProfileExists(profileRegisterRequest.Name, profileRegisterRequest.KeyAddress))
            {
                bool isProfileKeyValid = await networkFeatures.IsProfileKeyValid(profileRegisterRequest.Name, profileRegisterRequest.KeyAddress, profileRegisterRequest.ReturnAddress, profileRegisterRequest.Signature);

                if (!isProfileKeyValid)
                {
                    result.Success       = false;
                    result.ResultMessage = "Profile validation failed.";
                    return(result);
                }

                // Price Lock ID does not exist, this is a new request, so let's create a price lock ID for it, and reserve the name.
                var profilePriceLockRequest = new CreatePriceLockRequest()
                {
                    DestinationAddress = networkFeatures.GetMyFeeAddress(),
                    RequestAmount      = 5, // $5
                    RequestAmountPair  = 1, // USD
                    ExpireBlock        = 15
                };
                var newPriceLock = await networkFeatures.CreateNewPriceLock(profilePriceLockRequest);

                if (newPriceLock == null || string.IsNullOrEmpty(newPriceLock?.PriceLockId) || newPriceLock?.ExpireBlock <= 0)
                {
                    result.Success       = false;
                    result.ResultMessage = "Failed to acquire a price lock";
                    return(result);
                }
                int status     = (int)Status.Reserved;
                var newProfile = new ProfileReservationData()
                {
                    Name          = profileRegisterRequest.Name,
                    KeyAddress    = profileRegisterRequest.KeyAddress,
                    ReturnAddress = profileRegisterRequest.ReturnAddress,
                    PriceLockId   = newPriceLock.PriceLockId,
                    Signature     = profileRegisterRequest.Signature,
                    Status        = status,
                    ReservationExpirationBlock = newPriceLock.ExpireBlock,
                    Relayed = false
                };
                using (X42DbContext dbContext = new X42DbContext(databaseSettings.ConnectionString))
                {
                    var newRecord = dbContext.ProfileReservations.Add(newProfile);
                    if (newRecord.State == EntityState.Added)
                    {
                        dbContext.SaveChanges();
                        result.PriceLockId = newPriceLock.PriceLockId;
                        result.Status      = status;
                        result.Success     = true;
                    }
                    else
                    {
                        result.Status        = (int)Status.Rejected;
                        result.ResultMessage = "Failed to add profile.";
                        result.Success       = false;
                    }
                }
            }
            else
            {
                result.Status        = (int)Status.Rejected;
                result.Success       = false;
                result.ResultMessage = "Profile already exists.";
            }

            return(result);
        }