public ActionResult Create(SamouraisVM samVM)
        {
            if (ModelState.IsValid)
            {
                Samourai samourai = new Samourai();
                samourai.Nom   = samVM.Nom;
                samourai.Force = samVM.Force;

                // Enregistre le nouveau propriétaire d'une arme si une arme à été seléctionnée
                if (samVM.ArmeId != null)
                {
                    Arme arme = db.Armes.FirstOrDefault(a => a.Id == samVM.ArmeId);
                    arme.Samourai = samourai;
                    samourai.Arme = db.Armes.FirstOrDefault(a => a.Id == samVM.ArmeId);
                }
                if (samVM.ArtMartialsSelected != null)
                {
                    samourai.ArtMartials = db.ArtMartials.Where(a => samVM.ArtMartialsSelected.Contains(a.Id)).ToList();
                }
                db.Samourais.Add(samourai);
                db.SaveChanges();
                return(RedirectToAction("Index"));
            }
            samVM.Armes = db.Armes.Select(a => new SelectListItem {
                Text = a.Nom, Value = a.Id.ToString()
            }).ToList();
            return(View(samVM));
        }
        public ActionResult Create(SamouraisVM vm)
        {
            if (ModelState.IsValid)
            {
                if (vm.IdArme != null)
                {
                    Samourai samAvecArme = db.Samourais.FirstOrDefault(s => s.Arme.Id == vm.IdArme);
                    if (samAvecArme != null)
                    {
                        samAvecArme.Arme            = null;
                        db.Entry(samAvecArme).State = EntityState.Modified;
                    }

                    vm.Samourai.Arme = db.Armes.Find(vm.IdArme);
                }

                vm.Samourai.ArtMartials = db.ArtMartials.Where(am => vm.IdsArtMartial.Contains(am.Id)).ToList();

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

            this.getArmesAndArtMartials(vm);

            return(View(vm));
        }
        // GET: Samourais/Create
        public ActionResult Create()
        {
            SamouraisVM vm = new SamouraisVM();

            this.getArmesAndArtMartials(vm);

            return(View(vm));
        }
        // GET: Samourais/Create
        public ActionResult Create()
        {
            SamouraisVM samVM = new SamouraisVM();

            //stock dans le SamouraiVM la liste des armes disponibles et la liste des arts martiaux
            samVM.Armes = db.Armes.Include(a => a.Samourai).Where(a => a.Samourai == null).Select(a => new SelectListItem {
                Text = a.Nom, Value = a.Id.ToString()
            }).ToList();
            samVM.ArtMartials = db.ArtMartials.Select(a => new SelectListItem {
                Text = a.Nom, Value = a.Id.ToString()
            }).ToList();
            return(View(samVM));
        }
        private SamouraisVM getArmesAndArtMartials(SamouraisVM vm)
        {
            List <int> listeArmesId = db.Samourais.Where(s => s.Arme != null).Select(s => s.Arme.Id).ToList();

            vm.ArmeItems = db.Armes.Where(a => !listeArmesId.Contains(a.Id)).Select(a => new SelectListItem()
            {
                Text = a.Nom, Value = a.Id.ToString()
            })
                           .ToList();

            vm.ArtMartialItems = db.ArtMartials.Select(am => new SelectListItem()
            {
                Text = am.Nom, Value = am.Id.ToString()
            })
                                 .ToList();

            return(vm);
        }
        // GET: Samourais/Delete/5
        public ActionResult Delete(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            SamouraisVM vm = new SamouraisVM();

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

            if (vm.Samourai == null)
            {
                return(HttpNotFound());
            }

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

            SamouraisVM vm = new SamouraisVM();

            vm.Samourai = db.Samourais.Find(id);
            if (vm.Samourai == null)
            {
                return(HttpNotFound());
            }

            //
            List <int> listeArmesId =
                db.Samourais.Where(x => x.Arme != null && x.Id != id).Select(x => x.Arme.Id).ToList();

            vm.ArmeItems = db.Armes.Where(a => !listeArmesId.Contains(a.Id)).Select(a => new SelectListItem()
            {
                Text = a.Nom, Value = a.Id.ToString()
            })
                           .ToList();
            //
            vm.ArtMartialItems = db.ArtMartials.Select(am => new SelectListItem()
            {
                Text = am.Nom, Value = am.Id.ToString()
            })
                                 .ToList();
            //
            vm.IdsArtMartial = vm.Samourai.ArtMartials.Select(s => s.Id).ToList();
            //
            if (vm.Samourai.Arme != null)
            {
                vm.IdArme = vm.Samourai.Arme.Id;
            }

            return(View(vm));
        }
        public ActionResult Edit(SamouraisVM samVM)
        {
            if (ModelState.IsValid)
            {
                Samourai samourai = db.Samourais.Include(s => s.Arme).Include(s => s.ArtMartials).FirstOrDefault(s => s.Id == samVM.Id);
                samourai.Nom   = samVM.Nom;
                samourai.Force = samVM.Force;
                if (samVM.ArmeId != null)
                {
                    Arme arme = db.Armes.FirstOrDefault(a => a.Id == samVM.ArmeId);
                    arme.Samourai = samourai;
                    samourai.Arme = db.Armes.FirstOrDefault(a => a.Id == samVM.ArmeId);
                }
                else
                {
                    samourai.Arme = null;
                }
                if (samVM.ArtMartialsSelected != null)
                {
                    samourai.ArtMartials = db.ArtMartials.Where(a => samVM.ArtMartialsSelected.Contains(a.Id)).ToList();
                }
                else
                {
                    samourai.ArtMartials = null;
                }


                db.SaveChanges();
                return(RedirectToAction("Index"));
            }
            samVM.Armes = db.Armes.Select(a => new SelectListItem {
                Text = a.Nom, Value = a.Id.ToString()
            }).ToList();
            samVM.ArtMartials = db.ArtMartials.Select(a => new SelectListItem {
                Text = a.Nom, Value = a.Id.ToString()
            }).ToList();
            return(View(samVM));
        }
        public ActionResult Edit(SamouraisVM vm)
        {
            if (ModelState.IsValid)
            {
                //
                Samourai modifiedSam = db.Samourais.Include(x => x.Arme).FirstOrDefault(x => x.Id == vm.Samourai.Id);
                //
                modifiedSam.Nom = vm.Samourai.Nom;
                //
                modifiedSam.Force = vm.Samourai.Force;
                //
                foreach (var am in modifiedSam.ArtMartials)
                {
                    db.Entry(am).State = EntityState.Modified;
                }

                modifiedSam.ArtMartials = db.ArtMartials.Where(am => vm.IdsArtMartial.Contains(am.Id)).ToList();
                //
                if (vm.IdArme != null)
                {
                    modifiedSam.Arme = db.Armes.FirstOrDefault(a => a.Id == vm.IdArme);
                }
                else
                {
                    var samouraisAvecMonArme = db.Samourais.FirstOrDefault(x => x.Arme.Id == vm.IdArme);
                    samouraisAvecMonArme.Arme            = null;
                    db.Entry(samouraisAvecMonArme).State = EntityState.Modified;

                    modifiedSam.Arme = null ?? db.Armes.FirstOrDefault(x => x.Id == vm.IdArme);
                }


                db.Entry(modifiedSam).State = EntityState.Modified;
                db.SaveChanges();
                return(RedirectToAction("Index"));
            }

            //
            List <int> listeArmesId =
                db.Samourais.Where(x => x.Arme != null && x.Id != vm.Samourai.Id).Select(x => x.Arme.Id).ToList();

            vm.ArmeItems = db.Armes.Where(a => !listeArmesId.Contains(a.Id)).Select(a => new SelectListItem()
            {
                Text = a.Nom, Value = a.Id.ToString()
            })
                           .ToList();
            //
            vm.ArtMartialItems = db.ArtMartials.Select(am => new SelectListItem()
            {
                Text = am.Nom, Value = am.Id.ToString()
            })
                                 .ToList();
            //
            if (vm.Samourai.Arme != null)
            {
                vm.IdArme = vm.Samourai.Arme.Id;
            }

            //
            vm.IdsArtMartial = vm.Samourai.ArtMartials.Select(s => s.Id).ToList();

            return(View(vm));
        }
        // GET: Samourais/Edit/5
        public ActionResult Edit(int?id, bool?addWeapon, bool?disarm)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            Samourai samourai = db.Samourais.Include(s => s.ArtMartials).Include(s => s.Arme).FirstOrDefault(s => s.Id == id);

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

            SamouraisVM samVM = new SamouraisVM();

            samVM.Id        = samourai.Id;
            samVM.Nom       = samourai.Nom;
            samVM.Arme      = samourai.Arme;
            samVM.Force     = samourai.Force;
            samVM.AddWeapon = false;
            samVM.Disarm    = false;
            if (samourai.Arme != null)
            {
                samVM.ArmeId = samourai.Arme.Id;
            }

            // permet d'afficher la liste d'armes disponibles si le samourai veut en équiper une
            if (addWeapon == true)
            {
                samVM.AddWeapon = true;
            }

            // permet de déséquiper une arme
            if (disarm == true)
            {
                samVM.ArmeId = null;
                samVM.Disarm = true;
            }

            // construction de la liste d'armes à afficher
            List <Arme> armes = db.Armes.Include(a => a.Samourai).Where(a => a.Samourai == null).ToList();

            if (samourai.Arme != null)
            {
                armes.Add(samourai.Arme);
            }
            if (armes.Count() > 0)
            {
                samVM.Armes = armes.Select(a => new SelectListItem {
                    Text = a.Nom, Value = a.Id.ToString()
                }).ToList();
            }
            else
            {
                TempData["NoWeapon"] = "Il n'y a aucune arme disponible";
            }

            samVM.ArtMartials = db.ArtMartials.Select(a => new SelectListItem {
                Text = a.Nom, Value = a.Id.ToString()
            }).ToList();
            samVM.ArtMartialsSelected = samourai.ArtMartials.Select(a => a.Id).ToList();

            return(View(samVM));
        }