private Tgvs BestTgv(IEnumerable <Tgvs> tgvs, TimeSpan time)
        {
            Tgvs bestTgv = null;

            foreach (Tgvs tgv in tgvs)
            {
                if ((bestTgv == null && tgv.TimeOfDeparture.CompareTo(time) >= 0) || (bestTgv != null && tgv.TimeOfDeparture.CompareTo(bestTgv.TimeOfDeparture) < 0))
                {
                    bestTgv = tgv;
                }
            }

            return(bestTgv);
        }
        private Tgvs EarliestTgv(IEnumerable <Tgvs> tgvs)
        {
            TimeSpan earliestTime = new TimeSpan(24, 0, 0);
            Tgvs     earliestTgv  = null;

            foreach (Tgvs t in tgvs)
            {
                if (earliestTime.CompareTo(t.TimeOfDeparture) > 0)
                {
                    earliestTgv  = t;
                    earliestTime = t.TimeOfDeparture;
                }
            }

            return(earliestTgv);
        }
        public IList <Tgvs> GetJourney(int departureId, int destinationId, DateTime dateOfDeparture)
        {
            IList <Lines> route = lineService.GetRoute(departureId, destinationId);

            IList <Tgvs> journey = new List <Tgvs>();

            TimeSpan fullDay = new TimeSpan(24, 0, 0);

            foreach (Lines l in route)
            {
                Tgvs tgv = GetJourney(l, dateOfDeparture);
                tgv.LineNavigation = l;
                journey.Add(tgv);

                dateOfDeparture = dateOfDeparture.Date.Add(tgv.TimeOfDeparture.Add(tgv.LineNavigation.Duration));
            }

            return(journey);
        }
        public Tgvs GetJourney(Lines line, DateTime dateOfDeparture)
        {
            IEnumerable <Tgvs> tgvs = GetWithLine(line.Id);
            Tgvs bestTgv            = BestTgv(tgvs, dateOfDeparture.TimeOfDay);

            if (bestTgv == null)
            {
                return(EarliestTgv(tgvs));
            }

            IEnumerable <HolidayPeriods> holidayPeriods = holidayPeriodService.All();

            foreach (HolidayPeriods h in holidayPeriods)
            {
                if (h.StartDate.CompareTo(dateOfDeparture) <= 0 && h.EndDate.CompareTo(dateOfDeparture) >= 0)
                {
                    bestTgv.AvailableBusinessSeats = (int)(bestTgv.AvailableBusinessSeats * (1 + h.ExtraSeatsPercent));
                    bestTgv.AvailableEconomicSeats = (int)(bestTgv.AvailableEconomicSeats * (1 + h.ExtraSeatsPercent));
                    bestTgv.BasePriceBusiness     *= 1 + h.ExtraPricePercent;
                    bestTgv.BasePriceEconomic     *= 1 + h.ExtraPricePercent;
                }
            }

            IEnumerable <Tickets> tickets = ticketDAO.AllForTGV(bestTgv.Id, dateOfDeparture);

            foreach (Tickets t in tickets)
            {
                if (t.IsCancelled == 0)
                {
                    if (t.IsBusiness == 0)
                    {
                        bestTgv.AvailableBusinessSeats--;
                    }
                    else
                    {
                        bestTgv.AvailableEconomicSeats--;
                    }
                }
            }

            return(bestTgv);
        }