private static void SeedData(ExicoShopifyDbContext exicoDbContext, ExicoIdentityDbContext identityContext, ILogger logger, IConfiguration config, IServiceScope scope)
        {
            SeedSettingsData(exicoDbContext, config, logger);

            SeedPlanData(exicoDbContext, logger, config);

            SeedAdminRoleAndUser(identityContext, exicoDbContext, logger, config, scope);
        }
        private static void SeedAdminRoleAndUser(ExicoIdentityDbContext identityContext, ExicoShopifyDbContext exicoDbContext, ILogger logger, IConfiguration config, IServiceScope scope)
        {
            //TODO check and make it a little bit robus
            var            roleStore = new RoleStore <IdentityRole>(identityContext);
            IdentityResult result    = null;

            logger.LogInformation("creating admin role.");
            if (!identityContext.Roles.Any(r => r.Name == UserInContextHelper.ADMIN_ROLE))
            {
                result = roleStore.CreateAsync(new IdentityRole()
                {
                    Name           = UserInContextHelper.ADMIN_ROLE,
                    NormalizedName = UserInContextHelper.ADMIN_ROLE
                }).Result;
                if (result.Succeeded == false)
                {
                    logger.LogError($"Could not create admin role.{string.Join('.', result.Errors)}");
                }
                else
                {
                    logger.LogInformation("Successfully created admin role");
                }
            }
            else
            {
                logger.LogInformation("Admin role already exists.So skipping role creation.");
                result = IdentityResult.Success;
            }
            if (result.Succeeded)
            {
                UserManager <AspNetUser> _userManager = scope.ServiceProvider.GetService <UserManager <AspNetUser> >();
                //read config values for admin user
                var user = new AspNetUser();
                config.Bind("AdminSeed", user);

                if (!identityContext.Users.Any(u => u.UserName == user.UserName))
                {
                    logger.LogInformation("Creating user.");
                    //prepare user
                    user.PlanId             = user.PlanId ?? exicoDbContext.Plans.First().Id;
                    user.BillingOn          = user.BillingOn ?? DateTime.Today;
                    user.ShopifyAccessToken = user.ShopifyAccessToken ?? "an-invalid-token";
                    user.ShopifyChargeId    = user.ShopifyChargeId ?? 123456;

                    var passGenrerator = scope.ServiceProvider.GetService <IGenerateUserPassword>();
                    var pass           = passGenrerator.GetPassword(new Data.Domain.AppModels.PasswordGeneratorInfo(user));
                    result = _userManager.CreateAsync(user, pass).Result;
                    if (result.Succeeded)
                    {
                        logger.LogInformation($"Finished creating user '{user.UserName}'");
                    }
                    else
                    {
                        logger.LogError($"Error creating user.{string.Join('.', result.Errors)}");
                    }
                }
                else
                {
                    result = IdentityResult.Success;
                    logger.LogInformation($"Skipping user creation. User '{user.UserName}' already exists.");
                }
                if (result.Succeeded)
                {
                    logger.LogInformation($"Assigning admin role to user '{user.UserName}'");
                    user = _userManager.FindByEmailAsync(user.Email).Result;
                    var userIsInRole = _userManager.IsInRoleAsync(user, UserInContextHelper.ADMIN_ROLE).Result;
                    if (!userIsInRole)
                    {
                        result = _userManager.AddToRolesAsync(user, new string[] { UserInContextHelper.ADMIN_ROLE }).Result;
                        if (result.Succeeded)
                        {
                            logger.LogInformation($"Finished assigning admin role to user '{user.UserName}'");
                        }
                        else
                        {
                            logger.LogError($"Error assigning user to admin role.{string.Join('.', result.Errors)}");
                        }
                    }
                    else
                    {
                        logger.LogWarning($"Skipping assigning user to admin role because user '{user.UserName}' already is an admin.");
                    }
                }
                else
                {
                    logger.LogWarning($"Skipping assigning user to admin role because user reation failed.");
                }
            }
            logger.LogInformation("Finished seeding admin role and user");
        }