/// <summary>
        /// Saves the default account settings.
        /// </summary>
        /// <param name="settings">The settings.</param>
        public void SaveDefaultAccountSettings(DefaultAccountSettings settings)
        {
            Validate.NotNull(settings, nameof(settings));

            var value   = JsonConvert.SerializeObject(settings);
            var setting = Setting.Create(DefaultAccountSettingsKey, value);

            _settingRepository.Save(setting);
        }
        /// <summary>
        /// Resets a trading account to its starting state.
        /// </summary>
        /// <param name="userId">The unique identifier of the user who owns the trading account.</param>
        /// <param name="accountId">The unique identifier of the account to reset.</param>
        public void ResetAccount(Guid userId, Guid accountId)
        {
            Validate.NotEmpty(userId, nameof(userId));
            Validate.NotEmpty(accountId, nameof(accountId));

            DefaultAccountSettings settings = _settingService.GetDefaultAccountSettings();

            Account account = GetAccount(userId, accountId);

            account.Reset(settings.InitialBalance, "Account reset");
            _accountRepository.Reset(account);
        }
        /// <summary>
        /// Opens the new trading account.
        /// </summary>
        /// <param name="userId">The unique identifier of the user who owns the trading account.</param>
        /// <param name="name">The account name.</param>
        /// <returns>The identifier of the newly created account.</returns>
        public Guid CreateAccount(Guid userId, string name)
        {
            Validate.NotEmpty(userId, nameof(userId));
            Validate.NotNullOrWhitespace(name, nameof(name));

            DefaultAccountSettings settings = _settingService.GetDefaultAccountSettings();

            Account account = Account.CreateNew(userId, name, settings.InitialBalance);

            _accountRepository.Save(account);
            return(account.Id);
        }
        /// <summary>
        /// Gets the default account settings.
        /// </summary>
        /// <returns></returns>
        public DefaultAccountSettings GetDefaultAccountSettings()
        {
            if (_defaultAccountSettings == null)
            {
                var setting = _settingRepository.GetByKey(DefaultAccountSettingsKey);
                if (setting == null)
                {
                    // No settings found - Create the application default settings.
                    _defaultAccountSettings = new DefaultAccountSettings
                    {
                        InitialBalance = 1000000
                    };

                    SaveDefaultAccountSettings(_defaultAccountSettings);
                }
                else
                {
                    _defaultAccountSettings = JsonConvert.DeserializeObject <DefaultAccountSettings>(setting.Value);
                }
            }

            return(_defaultAccountSettings);
        }