public List<IContent> GetContents(Newsletter newsletter)
        {
            var hostIndex = 0;
            var tripIndex = 0;
            var contents =new List<IContent>();

            foreach (var contentType in newsletter.DisplayPattern.ToCharArray())
            {
                IContent content = null;
                switch (contentType)
                {
                    case 'H':
                        if (hostIndex >= newsletter.HostIds.Count)
                            continue;
                        content = _database.Get<Host>(newsletter.HostIds[hostIndex]);
                        hostIndex++;
                        break;
                    case 'T':
                        if (tripIndex >= newsletter.TripIds.Count)
                            continue;
                        content = _database.Get<Trip>(newsletter.TripIds[tripIndex]);
                        tripIndex++;
                        break;
                }
                contents.Add(content);
            }
            return contents;
        }
        public ActionResult Create(int count)
        {
            var db = GetDatabase();
            // [YOGESH] - Fetch the TripHostOrder setting from the DB.
            var tripHostOrder = db.GetAll<Settings>().Select(h => h.TripHostOrder).FirstOrDefault();
            // [YOGESH] - Count the number of Trips and Hosts for the newsletter.
            int countT = tripHostOrder.ToCharArray().Where(m => m.Equals('T')).Count();
            int countH = tripHostOrder.ToCharArray().Where(m => m.Equals('H')).Count();

            #region [YOGESH] - For tasks 1 & 2
            var hosts = db.GetAll<Host>().OrderBy(m => m.UseCount).ToList();
            var trips = db.GetAll<Trip>().OrderBy(m => m.UseCount).ToList();
            for (int i = 0; i < count; i++)
            {
                var newsletter = new Newsletter()
                {
                    HostIds = hosts.Select(h => h.Id).Take(countH).ToList(),
                    TripIds = trips.Select(t => t.Id).Take(countT).ToList(),
                    // [YOGESH] - Assign the TripHostOrder setting value to the TripHostOrder property of the Newsletter.
                    TripHostOrder = tripHostOrder
                };
                db.Save(newsletter);
                for (int j = 0; j < countH; j++)
                {
                    hosts[j].UseCount++;
                }
                hosts = hosts.OrderBy(m => m.UseCount).ToList();
                for (int j = 0; j < countT; j++)
                {
                    trips[j].UseCount++;
                }
                trips = trips.OrderBy(m => m.UseCount).ToList();
            }
            db.SaveAll(hosts);
            db.SaveAll(trips);
            #endregion

            #region [YOGESH] - For task 1 only
            //var hostIds = db.GetAll<Host>().Select(h => h.Id).ToArray();
            //var tripIds = db.GetAll<Trip>().Select(t => t.Id).ToArray();

            //for (int i = 0; i < count; i++)
            //{
            //    var newsletter = new Newsletter()
            //    {
            //        HostIds = Enumerable.Range(0, countH).Select(x => hostIds.GetRandom()).ToList(),
            //        TripIds = Enumerable.Range(0, countT).Select(x => tripIds.GetRandom()).ToList(),
            //        // [YOGESH] - Assign the TripHostOrder setting value to the TripHostOrder property of the Newsletter.
            //        TripHostOrder = tripHostOrder
            //    };

            //    db.Save(newsletter);
            //}
            #endregion

            TempData["notification"] = $"Created {count} newsletters";

            return RedirectToAction("list");
        }
        public void GetContents_WhenNotExistEnoughHostInList_ReturnRestOfContents()
        {
            // Arrange
            var newsletter = new Newsletter
            {
                Id = "0001",
                DisplayPattern = "HHTTHH",
                HostIds = new List<string> { "0000"},
                TripIds = new List<string> { "0000", "0001", "0002", "0003", "0004" }
            };

            // Act
            var result = _newsletterService.GetContents(newsletter);

            // Assert
            Assert.That(result.Count, Is.EqualTo(3));
        }
 public void GetContents_WhenNewsletterWithPattern_ReturnContents()
 {
     // Arrange
     var newsletter = new Newsletter
     {
         Id = "0001",
         DisplayPattern = "HHTTHH",
         HostIds = new List<string> {"0000", "0001", "0002", "0003", "0004" },
         TripIds = new List<string> { "0000","0001","0002", "0003", "0004" }
     };
     
     // Act
     var result = _newsletterService.GetContents(newsletter);
     
     // Assert
     Assert.That(result.Count, Is.EqualTo(newsletter.DisplayPattern.Length));
 }
        public void CreateRandomData(int count, string pattern)
        {
            var hostIds = _database.GetAll<Host>().Select(h => h.Id).ToArray();
            var tripIds = _database.GetAll<Trip>().Select(t => t.Id).ToArray();

            var hostCount = pattern.ToCharArray().Where(x => x.Equals('H')).Count();
            var tripCount = pattern.ToCharArray().Where(x => x.Equals('T')).Count();
            for (int i = 0; i < count; i++)
            {
                var newsletter = new Newsletter()
                {
                    HostIds = Enumerable.Range(0, hostCount).Select(x => hostIds.GetRandom()).ToList(),
                    TripIds = Enumerable.Range(0, tripCount).Select(x => tripIds.GetRandom()).ToList(),
                };

                newsletter.DisplayPattern = pattern;
                _database.Save(newsletter);
            }
        }
        public ActionResult Create(int count)
        {
            var db = GetDatabase();

            var hostIds = db.GetAll<Host>().Select(h => h.Id).ToArray();
            var tripIds = db.GetAll<Trip>().Select(t => t.Id).ToArray();

            for (int i = 0; i < count; i++)
            {
                var newsletter = new Newsletter()
                {
                    HostIds = Enumerable.Range(0, 2).Select(x => hostIds.GetRandom()).ToList(),
                    TripIds = Enumerable.Range(0, 2).Select(x => tripIds.GetRandom()).ToList(),
                };

                db.Save(newsletter);
            }

            TempData["notification"] = $"Created {count} newsletters";

            return RedirectToAction("list");
        }
        public void GetContents_WhenPatternIsEmpty_ReturnEmptyValue()
        {
            // Arrange
            var newsletter = new Newsletter
            {
                Id = "0000",
                DisplayPattern = ""
            };

            // Act
            var result = _newsletterService.GetContents(newsletter);

            // Assert
            Assert.That(result, Is.Empty);
        }