public List <GeneratedVictim> GenerateVictimList(List <Victim> victimInputs, GenerateOptions options)
        {
            if (victimInputs.Count == 0)
            {
                return(new List <GeneratedVictim>());
            }

            if (options.Randomize == false)
            {
                return(GroupByDept(victimInputs, options));
            }
            return(RandomizeVictims(victimInputs, options));
        }
        private static DateTime GenerateNextSendOutTime(DateTime currentSendOutTime, GenerateOptions options)
        {
            DateTime potentialNewTime = currentSendOutTime;//.AddMinutes(options.MinutesBetweenScheduledEmails);

            while (
                potentialNewTime.Hour > options.MaximumHour ||                                                     // hour is too high
                potentialNewTime.Hour == options.MaximumHour && potentialNewTime.Minute > options.MaximumMinute || // hour and minute too high
                potentialNewTime.Hour < options.MinimumHour ||                                                     // hour is too small
                potentialNewTime.Hour == options.MinimumHour && potentialNewTime.Minute < options.MinimumMinute)   // hour and minute is too low
            {
                potentialNewTime = potentialNewTime.AddMinutes(options.MinutesBetweenScheduledEmails);
            }

            return(potentialNewTime);
        }
        private List <GeneratedVictim> GroupByDept(List <Victim> victimInputs, GenerateOptions options)
        {
            List <Victim> sortedVictims = victimInputs.OrderBy(p => p.Dept).ThenBy(q => q.Name).ToList();
            DateTime      sendOutTime   = options.StartAtDateTime;

            List <GeneratedVictim> output = new List <GeneratedVictim>();

            foreach (Victim victim in sortedVictims)
            {
                sendOutTime = GenerateNextSendOutTime(sendOutTime, options);

                GeneratedVictim generatedVictim = new GeneratedVictim(victim.Name, victim.Email, sendOutTime, victim.Dept);

                sendOutTime = sendOutTime.AddMinutes(options.MinutesBetweenScheduledEmails);

                output.Add(generatedVictim);
            }

            return(output.OrderBy(p => p.SendOutTime).ToList());
        }
        private List <GeneratedVictim> RandomizeVictims(List <Victim> victimInputs, GenerateOptions options)
        {
            DateTime sendOutTime = options.StartAtDateTime;

            List <GeneratedVictim> output = new List <GeneratedVictim>();

            Console.WriteLine("Shuffling...");
            List <Victim> shuffled = victimInputs.OrderBy(a => Guid.NewGuid()).ToList();

            foreach (Victim victim in shuffled)
            {
                sendOutTime = GenerateNextSendOutTime(sendOutTime, options);

                GeneratedVictim generatedVictim = new GeneratedVictim(victim.Name, victim.Email, sendOutTime, victim.Dept);

                sendOutTime = sendOutTime.AddMinutes(options.MinutesBetweenScheduledEmails);

                output.Add(generatedVictim);
            }

            return(output.OrderBy(p => p.SendOutTime).ToList());
        }