public ActionResult Create(SamouraiCreateEditVM svm)
        {
            if (ModelState.IsValid && ArmeNotBelongToMoreThanOneSamourai(svm)) //Vérifier qu'une arme ne peut appartenir qu'à un seul samourai
            {
                Samourai samourai = new Samourai();
                samourai.Nom   = svm.Samourai.Nom;
                samourai.Force = svm.Samourai.Force;

                //on vérifie si une arme est sélectionnée pour le samourai
                if (svm.IdSelectedArme != null)
                {
                    samourai.Arme = db.Armes.FirstOrDefault(a => a.Id == svm.IdSelectedArme);
                }

                //on vérifie si des arts martiaux sont associés au samourai
                if (svm.IdSelectedArtMartials.Count > 0)
                {
                    samourai.ArtMartials = db.ArtMartials.Where(a => svm.IdSelectedArtMartials.Contains(a.Id)).ToList();
                }

                db.Samourais.Add(samourai);
                db.SaveChanges();
                return(RedirectToAction("Index"));
            }

            //si ModelState non valide, on renvoie la vue Create avec la liste d'armes et d'arts martiaux
            svm.ArtMartials = db.ArtMartials.Select(a => new SelectListItem {
                Text = a.Nom, Value = a.Id.ToString()
            });
            svm.Armes = db.Armes.Select(a => new SelectListItem {
                Text = a.Nom, Value = a.Id.ToString()
            });
            return(View(svm));
        }
        public ActionResult Edit(SamouraiCreateEditVM svm)
        {
            if (ModelState.IsValid && ArmeNotBelongToMoreThanOneSamourai(svm))
            {
                #region Explications Lazy / Eager Loading
                //Find() seul -> charge le samourai en lazy loading (type de chargement par défaut).
                //Attention donc ! Tant que l'on n'apelle pas son arme, celle-ci n'est pas chargée en mémoire.
                //Comme l'arme n'est pas chargée, on ne peut pas la modifiée ou la setter à null

                //Samourai samouraiDb = db.Samourais.Find(svm.Samourai.Id);


                //Eager Loading : ajout de .Include()
                //.Include(s => s.Armes) permet de récupérer l'arme en eager
                //Pour la liste des samourais récupérés on demande de charger également l'arme associée.
                #endregion

                Samourai samouraiDb = db.Samourais.Include(s => s.Arme).Include(s => s.ArtMartials).FirstOrDefault(x => x.Id == svm.Samourai.Id);

                samouraiDb.Nom   = svm.Samourai.Nom;
                samouraiDb.Force = svm.Samourai.Force;

                samouraiDb.Arme = (svm.IdSelectedArme != null) ? db.Armes.FirstOrDefault(a => a.Id == svm.IdSelectedArme) : null;

                //on vérifie si des arts martiaux sont associés au samourai
                if (svm.IdSelectedArtMartials.Count > 0)
                {
                    foreach (var artMartial in samouraiDb.ArtMartials)
                    {
                        db.Entry(artMartial).State = EntityState.Modified;
                    }
                    samouraiDb.ArtMartials = db.ArtMartials.Where(a => svm.IdSelectedArtMartials.Contains(a.Id)).ToList();
                }
                else
                {
                    samouraiDb.ArtMartials = new List <ArtMartial>();
                }

                db.Entry(samouraiDb).State = EntityState.Modified;

                db.SaveChanges();
                return(RedirectToAction("Index"));
            }

            //si ModelState non valide, on renvoie la vue Create avec la liste d'armes et d'arts martiaux
            svm.ArtMartials = db.ArtMartials.Select(a => new SelectListItem {
                Text = a.Nom, Value = a.Id.ToString()
            });
            svm.Armes = db.Armes.Select(a => new SelectListItem {
                Text = a.Nom, Value = a.Id.ToString()
            });
            return(View(svm));
        }
        // GET: Samourais/Create
        public ActionResult Create()
        {
            SamouraiCreateEditVM svm = new SamouraiCreateEditVM();

            svm.Armes = getArmesAvailable().Select(a => new SelectListItem {
                Text = a.Nom, Value = a.Id.ToString()
            });
            svm.ArtMartials = db.ArtMartials.Select(a => new SelectListItem {
                Text = a.Nom, Value = a.Id.ToString()
            });

            return(View(svm));
        }
        // GET: Samourais/Edit/5
        public ActionResult Edit(int?id, bool?emptyArtMartials)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            SamouraiCreateEditVM svm = new SamouraiCreateEditVM();

            Samourai samouraiDb = db.Samourais.Find(id);

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

            svm.Samourai    = samouraiDb;
            svm.ArtMartials = db.ArtMartials.Select(a => new SelectListItem {
                Text = a.Nom, Value = a.Id.ToString()
            });

            List <Arme> armesAvailable = getArmesAvailable();

            //on ajoute au choix des armes dispos celle couramment utilisée par le samourai édité
            if (samouraiDb.Arme != null)
            {
                armesAvailable.Add(db.Armes.FirstOrDefault(a => a.Id == samouraiDb.Arme.Id));
                svm.IdSelectedArme = samouraiDb.Arme.Id;
            }

            svm.Armes = armesAvailable.Select(a => new SelectListItem {
                Text = a.Nom, Value = a.Id.ToString()
            });

            //utiliser pour pouvoir supprimer la liste d'arts martiaux sélectionnés (action possible depuis la vue)
            if (emptyArtMartials.HasValue)
            {
                svm.IdSelectedArtMartials = new List <int>();
            }
            else
            {
                svm.IdSelectedArtMartials = samouraiDb.ArtMartials.Select(a => a.Id).ToList();
            }


            return(View(svm));
        }
        public bool ArmeNotBelongToMoreThanOneSamourai(SamouraiCreateEditVM svm)
        {
            int? idSelectedArme = svm.IdSelectedArme;
            bool isValid        = true;

            //on vérifie si une arme est sélectionnée pour le samourai
            //si oui, on vérifie qu'elle n'appartient pas déjà à un autre samourai
            if (idSelectedArme != null)
            {
                Arme selectedArme = db.Armes.FirstOrDefault(a => a.Id == idSelectedArme);
                if (db.Samourais.Any(s => s.Arme.Id == selectedArme.Id && s.Id != svm.Samourai.Id))
                {
                    isValid = false;
                }
            }

            if (!isValid)
            {
                ModelState.AddModelError("IdSelectedArme", "Cette arme appartient déjà à un autre samourai");
            }

            return(isValid);
        }