public RegisterValidator(IPlayerRepository repository, BrandQueries brandQueries)
        {
            CascadeMode = CascadeMode.StopOnFirstFailure;

            RuleFor(p => p.FirstName)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(PlayerInfoValidatorResponseCodes.FirstNameRequired.ToString());

            RuleFor(p => p.LastName)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(PlayerInfoValidatorResponseCodes.LastNameRequired.ToString());

            RuleFor(p => p.Email)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(PlayerInfoValidatorResponseCodes.EmailIsRequired.ToString());

            RuleFor(p => p.PhoneNumber)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(PlayerInfoValidatorResponseCodes.PhoneNumberIsRequired.ToString());

            RuleFor(p => p.MailingAddressLine1)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(PlayerInfoValidatorResponseCodes.MailingAddressLine1IsRequired.ToString());

            RuleFor(p => p.MailingAddressCity)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(PlayerInfoValidatorResponseCodes.MailingAddressCityIsRequired.ToString());

            RuleFor(p => p.MailingAddressPostalCode)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(PlayerInfoValidatorResponseCodes.MailingAddressPostalCodeIsRequired.ToString());

            RuleFor(p => p.PhysicalAddressLine1)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(RegisterValidatorResponseCodes.PhysicalAddressLine1Required.ToString());

            RuleFor(p => p.PhysicalAddressCity)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(RegisterValidatorResponseCodes.PhysicalAddressCityRequired.ToString());

            RuleFor(p => p.PhysicalAddressPostalCode)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(RegisterValidatorResponseCodes.PhysicalAddressPostalCodeRequired.ToString());

            RuleFor(p => p.CountryCode)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(PlayerInfoValidatorResponseCodes.CountryCodeIsRequired.ToString());

            RuleFor(p => p.CurrencyCode)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(RegisterValidatorResponseCodes.CurrencyCodeRequired.ToString());

            RuleFor(p => p.CultureCode)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(RegisterValidatorResponseCodes.CultureCodeRequired.ToString());

            RuleFor(p => p.Username)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(RegisterValidatorResponseCodes.UsernameRequired.ToString());

            RuleFor(p => p.Password)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(RegisterValidatorResponseCodes.PasswordRequired.ToString());

            RuleFor(p => p.PasswordConfirm)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(RegisterValidatorResponseCodes.PasswordConfirmRequired.ToString());

            RuleFor(p => p.DateOfBirth)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(PlayerInfoValidatorResponseCodes.DateOfBirthIsMissingOrIncorrect.ToString());

            RuleFor(p => p.BrandId)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(RegisterValidatorResponseCodes.BrandIdRequired.ToString());

            RuleFor(p => p.Gender)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(PlayerInfoValidatorResponseCodes.GenderIsRequired.ToString());

            RuleFor(p => p.Title)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(PlayerInfoValidatorResponseCodes.TitleIsRequired.ToString());

            RuleFor(p => p.ContactPreference)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(RegisterValidatorResponseCodes.ContactPreferenceRequired.ToString());

            RuleFor(p => p.IdStatus)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(RegisterValidatorResponseCodes.IdStatusRequired.ToString());

            RuleFor(p => p.SecurityQuestionId)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(RegisterValidatorResponseCodes.SecurityQuestionIdRequired.ToString())
            .Must(v => repository.SecurityQuestions.Any(x => x.Id == new Guid(v)))
            .WithMessage(RegisterValidatorResponseCodes.InvalidSecurityQuestionId.ToString());

            RuleFor(p => p.SecurityAnswer)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(RegisterValidatorResponseCodes.SecurityAnswerIsMissing.ToString());

            RuleFor(p => p.MailingAddressStateProvince)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(RegisterValidatorResponseCodes.AddressStateProvinceIsMissing.ToString());

            When(p => !string.IsNullOrWhiteSpace(p.FirstName), () =>
            {
                var firstNameMinLength = CommonPlayerSettings.FirstNameMinLength;
                var firstNameMaxLength = CommonPlayerSettings.FirstNameMaxLength;

                RuleFor(p => p.FirstName)
                .Length(firstNameMinLength, firstNameMaxLength)
                .WithMessage(PlayerInfoValidatorResponseCodes.FirstNameLengthIsNotInTheAllowedRange.ToString());

                RuleFor(p => p.FirstName)
                .Matches(CommonPlayerSettings.FirstNamePattern)
                .WithMessage(PlayerInfoValidatorResponseCodes.FirstNameFormatIsWrong.ToString());
            });

            When(p => !string.IsNullOrWhiteSpace(p.LastName), () =>
            {
                var lastNameMinLength = CommonPlayerSettings.LastNameMinLength;
                var lastNameMaxLength = CommonPlayerSettings.LastNameMaxLength;

                RuleFor(p => p.LastName)
                .Length(lastNameMinLength, lastNameMaxLength)
                .WithMessage(PlayerInfoValidatorResponseCodes.LastNameLengthIsNotInTheAllowedRange.ToString());

                RuleFor(p => p.LastName)
                .Matches(CommonPlayerSettings.LastNamePattern)
                .WithMessage(PlayerInfoValidatorResponseCodes.LastNameFormatIsWrong.ToString());
            });

            When(p => !string.IsNullOrWhiteSpace(p.Email), () =>
            {
                const int emailMaxLength = 50;

                RuleFor(p => p.Email)
                .Length(0, emailMaxLength)
                .WithMessage(PlayerInfoValidatorResponseCodes.EmailLengthIsNotInAllowedRange.ToString());

                RuleFor(p => p.Email)
                .Matches(CommonPlayerSettings.EmailPattern)
                .WithMessage(PlayerInfoValidatorResponseCodes.EmailFormatIsWrong.ToString());

                RuleFor(p => p.Email)
                .Must(
                    (r, e) =>
                    !repository.Players.AsNoTracking()
                    .Any(p => p.Email == e && p.BrandId == new Guid(r.BrandId)))
                .WithMessage(PlayerInfoValidatorResponseCodes.EmailAlreadyExists.ToString());
            });

            When(p => !string.IsNullOrWhiteSpace(p.PhoneNumber), () =>
            {
                const int phoneMinLength = 8, phoneMaxLength = 15;

                RuleFor(p => p.PhoneNumber)
                .Length(phoneMinLength, phoneMaxLength)
                .WithMessage(PlayerInfoValidatorResponseCodes.PhoneNumberLengthIsWrong.ToString());

                RuleFor(p => p.PhoneNumber)
                .Matches(CommonPlayerSettings.PhonePattern)
                .WithMessage(PlayerInfoValidatorResponseCodes.PhoneNumberFormatIsWrong.ToString());
            });

            When(p => !string.IsNullOrWhiteSpace(p.MailingAddressLine1), () =>
            {
                const int addressMinLength = 1, addressMaxLength = 50;

                RuleFor(p => p.MailingAddressLine1)
                .Length(addressMinLength, addressMaxLength)
                .WithMessage(PlayerInfoValidatorResponseCodes.MailingAddressLine1LengthIsIncorrect.ToString());
            });

            When(p => !string.IsNullOrWhiteSpace(p.MailingAddressPostalCode), () =>
            {
                const int zipCodesMinLength = 1, zipCodeMaxLength = 10;

                RuleFor(p => p.MailingAddressPostalCode)
                .Length(zipCodesMinLength, zipCodeMaxLength)
                .WithMessage(PlayerInfoValidatorResponseCodes.MailingAddressPostalCodeLengthIsIncorrect.ToString());
            });

            When(p => brandQueries.DoesBrandExist(new Guid(p.BrandId)) && !string.IsNullOrWhiteSpace(p.CountryCode),
                 () => RuleFor(p => p.CountryCode)
                 .Must((r, c) => brandQueries.BrandHasCountry(new Guid(r.BrandId), c))
                 .WithMessage(PlayerInfoValidatorResponseCodes.InvalidCountryCode.ToString()));

            When(p => brandQueries.DoesBrandExist(new Guid(p.BrandId)) && !string.IsNullOrWhiteSpace(p.CurrencyCode),
                 () => RuleFor(p => p.CurrencyCode)
                 .Must((r, c) => brandQueries.BrandHasCurrency(new Guid(r.BrandId), c))
                 .WithMessage(PlayerInfoValidatorResponseCodes.InvalidCurrencyCode.ToString()));

            When(p => brandQueries.DoesBrandExist(new Guid(p.BrandId)) && !string.IsNullOrWhiteSpace(p.CultureCode),
                 () => RuleFor(p => p.CultureCode)
                 .Must((r, c) => brandQueries.BrandHasCulture(new Guid(r.BrandId), c))
                 .WithMessage(RegisterValidatorResponseCodes.InvalidCultureCode.ToString()));

            When(p => !string.IsNullOrWhiteSpace(p.Username), () =>
            {
                const int usernameMinLength = 6;
                const int usernameMaxLength = 12;

                RuleFor(p => p.Username)
                .Length(usernameMinLength, usernameMaxLength)
                .WithMessage(RegisterValidatorResponseCodes.UsernameLengthIsNotInAllowedRange.ToString());

                RuleFor(p => p.Username)
                .Matches(CommonPlayerSettings.UsernamePatter)
                .WithMessage(RegisterValidatorResponseCodes.UsernameFormatIsWrong.ToString());

                RuleFor(p => p.Username)
                .Must(
                    (r, u) =>
                    !repository.Players.AsNoTracking()
                    .Any(p => p.Username == u && p.BrandId == new Guid(r.BrandId)))
                .WithMessage(RegisterValidatorResponseCodes.UsernameAlreadyExists.ToString());
            });

            When(p => !string.IsNullOrWhiteSpace(p.Password), () =>
            {
                int passwordMinLength = CommonPlayerSettings.PasswordMinLength;
                int passwordMaxLength = CommonPlayerSettings.PasswordMaxLength;

                RuleFor(p => p.Password)
                .Length(passwordMinLength, passwordMaxLength)
                .WithMessage(RegisterValidatorResponseCodes.PasswordLengthIsNotInItsAllowedRange.ToString());
            });

            When(p => !string.IsNullOrWhiteSpace(p.Password) && !string.IsNullOrWhiteSpace(p.PasswordConfirm), () =>
                 RuleFor(p => p.PasswordConfirm)
                 .Must((r, p) => r.Password == p)
                 .WithMessage(RegisterValidatorResponseCodes.ConfirmationPasswordDoesntMatch.ToString())
                 );

            When(p => !string.IsNullOrWhiteSpace(p.DateOfBirth), () =>
            {
                RuleFor(p => p.DateOfBirth)
                .Must(p => ValidatorUtils.ToDateTime(p, "yyyy/MM/dd") != null)
                .WithMessage(PlayerInfoValidatorResponseCodes.DateOfBirthIsMissingOrIncorrect.ToString());

                RuleFor(p => p.DateOfBirth)
                .Must(p =>
                {
                    DateTime?dateTime = ValidatorUtils.ToDateTime(p, "yyyy/MM/dd");
                    if (dateTime == null)
                    {
                        return(true);
                    }
                    return(dateTime >= DateTime.UtcNow.AddYears(-100));
                })
                .WithMessage(PlayerInfoValidatorResponseCodes.DateOfBirthIsMissingOrIncorrect.ToString());

                RuleFor(p => p.DateOfBirth)
                .Must(p =>
                {
                    DateTime?dateTime = ValidatorUtils.ToDateTime(p, "yyyy/MM/dd");
                    if (dateTime == null)
                    {
                        return(true);
                    }
                    return(dateTime <= DateTime.UtcNow.AddYears(-18));
                })
                .WithMessage(PlayerInfoValidatorResponseCodes.AgeIsUnderAllowed.ToString());
            });

            When(p => !string.IsNullOrWhiteSpace(p.BrandId), () => RuleFor(p => p.BrandId)
                 .Must(brand => brandQueries.DoesBrandExist(new Guid(brand)))
                 .WithMessage(RegisterValidatorResponseCodes.BrandIsUnknown.ToString()));

            When(p => !string.IsNullOrEmpty(p.Gender), () => RuleFor(p => p.Gender)
                 .Must(g => Enum.IsDefined(typeof(Gender), g))
                 .WithMessage(PlayerInfoValidatorResponseCodes.GenderIsRequired.ToString()));

            When(p => !string.IsNullOrEmpty(p.Title), () => RuleFor(p => p.Title)
                 .Must(g => Enum.IsDefined(typeof(Title), g))
                 .WithMessage(PlayerInfoValidatorResponseCodes.TitleIsRequired.ToString()));

            When(p => !string.IsNullOrEmpty(p.ContactPreference), () => RuleFor(p => p.ContactPreference)
                 .Must(cp => Enum.IsDefined(typeof(ContactMethod), cp))
                 .WithMessage(RegisterValidatorResponseCodes.InvalidContractPreference.ToString()));
        }
        public EditPlayerValidator(IPlayerRepository repository, BrandQueries brandQueries)
        {
            CascadeMode = CascadeMode.StopOnFirstFailure;

            RuleFor(p => p.PlayerId)
            .Must((r, u) => repository.Players.Any(p => p.Id == u))
            .WithMessage(EditPlayerValidatorResponseCodes.InvalidPlayerId.ToString());

            RuleFor(p => p.Title)
            .Must(v => v.HasValue)
            .WithMessage(PlayerInfoValidatorResponseCodes.TitleIsRequired.ToString());

            RuleFor(p => p.FirstName)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(PlayerInfoValidatorResponseCodes.FirstNameRequired.ToString());

            RuleFor(p => p.LastName)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(PlayerInfoValidatorResponseCodes.LastNameRequired.ToString());

            RuleFor(p => p.Email)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(PlayerInfoValidatorResponseCodes.EmailIsRequired.ToString());

            RuleFor(p => p.Gender)
            .Must(v => v.HasValue)
            .WithMessage(PlayerInfoValidatorResponseCodes.GenderIsRequired.ToString());

            RuleFor(p => p.MailingAddressLine1)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(PlayerInfoValidatorResponseCodes.MailingAddressLine1IsRequired.ToString());

            RuleFor(p => p.MailingAddressCity)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(PlayerInfoValidatorResponseCodes.MailingAddressCityIsRequired.ToString());

            RuleFor(p => p.MailingAddressPostalCode)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(PlayerInfoValidatorResponseCodes.MailingAddressPostalCodeIsRequired.ToString());

            RuleFor(p => p.MailingAddressStateProvince)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(PlayerInfoValidatorResponseCodes.MailingAddressStateProvince.ToString());

            RuleFor(p => p.CountryCode)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(PlayerInfoValidatorResponseCodes.CountryCodeIsRequired.ToString());

            RuleFor(p => p.PhoneNumber)
            .Must(v => !string.IsNullOrWhiteSpace(v))
            .WithMessage(PlayerInfoValidatorResponseCodes.PhoneNumberIsRequired.ToString());

            When(p => !p.AccountAlertEmail, () =>
            {
                RuleFor(p => p.AccountAlertSms)
                .Must(v => v)
                .WithMessage(PlayerInfoValidatorResponseCodes.AccountAlertIsRequired.ToString());
            });

            When(p => !p.AccountAlertSms, () =>
            {
                RuleFor(p => p.AccountAlertEmail)
                .Must(v => v)
                .WithMessage(PlayerInfoValidatorResponseCodes.AccountAlertIsRequired.ToString());
            });

            When(p => !p.MarketingAlertEmail && !p.MarketingAlertPhone, () =>
            {
                RuleFor(p => p.MarketingAlertSms)
                .Must(v => v)
                .WithMessage(PlayerInfoValidatorResponseCodes.MarketingAlertIsRequired.ToString());
            });

            When(p => !p.MarketingAlertSms && !p.MarketingAlertPhone, () =>
            {
                RuleFor(p => p.MarketingAlertEmail)
                .Must(v => v)
                .WithMessage(PlayerInfoValidatorResponseCodes.MarketingAlertIsRequired.ToString());
            });

            When(p => !p.MarketingAlertSms && !p.MarketingAlertEmail, () =>
            {
                RuleFor(p => p.MarketingAlertPhone)
                .Must(v => v)
                .WithMessage(PlayerInfoValidatorResponseCodes.MarketingAlertIsRequired.ToString());
            });

            When(p => !string.IsNullOrWhiteSpace(p.FirstName), () =>
            {
                int firstNameMinLength = CommonPlayerSettings.FirstNameMinLength;
                int firstNameMaxLength = CommonPlayerSettings.FirstNameMaxLength;

                RuleFor(p => p.FirstName)
                .Length(firstNameMinLength, firstNameMaxLength)
                .WithMessage(PlayerInfoValidatorResponseCodes.FirstNameLengthIsNotInTheAllowedRange.ToString());

                RuleFor(p => p.FirstName)
                .Matches(CommonPlayerSettings.FirstNamePattern)
                .WithMessage(PlayerInfoValidatorResponseCodes.FirstNameFormatIsWrong.ToString());
            });

            When(p => !string.IsNullOrWhiteSpace(p.LastName), () =>
            {
                int lastNameMinLength = CommonPlayerSettings.LastNameMinLength;
                int lastNameMaxLength = CommonPlayerSettings.LastNameMaxLength;

                RuleFor(p => p.LastName)
                .Length(lastNameMinLength, lastNameMaxLength)
                .WithMessage(PlayerInfoValidatorResponseCodes.LastNameLengthIsNotInTheAllowedRange.ToString());

                RuleFor(p => p.LastName)
                .Matches(CommonPlayerSettings.LastNamePattern)
                .WithMessage(PlayerInfoValidatorResponseCodes.LastNameFormatIsWrong.ToString());
            });

            When(p => !string.IsNullOrWhiteSpace(p.DateOfBirth), () =>
            {
                RuleFor(p => p.DateOfBirth)
                .Must(p => ValidatorUtils.ToDateTime(p, "yyyy/MM/dd") != null)
                .WithMessage(PlayerInfoValidatorResponseCodes.DateOfBirthIsMissingOrIncorrect.ToString());

                RuleFor(p => p.DateOfBirth)
                .Must(p =>
                {
                    DateTime?dateTime = ValidatorUtils.ToDateTime(p, "yyyy/MM/dd");
                    if (dateTime == null)
                    {
                        return(true);
                    }
                    return(dateTime <= DateTime.UtcNow.AddYears(-18));
                })
                .WithMessage(PlayerInfoValidatorResponseCodes.AgeIsUnderAllowed.ToString());
            });

            When(p => !string.IsNullOrWhiteSpace(p.Email), () =>
            {
                const int emailMaxLength = 50;

                RuleFor(p => p.Email)
                .Length(0, emailMaxLength)
                .WithMessage(PlayerInfoValidatorResponseCodes.EmailLengthIsNotInAllowedRange.ToString());

                RuleFor(p => p.Email)
                .EmailAddress()
                .WithMessage(PlayerInfoValidatorResponseCodes.EmailFormatIsWrong.ToString());

                RuleFor(p => p.Email)
                .Must((r, e) => !repository.Players.AsNoTracking().Any(p => p.Email == e &&
                                                                       p.BrandId == repository.Players.FirstOrDefault(player => player.Id == r.PlayerId).BrandId &&
                                                                       p.Id != r.PlayerId))
                .WithMessage(PlayerInfoValidatorResponseCodes.EmailAlreadyExists.ToString());
            });

            When(p => !string.IsNullOrWhiteSpace(p.PhoneNumber), () =>
            {
                const int phoneMinLength = 8;
                const int phoneMaxLength = 15;

                RuleFor(p => p.PhoneNumber)
                .Length(phoneMinLength, phoneMaxLength)
                .WithMessage(PlayerInfoValidatorResponseCodes.PhoneNumberLengthIsWrong.ToString());

                RuleFor(p => p.PhoneNumber)
                .Matches(@"^((\\+)|(00)|(\\*)|())[0-9]{3,14}((\\#)|())$")
                .WithMessage(PlayerInfoValidatorResponseCodes.PhoneNumberFormatIsWrong.ToString());
            });

            When(p => !string.IsNullOrWhiteSpace(p.MailingAddressLine1), () =>
            {
                const int addressMinLength = 1;
                const int addressMaxLength = 50;

                RuleFor(p => p.MailingAddressLine1)
                .Length(addressMinLength, addressMaxLength)
                .WithMessage(PlayerInfoValidatorResponseCodes.MailingAddressLine1LengthIsIncorrect.ToString());
            });

            When(p => !string.IsNullOrWhiteSpace(p.MailingAddressPostalCode), () =>
            {
                const int zipCodesMinLength = 1;
                const int zipCodeMaxLength  = 10;

                RuleFor(p => p.MailingAddressPostalCode)
                .Length(zipCodesMinLength, zipCodeMaxLength)
                .WithMessage(PlayerInfoValidatorResponseCodes.MailingAddressPostalCodeLengthIsIncorrect.ToString());
            });

            When(p => !string.IsNullOrWhiteSpace(p.CountryCode) && brandQueries.DoesBrandExist(repository.Players.FirstOrDefault(player => player.Id == p.PlayerId).BrandId), () =>
                 RuleFor(p => p.CountryCode)
                 .Must((r, c) => brandQueries.BrandHasCountry(repository.Players.FirstOrDefault(player => player.Id == r.PlayerId).BrandId, c))
                 .WithMessage(PlayerInfoValidatorResponseCodes.InvalidCountryCode.ToString()));

            When(p => !string.IsNullOrWhiteSpace(p.CurrencyCode) && brandQueries.DoesBrandExist(repository.Players.FirstOrDefault(player => player.Id == p.PlayerId).BrandId), () =>
                 RuleFor(p => p.CurrencyCode)
                 .Must((r, c) => brandQueries.BrandHasCurrency(repository.Players.FirstOrDefault(player => player.Id == r.PlayerId).BrandId, c))
                 .WithMessage(PlayerInfoValidatorResponseCodes.InvalidCurrencyCode.ToString()));
        }