public async Task <IActionResult> RemoveTrainer(TrainerRemoveInputModel input)
        {
            try
            {
                await this.administrationService.RemoveTrainer(input);
            }
            catch (Exception e)
            {
                this.ModelState.AddModelError("trainer", e.Message);
            }

            if (!this.ModelState.IsValid)
            {
                return(this.View());
            }

            return(this.Redirect("/"));
        }
        public async Task RemoveTrainer(TrainerRemoveInputModel input)
        {
            var trainer = await this.db.Users.FirstOrDefaultAsync(u => u.Email == input.Email);

            if (trainer == null)
            {
                throw new ArgumentException("Няма регистриран човек с този е-мейл.");
            }

            var asTrainer = trainer as Trainer;

            if (asTrainer == null)
            {
                throw new ArgumentException("Този човек не е треньор.");
            }

            var oldRoles  = new List <IdentityUserRole <string> >();
            var userRoles = await this.db.UserRoles.Where(ur => ur.UserId == trainer.Id).ToListAsync();

            var trainerRoleId = (await this.db.Roles.FirstOrDefaultAsync(r => r.Name == GlobalConstants.TrainerRoleName)).Id;

            oldRoles.AddRange(userRoles.Where(ur => ur.RoleId != trainerRoleId).ToList());

            var usersWhosTrainer = this.db.Users.Where(u => u.TrainerId == asTrainer.Id).ToList();

            foreach (var client in usersWhosTrainer)
            {
                client.Trainer   = null;
                client.TrainerId = null;
            }

            this.db.UserRoles.RemoveRange(userRoles);
            await this.db.SaveChangesAsync();

            var user = new ApplicationUser()
            {
                UserName             = trainer.UserName,
                Roles                = trainer.Roles,
                Claims               = trainer.Claims,
                TwoFactorEnabled     = trainer.TwoFactorEnabled,
                PhoneNumber          = trainer.PhoneNumber,
                ConcurrencyStamp     = trainer.ConcurrencyStamp,
                NormalizedEmail      = trainer.NormalizedEmail,
                Email                = trainer.Email,
                NormalizedUserName   = trainer.NormalizedUserName,
                EmailConfirmed       = trainer.EmailConfirmed,
                SecurityStamp        = trainer.SecurityStamp,
                PasswordHash         = trainer.PasswordHash,
                PhoneNumberConfirmed = trainer.PhoneNumberConfirmed,
                Logins               = trainer.Logins,
            };

            this.db.Users.Remove(trainer);

            await this.db.Users.AddAsync(user);

            await this.db.SaveChangesAsync();

            oldRoles.ForEach(r => r.UserId = user.Id);

            await this.db.UserRoles.AddRangeAsync(oldRoles);

            await this.db.SaveChangesAsync();
        }