// GET: Admin/Usuario/Edit/5
        public ActionResult Edit(string id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            AuthRepository  gestorUsuarios  = new AuthRepository();
            ApplicationUser applicationUser = gestorUsuarios.FindById(id);

            if (applicationUser == null)
            {
                return(HttpNotFound());
            }

            UsuarioEditViewModel viewModel = new UsuarioEditViewModel();

            viewModel.Usuario = applicationUser;
            viewModel.InicializarDesplegables();
            return(View(viewModel));
        }
        public ActionResult Edit(UsuarioEditViewModel viewModel)
        {
            if (ModelState.IsValid)
            {
                AuthRepository gestorUsuarios = new AuthRepository();

                ApplicationUser applicationUser = gestorUsuarios.FindById(viewModel.Usuario.Id);
                applicationUser.Nombre           = viewModel.Usuario.Nombre;
                applicationUser.Apellido1        = viewModel.Usuario.Apellido1;
                applicationUser.Apellido2        = viewModel.Usuario.Apellido2;
                applicationUser.Email            = viewModel.Usuario.Email;
                applicationUser.UserName         = viewModel.Usuario.Email;
                applicationUser.GrupoUsuarioId   = viewModel.Usuario.GrupoUsuarioId;
                applicationUser.PuntosActual     = viewModel.Usuario.PuntosActual;
                applicationUser.PuntosTotal      = viewModel.Usuario.PuntosTotal;
                applicationUser.BloquearSubtemas = viewModel.Usuario.BloquearSubtemas;
                applicationUser.ClienteId        = viewModel.Usuario.ClienteId;

                var Accesos = db.SubTemaAccesoUsuarios.Where(sau => sau.AlumnoId == applicationUser.Id).ToList();
                db.SubTemaAccesoUsuarios.RemoveRange(Accesos);
                db.SaveChanges();
                List <int> listaSubtemasAccesso = new List <int>();
                if (viewModel.Usuario.BloquearSubtemas)
                {
                    foreach (var acceso in viewModel.AccesoTemas)
                    {
                        foreach (var accesoSubtema in acceso.SubTemas)
                        {
                            if (accesoSubtema.Selected)
                            {
                                SubTemaAccesoUsuario subtemaAcceso = new SubTemaAccesoUsuario();
                                subtemaAcceso.AlumnoId    = viewModel.Usuario.Id;
                                subtemaAcceso.FechaAcceso = DateTime.Now;
                                subtemaAcceso.SubTemaId   = Convert.ToInt32(accesoSubtema.Value);

                                db.SubTemaAccesoUsuarios.Add(subtemaAcceso);
                                db.SaveChanges();
                                listaSubtemasAccesso.Add(subtemaAcceso.SubTemaId);
                            }
                        }
                    }
                    var subtemasAcceso = db.SubTemaAccesoUsuarios.Where(sa => sa.AlumnoId == viewModel.Usuario.Id).Select(sa => sa.SubTema).ToList();
                    var temas          = subtemasAcceso.Select(su => su.TemaId);
                    foreach (var temaId in temas)
                    {
                        var subtemaInicial = subtemasAcceso.Where(sa => sa.TemaId == temaId).OrderBy(su => su.Orden).FirstOrDefault();
                        if (subtemaInicial != null)
                        {
                            if (!db.SubTemaDesbloqueados.Any(sd => sd.SubTemaId == subtemaInicial.SubTemaId && sd.AlumnoId == viewModel.Usuario.Id))
                            {
                                SubTemaDesbloqueado desbloqueado = new SubTemaDesbloqueado();
                                desbloqueado.AlumnoId        = viewModel.Usuario.Id;
                                desbloqueado.FechaDesbloqueo = DateTime.Now;
                                desbloqueado.SubTemaId       = subtemaInicial.SubTemaId;

                                db.SubTemaDesbloqueados.Add(desbloqueado);
                                db.SaveChanges();
                            }
                        }
                    }
                }

                List <int> temasCliente = db.ClienteTemas.Where(te => te.ClienteId == viewModel.Usuario.ClienteId).Select(te => te.TemaId).ToList();

                List <SubTema> subtemasIniciales = db.SubTemas.Where(sub => temasCliente.Contains(sub.TemaId) && sub.Orden == 1).ToList();
                foreach (SubTema subtema in subtemasIniciales)
                {
                    bool anyadir = true;
                    if (viewModel.Usuario.BloquearSubtemas)
                    {
                        if (!listaSubtemasAccesso.Contains(subtema.SubTemaId))
                        {
                            anyadir = false;
                        }
                    }
                    if (anyadir)
                    {
                        if (!db.SubTemaDesbloqueados.Any(sd => sd.SubTemaId == subtema.SubTemaId && sd.AlumnoId == viewModel.Usuario.Id))
                        {
                            SubTemaDesbloqueado desbloqueado = new SubTemaDesbloqueado();
                            desbloqueado.AlumnoId        = viewModel.Usuario.Id;
                            desbloqueado.FechaDesbloqueo = DateTime.Now;
                            desbloqueado.SubTemaId       = subtema.SubTemaId;

                            db.SubTemaDesbloqueados.Add(desbloqueado);
                            db.SaveChanges();
                        }
                    }
                }

                var userResult = gestorUsuarios.Update(applicationUser);

                if (userResult.Succeeded)
                {
                    if (!string.IsNullOrWhiteSpace(viewModel.Password))
                    {
                        gestorUsuarios.UpdatePassword(viewModel.Usuario.Id, viewModel.Password);
                    }
                    return(RedirectToAction("Index"));
                }
            }
            viewModel.InicializarDesplegables();
            return(View(viewModel));
        }