public async Task <List <DateTime> > GetPossibleMatchDateTimesAsync(GeneratorScheduleOutlines outlines) { return(await Task.Run(() => { var startDateTime = DateTime.Parse(outlines.StartDate); var endDateTime = DateTime.Parse(outlines.EndDate); var list = new List <DateTime>(); while (startDateTime <= endDateTime) { { if (outlines.DaysOfWeek.Contains((int)startDateTime.DayOfWeek)) { for (int i = int.Parse(outlines.StartTime.Split(':')[0]); i <= int.Parse(outlines.EndTime.Split(':')[0]); i++) { for (int j = 0; j < outlines.SimultaneousMatches; j++) { list.Add(new DateTime(startDateTime.Year, startDateTime.Month, startDateTime.Day, i, 0, 0)); } } } } startDateTime = startDateTime.AddDays(1); } return list; })); }
public async Task GenerateScheduleAsync(GeneratorScheduleOutlines outlines) { var matches = await matchRepository.FindAsync(m => m.HomeTeam.TournamentId == outlines.TournamentId && m.GuestTeam.TournamentId == outlines.TournamentId); foreach (var match in matches) { matchRepository.Delete(match); } var possibleMatchDateTimes = await scheduleGeneratorManager.GetPossibleMatchDateTimesAsync(outlines); if (!possibleMatchDateTimes.Any()) { throw new ArgumentOutOfRangeException(); } var teams = await teamRepository.FindAsync(t => t.TournamentId == outlines.TournamentId); if (teams.Count < 2) { throw new NotFoundInDatabaseException(); } var matchDict = await scheduleGeneratorManager.GetPossibleMatchMatrix(teams.ToList()); var tournament = await tournamentRepository.FindSingleAsync(t => t.TournamentId == outlines.TournamentId); var generatedMatchesList = await scheduleGeneratorManager.GenerateSchedule(tournament.IsBracket, possibleMatchDateTimes, matchDict); generatedMatchesList.ForEach(gm => matchRepository.Add(gm)); await unitOfWork.CompleteAsync(); }