using System;
using System.Collections.Generic;
using Marr.Data;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Datastore;
using NzbDrone.Core.MediaFiles;

namespace NzbDrone.Core.Tv
{
    public class Episode : ModelBase, IComparable
    {
        public Episode()
        {
            Images = new List<MediaCover.MediaCover>();
        }

        public const string AIR_DATE_FORMAT = "yyyy-MM-dd";

        public int SeriesId { get; set; }
        public int EpisodeFileId { get; set; }
        public int SeasonNumber { get; set; }
        public int EpisodeNumber { get; set; }
        public string Title { get; set; }
        public string AirDate { get; set; }
        public DateTime? AirDateUtc { get; set; }
        public string Overview { get; set; }
        public bool Monitored { get; set; }
        public int? AbsoluteEpisodeNumber { get; set; }
        public int? SceneAbsoluteEpisodeNumber { get; set; }
        public int? SceneSeasonNumber { get; set; }
        public int? SceneEpisodeNumber { get; set; }
        public int? AiredAfterSeasonNumber { get; set; }
        public int? AiredBeforeSeasonNumber { get; set; }
        public int? AiredBeforeEpisodeNumber { get; set; }
        public bool UnverifiedSceneNumbering { get; set; }
        public Ratings Ratings { get; set; }
        public List<MediaCover.MediaCover> Images { get; set; }
        public DateTime? LastSearchTime { get; set; }

        public string SeriesTitle { get; private set; }

        public LazyLoaded<EpisodeFile> EpisodeFile { get; set; }

        public Series Series { get; set; }

        public bool HasFile => EpisodeFileId > 0;

        public override string ToString()
        {
            return string.Format("[{0}]{1}", Id, Title.NullSafe());
        }

        public int CompareTo(object obj)
        {
            var other = (Episode)obj;

            if (SeasonNumber > other.SeasonNumber)
            {
                return 1;
            }

            if (SeasonNumber < other.SeasonNumber)
            {
                return -1;
            }

            if (EpisodeNumber > other.EpisodeNumber)
            {
                return 1;
            }

            if (EpisodeNumber < other.EpisodeNumber)
            {
                return -1;
            }

            return 0;
        }
    }
}
