public IActionResult JoinCompetition(string eventID, string competitionID)
        {
            ViewData["ReturnUrl"] = "/Event/ViewEvent?eventID=" + eventID;
            var competition = QueryController.GetCompetitionFromId(QueryController.GetEventFromId(_context, eventID), competitionID);

            if (competition != null)
            {
                JoinCompetitionViewModel model = new JoinCompetitionViewModel
                {
                    Competition = competition
                };
                ViewData["eventID"]       = eventID;
                ViewData["competitionID"] = competitionID;
                return(View(model));
            }
            ViewData["error"] = "Invalid event or competition.";
            return(View("Error"));
        }
        public async Task <IActionResult> JoinCompetition(string eventID, string competitionID, JoinCompetitionViewModel model, string returnUrl = null)
        {
            ViewData["ReturnUrl"]     = returnUrl;
            ViewData["eventID"]       = eventID;
            ViewData["competitionID"] = competitionID;
            Event           evnt = QueryController.GetEventFromId(_context, eventID);
            Competition     comp = evnt.Competitions.Where(o => o.id == competitionID).First();
            ApplicationUser user = QueryController.GetCurrentUserAsync(_userManager, User);

            model.Competition = comp;
            if (ModelState.IsValid) //&& QueryController.IsUserParticipatingInCompetition(_context,user.details.id,competitionID) > 0)
            {                       //If model is valid and the user isn't already participating
                int  participants = comp.getParticipants();
                Team team         = null;
                if (model.JoinIndividual)
                {
                    if (model.TeamName == "" || model.TeamName == null)
                    {
                        model.TeamName = user.details.FirstName + " " + user.details.LastName + "'s team";
                    }
                    if (+1 <= comp.EntryCapacity)
                    { //If adding one participant is within capacity add team
                        team = new Team
                        {
                            ManagerID            = user.Id,
                            TeamName             = model.TeamName,
                            TeamMembers          = null,
                            ManagerParticipation = true
                        };
                    }
                    else
                    {
                        TempData["modal"] = "This competition is unfortunately full.";
                        return(View(model));
                    }
                }
                else if (model.TeamMembers != null)
                {
                    int teamSize = model.TeamMembers.Length + (model.ManagerParticipation ? 1 : 0);

                    //Firstly check if Team Size is between the competitions Min and Max team sizes otherwise let user know
                    if (teamSize >= model.Competition.TeamSizeMin && teamSize <= model.Competition.TeamSizeMax)
                    {
                        if (model.TeamName == "" || model.TeamName == null)
                        {
                            model.TeamName = user.details.FirstName + " " + user.details.LastName + "'s team";
                        }
                        if (model.ManagerParticipation)
                        {     //Manager competing
                            if (participants + model.TeamMembers.Length + 1 <= comp.EntryCapacity)
                            { //Competition not full
                                List <TeamMember> members = new List <TeamMember>();
                                foreach (String s in model.TeamMembers)
                                {
                                    members.Add(new TeamMember {
                                        MemberName = s
                                    });
                                }

                                team = new Team
                                {
                                    ManagerID            = user.Id,
                                    TeamName             = model.TeamName,
                                    TeamMembers          = members,
                                    ManagerParticipation = model.ManagerParticipation
                                };
                            }
                            else
                            { //Competition full
                                TempData["modal"] = "This competition only has room for " + (comp.EntryCapacity - participants) + "participants. You tried to add: " + (model.TeamMembers.Length + 1);
                                return(View(model));
                            }
                        }
                        else
                        {     //Manager not competing
                            if (participants + model.TeamMembers.Length + 1 <= comp.EntryCapacity)
                            { //Competition not full
                                List <TeamMember> members = new List <TeamMember>();
                                foreach (String s in model.TeamMembers)
                                {
                                    members.Add(new TeamMember {
                                        MemberName = s
                                    });
                                }

                                team = new Team
                                {
                                    ManagerID            = user.Id,
                                    TeamName             = model.TeamName,
                                    TeamMembers          = members,
                                    ManagerParticipation = model.ManagerParticipation
                                };
                            }
                            else
                            { //Competition full
                                TempData["modal"] = "This competition only has room for " + (comp.EntryCapacity - participants) + "participants.You tried to add: " + model.TeamMembers.Length;
                                return(View(model));
                            }
                        }
                        //team will never be null here but check anyway
                        if (team != null)
                        {
                            comp.Teams.Add(team);
                            await _context.SaveChangesAsync();

                            TempData["modal"] = "Successfully joined competition.";
                        }
                        else
                        {
                            TempData["modal"] = "Unknown error occured please try again.";
                        }

                        return(RedirectToLocal(returnUrl));
                    }
                    else
                    {
                        ModelState.AddModelError("TeamMembers", "Invalid amount of team members added. Please review competition min and max team sizes");
                        return(View(model));
                    }
                }
                if (team != null)
                {
                    comp.Teams.Add(team);
                    await _context.SaveChangesAsync();

                    TempData["modal"] = "Successfully joined competition.";
                }
                else
                { //They entered no team members
                    ModelState.AddModelError("TeamMembers", "Invalid amount of team members added. Please review competition min and max team sizes");
                    return(View(model));
                }

                return(RedirectToLocal(returnUrl));
            }
            else
            {
                return(View(model));
            }
        }