protected override State DoProcess()
        {
            Output.Inform("Deposit money you would like to play with:");
            Result <decimal> result = Interaction.TryGetDecimal();

            if (!result.IsSuccess)
            {
                Output.Warn(Messages.UnexpectedInputForSpecifyingDecimal);
                return(this);
            }
            else
            {
                CreateAmountResult createDepositResult = Amount.TryCreate(result.Value, out Amount deposit);
                if (!createDepositResult.IsSuccess || deposit == Amount.Zero)
                {
                    Output.Warn($"Deposit should be in ({Amount.Zero}, {Amount.Max}) {Wallet.Currency}.");
                    return(this);
                }
                else
                {
                    Wallet.Deposit(deposit);
                    Logger.LogInformation("Deposited {0} {1}.", Wallet.Balance, Wallet.Currency);
                    Output.Inform($"You deposited {Wallet.Balance} {Wallet.Currency}.");
                    return(States.StakeOrWithdraw);
                }
            }
        }
        protected override State DoProcess()
        {
            Output.Inform($"Current balance is {Wallet.Balance} {Wallet.Currency}.");
            Output.Inform("Stake money for the next spin:");
            Result <decimal> result = Interaction.TryGetDecimal();

            if (!result.IsSuccess)
            {
                Output.Warn(Messages.UnexpectedInputForSpecifyingDecimal);
                return(this);
            }
            else
            {
                CreateAmountResult createStakeResult = Amount.TryCreate(result.Value, out Amount stake);
                if (!createStakeResult.IsSuccess || stake == Amount.Zero)
                {
                    Output.Warn($"Stake should be in ({Amount.Zero}, {Amount.Max}) {Wallet.Currency}.");
                    return(this);
                }
                else
                {
                    StakeResult stakeResult = Wallet.TryStake(stake);
                    if (stakeResult.InvalidStake)
                    {
                        Output.Warn($"Stake of {stake} {Wallet.Currency} is not valid.");
                        return(this);
                    }
                    else if (stakeResult.InsufficientBalance)
                    {
                        Output.Warn("There is no sufficient balance for that stake.");
                        return(this);
                    }
                    else if (stakeResult.MoreThanMaxStake)
                    {
                        Output.Warn($"Cannot stake more than {stakeResult.MaxStake} {Wallet.Currency} due to max balance limitations.");
                        return(this);
                    }
                    else if (stakeResult.IsSuccess)
                    {
                        Logger.LogInformation("Staked {0} {1}.", stake, Wallet.Currency);
                        Output.Inform($"You staked {stake} {Wallet.Currency}.");
                        return(States.Spin);
                    }
                    else
                    {
                        throw new InvalidOperationException("Unexpected stake result.");
                    }
                }
            }
        }