public JsonResult CreateMatch([DataSourceRequest] DataSourceRequest request, MatchViewModel match)
        {
            if (match != null && ModelState.IsValid)
            {
                var hostTeam = this.Data.Teams.All().FirstOrDefault(x => x.Name == match.Host);
                var visitorTeam = this.Data.Teams.All().FirstOrDefault(x => x.Name == match.Visitor);
                var gameweek = this.Data.Gameweeks.All().FirstOrDefault(g => g.Name == match.Gameweek);
                var matchExists = this.Data.Matches.All().FirstOrDefault(m => m.Host.Name == match.Host &&
                    m.Visitor.Name == match.Visitor);

                if (matchExists == null)
                {
                    var newMatch = new Match
                    {
                        Host = hostTeam,
                        Visitor = visitorTeam,
                        HostScore = match.HostScore,
                        VistorScore = match.VisitorScore,
                        Gameweek = gameweek,
                        MatchDate = match.MatchDate
                    };

                    this.Data.Matches.Add(newMatch);
                    this.Data.SaveChanges();
                }
                match.Id = match.Id;
            }

            return Json(new[] { match }.ToDataSourceResult(request, ModelState), JsonRequestBehavior.AllowGet);
        }
        public JsonResult EditMatch([DataSourceRequest] DataSourceRequest request, MatchViewModel match)
        {
            var editedMatch = this.Data.Matches.GetById(match.Id);
            var hostTeam = this.Data.Teams.All().FirstOrDefault(x => x.Name == match.Host);
            var visitorTeam = this.Data.Teams.All().FirstOrDefault(x => x.Name == match.Visitor);
            var gameweek = this.Data.Gameweeks.All().FirstOrDefault(g => g.Name == match.Gameweek);

            editedMatch.Gameweek = gameweek;
            editedMatch.Host = hostTeam;
            editedMatch.Visitor = visitorTeam;
            editedMatch.HostScore = match.HostScore;
            editedMatch.VistorScore = match.VisitorScore;
            editedMatch.MatchDate = match.MatchDate;

            this.Data.SaveChanges();

            return Json(new[] { match }.ToDataSourceResult(request), JsonRequestBehavior.AllowGet);
        }
        public JsonResult DeleteMatch([DataSourceRequest] DataSourceRequest request, MatchViewModel match)
        {
            var deletedMatch = this.Data.Matches.GetById(match.Id);

            this.Data.Matches.Delete(deletedMatch);
            this.Data.SaveChanges();

            return Json(new[] { match }.ToDataSourceResult(request), JsonRequestBehavior.AllowGet);
        }
        private Match AddOrUpdateMatch(MatchViewModel matchModel)
        {
            var matchExists = data.Matches.All()
                .FirstOrDefault(m => (m.Host.Name.Contains(matchModel.Host)) &&
                    (m.Visitor.Name.Contains(matchModel.Visitor)));

            var hostTeam = data.Teams.All().FirstOrDefault(x => x.Name.Contains(matchModel.Host));
            var visitorTeam = data.Teams.All().FirstOrDefault(x => x.Name.Contains(matchModel.Visitor));
            if (hostTeam == null || visitorTeam == null)
            {
                return null;
            }

            var gameweekEntity = AddOrUpdateGameweek(matchModel);

            if (matchExists == null)
            {
                var newMatch = new Match()
                {
                    Gameweek = gameweekEntity,
                    Host = hostTeam,
                    Visitor = visitorTeam,
                    HostScore = matchModel.HostScore,
                    VistorScore = matchModel.VisitorScore,
                    MatchDate = matchModel.MatchDate
                };

                data.Matches.Add(newMatch);
                return newMatch;
            }
            else
            {
                matchExists.HostScore = matchModel.HostScore;
                matchExists.VistorScore = matchModel.VisitorScore;
                matchExists.MatchDate = matchModel.MatchDate;
                matchExists.Gameweek = gameweekEntity;

                return matchExists;
            }
        }
        private Gameweek AddOrUpdateGameweek(MatchViewModel matchModel)
        {
            var gameweek = data.Gameweeks.All().FirstOrDefault(g => g.Name == matchModel.Gameweek);

            int gamewekIndex = matchModel.Gameweek.LastIndexOf(' ');
            int gameweekNumber = int.Parse(matchModel.Gameweek.Substring(gamewekIndex + 1));
            var previousGameweek = data.Gameweeks.GetById(gameweekNumber - 1);
            if (previousGameweek != null)
            {
                startDate = previousGameweek.EndDate;
            }

            if (gameweek == null)
            {
                var newGameweek = new Gameweek()
                {
                    Id = gameweekNumber,
                    Name = matchModel.Gameweek,
                    StartDate = startDate,
                    EndDate = matchModel.MatchDate.AddDays(1)
                };

                data.Gameweeks.Add(newGameweek);
                data.SaveChanges();
                gameweek = data.Gameweeks.GetById(newGameweek.Id);
            }
            else
            {
                gameweek.StartDate = startDate;
                gameweek.EndDate = matchModel.MatchDate.AddDays(1);
            }

            return gameweek;
        }
        public void UpdateFixtures(List<string> fixtures)
        {
            startDate = startSeason;
            List<Match> gameweekMatches = new List<Match>();
            string gameweek = fixtures[0];
            for (int i = 1; i < fixtures.Count; i += 4)
            {
                string[] dateParts = fixtures[i].Split(' ');
                string dateAsString = string.Format("{0} {1} {2} {3}", dateParts[0], dateParts[1], startSeason.Year, dateParts[2]);
                DateTime matchDate = DateTime.ParseExact(dateAsString, "dd MMM yyyy HH:mm", CultureInfo.InvariantCulture);
                matchDate = matchDate < startDate ? matchDate.AddYears(1) : matchDate;
                string host = ConvertTeamName(fixtures[i + 1]);
                string visitor = ConvertTeamName(fixtures[i + 3]);

                var matchModel = new MatchViewModel()
                {
                    Host = host,
                    Visitor = visitor,
                    Gameweek = gameweek,
                    MatchDate = matchDate
                };
                if (fixtures[i + 2] != "v")
                {
                    string[] result = fixtures[i + 2].Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries);
                    matchModel.HostScore = int.Parse(result[0]);
                    matchModel.VisitorScore = int.Parse(result[1]);
                }

                Match match = AddOrUpdateMatch(matchModel);
                if (match != null)
                {
                    this.data.SaveChanges();
                    gameweekMatches.Add(match);
                }
            }

            Gameweek currentGameweek = data.Gameweeks.All().FirstOrDefault(g => g.Name == gameweek);
            List<int> gameweekMatchesIds = gameweekMatches.Select(g => g.Id).ToList();
            data.Matches.DeleteRange(m => m.GameweekId == currentGameweek.Id && !gameweekMatchesIds.Contains(m.Id));

            data.SaveChanges();
        }