public async Task <IActionResult> DeleteConfirmed(int?id)
        {
            if (id == null)
            {
                return(NotFound());
            }

            Caster casterFromDB = await _db.Casters.Include(c => c.Faction).FirstAsync(c => c.Id == id);

            if (casterFromDB == null)
            {
                return(NotFound());
            }

            if (await _db.BattleReports.AnyAsync(br => br.WinningCaster == casterFromDB.Name || br.LosingCaster == casterFromDB.Name))
            {
                CasterViewModel viewModel = new CasterViewModel()
                {
                    Caster        = casterFromDB,
                    StatusMessage = "Error: You cannot delete a Caster for which there are already posted Battle Reports."
                };
                return(View(nameof(Delete), viewModel));
            }

            _db.Casters.Remove(casterFromDB);
            await _db.SaveChangesAsync();

            return(RedirectToAction(nameof(Index)));
        }
        public async Task <IActionResult> Delete(int?id)
        {
            if (id == null)
            {
                return(NotFound());
            }

            if (!await _db.Casters.AnyAsync(t => t.Id == id))
            {
                return(NotFound());
            }

            Caster casterFromDB = await _db.Casters.Include(c => c.Faction).FirstAsync(c => c.Id == id);

            if (casterFromDB == null)
            {
                return(NotFound());
            }

            CasterViewModel viewModel = new CasterViewModel()
            {
                Caster = casterFromDB
            };

            return(View(viewModel));
        }
        public async Task <IActionResult> Index()
        {
            CasterViewModel viewModel = new CasterViewModel()
            {
                Casters  = await _db.Casters.ToListAsync(),
                Factions = await _db.Factions.OrderBy(f => f.Name).ToListAsync()
            };

            return(View(viewModel));
        }
        public async Task <IActionResult> Create()
        {
            CasterViewModel viewModel = new CasterViewModel()
            {
                Factions      = await _db.Factions.OrderBy(f => f.Name).ToListAsync(),
                Casters       = await _db.Casters.ToListAsync(),
                Caster        = new Caster(),
                StatusMessage = string.Empty
            };

            return(View(viewModel));
        }
        public async Task <IActionResult> Edit(int?id)
        {
            if (id == null)
            {
                return(NotFound());
            }

            if (!await _db.Casters.AnyAsync(c => c.Id == id))
            {
                return(NotFound());
            }

            CasterViewModel viewModel = new CasterViewModel()
            {
                Factions      = await _db.Factions.OrderBy(f => f.Name).ToListAsync(),
                Casters       = await _db.Casters.ToListAsync(),
                Caster        = await _db.Casters.Include(c => c.Faction).FirstAsync(c => c.Id == id),
                StatusMessage = string.Empty
            };

            return(View(viewModel));
        }
        public async Task <IActionResult> Create(CasterViewModel viewModel)
        {
            viewModel.StatusMessage = string.Empty;
            if (!ModelState.IsValid)
            {
                return(View(viewModel));
            }

            if (await _db.Casters.Where(c => c.FactionId == viewModel.Caster.FactionId).AnyAsync(c => c.Name == viewModel.Caster.Name))
            {
                viewModel.Factions = await _db.Factions.OrderBy(f => f.Name).ToListAsync();

                viewModel.Casters = await _db.Casters.ToListAsync();

                viewModel.StatusMessage = "Error: A caster with that name for the given faction already exists in the database.";
                return(View(viewModel));
            }

            _db.Casters.Add(viewModel.Caster);
            await _db.SaveChangesAsync();

            return(RedirectToAction(nameof(Index)));
        }
        public async Task <IActionResult> Edit(CasterViewModel viewModel)
        {
            viewModel.StatusMessage = string.Empty;
            if (!ModelState.IsValid)
            {
                return(View(viewModel));
            }

            if (await _db.Casters.Where(c => c.FactionId == viewModel.Caster.FactionId).AnyAsync(c => c.Name == viewModel.Caster.Name))
            {
                viewModel.Factions = await _db.Factions.OrderBy(f => f.Name).ToListAsync();

                viewModel.Casters = await _db.Casters.ToListAsync();

                viewModel.StatusMessage = "Error: A caster with that name for the given faction already exists in the database.";
                return(View(viewModel));
            }

            Caster casterFromDB = await _db.Casters.FindAsync(viewModel.Caster.Id);

            if (casterFromDB == null)
            {
                return(NotFound());
            }

            List <BattleReport> battleReports = await _db.BattleReports.Where(br => br.PostersCaster == casterFromDB.Name || br.OpponentsCaster == casterFromDB.Name).ToListAsync();

            if (battleReports.Count > 0 && casterFromDB.FactionId != viewModel.Caster.FactionId)
            {
                viewModel.Factions = await _db.Factions.OrderBy(f => f.Name).ToListAsync();

                viewModel.Casters = await _db.Casters.ToListAsync();

                viewModel.StatusMessage = "Error: You cannot change the Faction for a Caster for which there are already posted Battle Reports.";
                return(View(viewModel));
            }

            foreach (BattleReport battleReport in battleReports)
            {
                if (battleReport.PostersCaster == casterFromDB.Name)
                {
                    battleReport.PostersCaster = viewModel.Caster.Name;
                }
                if (battleReport.OpponentsCaster == casterFromDB.Name)
                {
                    battleReport.OpponentsCaster = viewModel.Caster.Name;
                }
                if (battleReport.WinningCaster == casterFromDB.Name)
                {
                    battleReport.WinningCaster = viewModel.Caster.Name;
                }
                if (battleReport.LosingCaster == casterFromDB.Name)
                {
                    battleReport.LosingCaster = viewModel.Caster.Name;
                }
            }

            casterFromDB.Name      = viewModel.Caster.Name;
            casterFromDB.FactionId = viewModel.Caster.FactionId;
            await _db.SaveChangesAsync();

            return(RedirectToAction(nameof(Index)));
        }