public IActionResult SpecificGeneration(string selectedrace, string selectedclass, string selectedlevel)
        {
            AutoDelete();
            int? SessionId   = HttpContext.Session.GetInt32("UserId");
            User SessionUser = _context.Users.FirstOrDefault(u => u.UserId == SessionId);

            if (SessionUser == null)
            {
                return(View("UserLogin"));
            }
            int Level = Int32.Parse(selectedlevel);

            if (Level == 0) //Assign the base choice value as == 0
            {
                Level = rand.Next(1, 21);
            }
            //creating input for creation and modification of base in other functions
            PlayerStat playerStat = new PlayerStat(Level);

            // Run player stat through background
            PlayerBG playerBG = new PlayerBG();

            // Returns player Stat VVV
            playerBG.BGSelector(playerStat, playerBG);

            // Determines player Race and then run stats
            PlayerRace playerRace = new PlayerRace();

            // Returns player Stat VVV

            // Determine Player Class and run playerStat
            if (selectedrace != "Random")
            {
                playerRace.SpecificRaceSelector(Level, playerStat, playerRace, selectedrace);
            }
            else
            {
                playerRace.RaceSelector(Level, playerStat, playerRace);
            }
            PlayerClass playerClass = new PlayerClass(Level, playerStat);

            // Returns player Stat VVV
            if (selectedclass != "Random")
            {
                playerClass.SpecClassSelector(Level, playerStat, playerClass, selectedclass);
            }
            else
            {
                playerClass.ClassSelector(Level, playerStat, playerClass);
            }
            // reruns numbers based on updated proficiencies and skill increases
            playerStat.UpdatePro(playerStat);

            // create connection to all character objects within the character
            NewCharacter newPlayer = new NewCharacter(Level, playerStat, playerRace, playerClass, playerBG, SessionUser);

            _context.PlayerStats.Add(playerStat);
            _context.PlayerBGs.Add(playerBG);
            _context.PlayerClasses.Add(playerClass);
            _context.PlayerRaces.Add(playerRace);
            _context.NewCharacter.Add(newPlayer);

            // Feat Generation
            List <Feature> charFeatures = _context.Features.Where(f => ((f.FeatSource == playerClass.ClassName) && (f.FeatLevel <= Level)) || ((f.FeatSource == playerClass.SubClassName) && (f.FeatLevel <= Level))).ToList();

            foreach (Feature feat in charFeatures)
            {
                var Fassoc = new FeatureAssoc(newPlayer, feat);
                _context.Feature_Associations.Add(Fassoc);
                _context.SaveChanges();
            }

            List <Feature> Feats = _context.NewCharacter.Include(c => c.FeaturesList)
                                   .ThenInclude(fa => fa.FeatureA)
                                   .FirstOrDefault(c => c.CharacterId == newPlayer.CharacterId)
                                   .FeaturesList.Select(f => f.FeatureA)
                                   .OrderBy(f => f.FeatLevel)
                                   .ToList();


            List <Spell> ClassAvailbleSpells = _context.Spells.Where(s =>
                                                                     s.Source1 == newPlayer.playerClass.ClassName ||
                                                                     s.Source2 == newPlayer.playerClass.ClassName ||
                                                                     s.Source3 == newPlayer.playerClass.ClassName ||
                                                                     s.Source4 == newPlayer.playerClass.ClassName ||
                                                                     s.Source5 == newPlayer.playerClass.ClassName ||
                                                                     s.Source6 == newPlayer.playerClass.ClassName ||
                                                                     s.Source7 == newPlayer.playerClass.ClassName
                                                                     ).ToList();

            List <Spell> NonClassSpells = _context.Spells.Where(s =>
                                                                s.Source1 != newPlayer.playerClass.ClassName ||
                                                                s.Source2 != newPlayer.playerClass.ClassName ||
                                                                s.Source3 != newPlayer.playerClass.ClassName ||
                                                                s.Source4 != newPlayer.playerClass.ClassName ||
                                                                s.Source5 != newPlayer.playerClass.ClassName ||
                                                                s.Source6 != newPlayer.playerClass.ClassName ||
                                                                s.Source7 != newPlayer.playerClass.ClassName
                                                                ).ToList();

            Spell        FetchSpell           = new Spell();
            List <Spell> availableSpells      = FetchSpell.GetPossibleSpells(newPlayer, ClassAvailbleSpells, NonClassSpells);
            SpellAssoc   AlwaysPreppedChecker = new SpellAssoc();

            foreach (Spell s in availableSpells)
            {
                SpellAssoc a = new SpellAssoc(newPlayer, s);//always true
                AlwaysPreppedChecker.AlwaysPreppedChecker(newPlayer, s, a);
                _context.Spell_Associations.Add(a);
                _context.SaveChanges();
            }

            List <Spell> Spells = _context.NewCharacter
                                  .Include(c => c.SpellList)
                                  .ThenInclude(sa => sa.SpellA)
                                  .FirstOrDefault(c => c.CharacterId == newPlayer.CharacterId)
                                  .SpellList.Select(s => s.SpellA)
                                  .OrderBy(f => f.SpellLevel)
                                  .ThenBy(f => f.SpellName)
                                  .ToList();

            _context.SaveChanges();

            int passiveperception = 10 + newPlayer.playerStat.Perception;

            //Dynamic model with USer, Login, Character
            dynamic MyModel = new ExpandoObject();

            MyModel.User              = SessionUser;
            MyModel.Login             = new Login();
            MyModel.Character         = newPlayer;
            MyModel.Features          = Feats;
            MyModel.Spells            = Spells;
            MyModel.PassivePerception = passiveperception;
            return(View("Index", MyModel));
        }
        public IActionResult Index()
        {
            // Check for features, if null populate DB
            Feature featTest = _context.Features.FirstOrDefault(f => f.FeatureId == 1);

            if (featTest == null)
            {
                Feature        feats       = new Feature();
                List <Feature> FeatureList = feats.GenerateFeatureList();
                foreach (Feature f in FeatureList)
                {
                    _context.Features.Add(f);
                    _context.SaveChanges();
                }
            }
            // Check for spells, if null populate DB
            Spell spellTest = _context.Spells.FirstOrDefault(s => s.SpellId == 1);

            if (spellTest == null)
            {
                Spell        spell     = new Spell();
                List <Spell> SpellList = spell.GenerateSpellList();
                foreach (Spell s in SpellList)
                {
                    _context.Spells.Add(s);
                    _context.SaveChanges();
                }
            }
            // Check for base user, if null Populate DB
            User userCheck = _context.Users.FirstOrDefault(u => u.UserId == 1);

            if (userCheck == null)
            {
                string email    = "*****@*****.**";
                string uName    = "UnameTest";
                string PW       = "vu942kjdaiduq934i3o4odsud9qw324";
                User   testUser = new User(email, uName, PW);
                _context.Users.Add(testUser);
                _context.SaveChanges();
                userCheck = testUser;
            }
            // Create a function to generate 1 character for display if none in dB
            NewCharacter characterCheck = _context.NewCharacter.FirstOrDefault(c => c.CharacterId == 1);

            if (characterCheck == null)
            {
                NewCharacter test = new NewCharacter(1, userCheck);
                test.isSaved    = true;
                test.playerName = "First Character Generated";
                _context.PlayerStats.Add(test.playerStat);
                _context.PlayerBGs.Add(test.playerBG);
                _context.PlayerClasses.Add(test.playerClass);
                _context.PlayerRaces.Add(test.playerRace);
                _context.NewCharacter.Add(test);
                _context.SaveChanges();
                List <Feature> charFeatures = _context.Features.Where(f => ((f.FeatSource == test.playerClass.ClassName) && (f.FeatLevel <= test.Level)) || ((f.FeatSource == test.playerClass.SubClassName) && (f.FeatLevel <= test.Level))).ToList();
                foreach (Feature feat in charFeatures)
                {
                    var Fassoc = new FeatureAssoc(test, feat);     //id 1- 42
                    _context.Feature_Associations.Add(Fassoc);
                    _context.SaveChanges();
                }

                // Get all associated features with characterID
                List <Feature> Feats = _context.NewCharacter
                                       .Include(c => c.FeaturesList)
                                       .ThenInclude(fa => fa.FeatureA)
                                       .FirstOrDefault(c => c.CharacterId == test.CharacterId)
                                       .FeaturesList.Select(f => f.FeatureA)
                                       .OrderBy(f => f.FeatLevel)
                                       .ToList();

                List <Spell> ClassAvailbleSpells = _context.Spells.Where(s =>
                                                                         s.Source1 == test.playerClass.ClassName ||
                                                                         s.Source2 == test.playerClass.ClassName ||
                                                                         s.Source3 == test.playerClass.ClassName ||
                                                                         s.Source4 == test.playerClass.ClassName ||
                                                                         s.Source5 == test.playerClass.ClassName ||
                                                                         s.Source6 == test.playerClass.ClassName ||
                                                                         s.Source7 == test.playerClass.ClassName
                                                                         ).ToList();
                List <Spell> NonClassSpells = _context.Spells.Where(s =>
                                                                    s.Source1 != test.playerClass.ClassName ||
                                                                    s.Source2 != test.playerClass.ClassName ||
                                                                    s.Source3 != test.playerClass.ClassName ||
                                                                    s.Source4 != test.playerClass.ClassName ||
                                                                    s.Source5 != test.playerClass.ClassName ||
                                                                    s.Source6 != test.playerClass.ClassName ||
                                                                    s.Source7 != test.playerClass.ClassName
                                                                    ).ToList();

                Spell        FetchSpell           = new Spell();
                List <Spell> Spells               = FetchSpell.GetPossibleSpells(test, ClassAvailbleSpells, NonClassSpells);
                SpellAssoc   AlwaysPreppedChecker = new SpellAssoc();
                foreach (Spell s in Spells)
                {
                    SpellAssoc a = new SpellAssoc(test, s);
                    //insert alwayspreppedfunction here
                    AlwaysPreppedChecker.AlwaysPreppedChecker(test, s, a);
                    _context.Spell_Associations.Add(a);
                    _context.SaveChanges();
                }

                int passiveperception = 10 + test.playerStat.Perception;

                // Dynamic model to provide all available objects and data
                dynamic MyModel = new ExpandoObject();
                MyModel.User              = userCheck;
                MyModel.Login             = new Login();
                MyModel.Character         = test;
                MyModel.Features          = Feats;
                MyModel.Spells            = Spells;
                MyModel.PassivePerception = passiveperception;


                return(View("index", MyModel));
            }

            // if DB is populated with spells, feats, 1 character and 1 user are already present
            else
            {
                // Home screen selects and shows previously generated characters. IF players would like to generate new characters or save them, they must login
                int? SessionId   = HttpContext.Session.GetInt32("UserId");
                User SessionUser = _context.Users.FirstOrDefault(u => u.UserId == SessionId);
                // Get list of all Currently generated characters
                List <NewCharacter> CharacterList = _context.NewCharacter.ToList();
                // select random character and gather all stats, BG, Race and class
                // random selection might need tweaking
                int          characterNum = 1;
                NewCharacter character    = _context.NewCharacter.Include(c => c.playerRace).Include(c => c.playerClass).Include(c => c.playerStat).Include(c => c.playerBG).FirstOrDefault(c => c.CharacterId == characterNum);
                // LINQ query all Feature Associations
                List <Feature> Feats = _context.NewCharacter
                                       .Include(c => c.FeaturesList)
                                       .ThenInclude(fa => fa.FeatureA)
                                       .FirstOrDefault(c => c.CharacterId == character.CharacterId)
                                       .FeaturesList.Select(f => f.FeatureA)
                                       .OrderBy(f => f.FeatLevel)
                                       .ToList();

                List <Spell> Spells = _context.NewCharacter
                                      .Include(c => c.SpellList)
                                      .ThenInclude(sa => sa.SpellA)
                                      .FirstOrDefault(c => c.CharacterId == character.CharacterId)
                                      .SpellList.Select(s => s.SpellA)
                                      .OrderBy(f => f.SpellLevel)
                                      .ThenBy(f => f.SpellName)
                                      .ToList();

                // Pass Model User, Character, Feats
                //passiveperception, because it hates trying to do it on the front end
                int passiveperception = 10 + character.playerStat.Perception;

                dynamic MyModel = new ExpandoObject();
                MyModel.User              = SessionUser;
                MyModel.Login             = new Login();
                MyModel.Character         = character;
                MyModel.Features          = Feats;
                MyModel.Spells            = Spells;
                MyModel.PassivePerception = passiveperception;



                return(View("index", MyModel));
            }
        }