using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using NzbDrone.Core;
using NzbDrone.Core.Providers;
using NzbDrone.Core.Repository;
using NzbDrone.Web.Models;

namespace NzbDrone.Web.Controllers
{
    public class UpcomingController : Controller
    {
        private readonly UpcomingEpisodesProvider _upcomingEpisodesProvider;

        public UpcomingController(UpcomingEpisodesProvider upcomingEpisodesProvider)
        {
            _upcomingEpisodesProvider = upcomingEpisodesProvider;
        }

        //
        // GET: /Upcoming/

        public ActionResult Index()
        {
            var upcomingEpisodes = GetUpcomingEpisodeModels(_upcomingEpisodesProvider.UpcomingEpisodes());


            var upcoming = new UpcomingEpisodesModel
                               {
                                   Yesterday = upcomingEpisodes.Where(e => e.AirDateTime.Date == DateTime.Today.AddDays(-1)).ToList(),
                                   Today = upcomingEpisodes.Where(e => e.AirDateTime.Date == DateTime.Today).ToList(),
                                   Tomorrow = upcomingEpisodes.Where(e => e.AirDateTime.Date == DateTime.Today.AddDays(1)).ToList(),
                                   TwoDays = upcomingEpisodes.Where(e => e.AirDateTime.Date == DateTime.Today.AddDays(2)).ToList(),
                                   ThreeDays = upcomingEpisodes.Where(e => e.AirDateTime.Date == DateTime.Today.AddDays(3)).ToList(),
                                   FourDays = upcomingEpisodes.Where(e => e.AirDateTime.Date == DateTime.Today.AddDays(4)).ToList(),
                                   FiveDays = upcomingEpisodes.Where(e => e.AirDateTime.Date == DateTime.Today.AddDays(5)).ToList(),
                                   SixDays = upcomingEpisodes.Where(e => e.AirDateTime.Date == DateTime.Today.AddDays(6)).ToList(),
                                   Later = upcomingEpisodes.Where(e => e.AirDateTime.Date >= DateTime.Today.AddDays(7)).ToList()
                               };
            
            return View(upcoming);
        }

        private List<UpcomingEpisodeModel> GetUpcomingEpisodeModels(List<Episode> episodes)
        {
            return episodes.Select(u => new UpcomingEpisodeModel
            {
                SeriesId = u.Series.SeriesId,
                EpisodeId = u.EpisodeId,
                SeriesTitle = u.Series.Title,
                EpisodeNumbering = String.Format("{0}x{1:00}", u.SeasonNumber, u.EpisodeNumber),
                Title = u.Title,
                Overview = u.Overview,
                AirDateTime = GetDateTime(u.AirDate.Value, u.Series.AirTimes),
                AirDate = u.AirDate.Value.ToBestDateString(),
                AirTime = String.IsNullOrEmpty(u.Series.AirTimes) ? "?" : Convert.ToDateTime(u.Series.AirTimes).ToShortTimeString(),
                Status = u.Status.ToString()
            }).OrderBy(e => e.AirDateTime).ToList();
        }

        private DateTime GetDateTime(DateTime airDate, string airTime)
        {
            if (String.IsNullOrWhiteSpace(airTime))
                return airDate;

            return airDate.Add(Convert.ToDateTime(airTime).TimeOfDay);
        }
    }
}