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();
        }