using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using System;
using System.Collections.Generic;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace MediaBrowser.ServerApplication.Controls
{
    /// 
    /// Interaction logic for ItemUpdateNotification.xaml
    /// 
    public partial class ItemUpdateNotification : UserControl
    {
        /// 
        /// The logger
        /// 
        private readonly ILogger Logger;
        /// 
        /// Gets the children changed event args.
        /// 
        /// The children changed event args.
        private BaseItem Item
        {
            get { return DataContext as BaseItem; }
        }
        /// 
        /// Initializes a new instance of the  class.
        /// 
        public ItemUpdateNotification(ILogger logger)
        {
            if (logger == null)
            {
                throw new ArgumentNullException("logger");
            }
            Logger = logger;
            
            InitializeComponent();
            Loaded += ItemUpdateNotification_Loaded;
        }
        /// 
        /// Handles the Loaded event of the ItemUpdateNotification control.
        /// 
        /// The source of the event.
        /// The  instance containing the event data.
        void ItemUpdateNotification_Loaded(object sender, RoutedEventArgs e)
        {
            DisplayItem(Item);
        }
        /// 
        /// Gets the display name.
        /// 
        /// The item.
        /// if set to true [include parent name].
        /// System.String.
        internal static string GetDisplayName(BaseItem item, bool includeParentName)
        {
            var name = item.Name;
            if (item.ProductionYear.HasValue && !(item is Episode))
            {
                name += string.Format(" ({0})", item.ProductionYear);
            }
            var episode = item as Episode;
            if (episode != null)
            {
                var indexNumbers = new List();
                if (episode.Season.IndexNumber.HasValue)
                {
                    indexNumbers.Add(episode.Season.IndexNumber.Value);
                }
                if (episode.IndexNumber.HasValue)
                {
                    indexNumbers.Add(episode.IndexNumber.Value);
                }
                var indexNumber = string.Join(".", indexNumbers.ToArray());
                name = string.Format("{0} - {1}", indexNumber, name);
                if (includeParentName)
                {
                    name = episode.Series.Name + " - " + name;
                }
            }
            if (includeParentName)
            {
                var season = item as Season;
                if (season != null)
                {
                    name = season.Series.Name + " - " + name;
                }
            }
            return name;
        }
        /// 
        /// Displays the parent title.
        /// 
        /// The item.
        private void DisplayParentTitle(BaseItem item)
        {
            if (!(item is Episode || item is Season))
            {
                txtParentName.Visibility = Visibility.Collapsed;
                imgParentLogo.Visibility = Visibility.Collapsed;
                return;
            }
            var series = item is Episode ? (item as Episode).Series : (item as Season).Series;
            var logo = series.GetImage(ImageType.Logo);
            if (string.IsNullOrEmpty(logo))
            {
                imgParentLogo.Visibility = Visibility.Collapsed;
                txtParentName.Visibility = Visibility.Visible;
            }
            else
            {
                imgParentLogo.Visibility = Visibility.Visible;
                txtParentName.Visibility = Visibility.Collapsed;
                imgParentLogo.Source = App.Instance.GetBitmapImage(logo);
            }
            txtParentName.Text = series.Name;
        }
        /// 
        /// Displays the title.
        /// 
        /// The item.
        private void DisplayTitle(BaseItem item)
        {
            txtName.Text = GetDisplayName(item, false);
        }
        /// 
        /// Displays the item.
        /// 
        /// The item.
        private void DisplayItem(BaseItem item)
        {
            DisplayParentTitle(item);
            DisplayTitle(item);
            DisplayRating(item);
            var path = MultiItemUpdateNotification.GetImagePath(item);
            if (string.IsNullOrEmpty(path))
            {
                img.Visibility = Visibility.Collapsed;
            }
            else
            {
                img.Visibility = Visibility.Visible;
                try
                {
                    img.Source = App.Instance.GetBitmapImage(path);
                }
                catch (FileNotFoundException)
                {
                    Logger.Error("Image file not found {0}", path);
                }
            }
            if (string.IsNullOrEmpty(item.Overview))
            {
                txtOverview.Visibility = Visibility.Collapsed;
            }
            else
            {
                txtOverview.Visibility = Visibility.Visible;
                txtOverview.Text = item.Overview;
            }
            if (item.Taglines == null || item.Taglines.Count == 0)
            {
                txtTagline.Visibility = Visibility.Collapsed;
            }
            else
            {
                txtTagline.Visibility = Visibility.Visible;
                txtTagline.Text = item.Taglines[0];
            }
            if (!item.PremiereDate.HasValue)
            {
                txtPremeireDate.Visibility = Visibility.Collapsed;
            }
            else
            {
                txtPremeireDate.Visibility = Visibility.Visible;
                txtPremeireDate.Text = "Premiered " + item.PremiereDate.Value.ToShortDateString();
            }
        }
        /// 
        /// Displays the rating.
        /// 
        /// The item.
        private void DisplayRating(BaseItem item)
        {
            if (!item.CommunityRating.HasValue)
            {
                pnlRating.Visibility = Visibility.Collapsed;
                return;
            }
            pnlRating.Children.Clear();
            pnlRating.Visibility = Visibility.Visible;
            var rating = item.CommunityRating.Value;
            for (var i = 0; i < 10; i++)
            {
                Image image;
                if (rating < i - 1)
                {
                    image = App.Instance.GetImage(new Uri("../Resources/Images/starEmpty.png", UriKind.Relative));
                }
                else if (rating < i)
                {
                    image = App.Instance.GetImage(new Uri("../Resources/Images/starHalf.png", UriKind.Relative));
                }
                else
                {
                    image = App.Instance.GetImage(new Uri("../Resources/Images/starFull.png", UriKind.Relative));
                }
                RenderOptions.SetBitmapScalingMode(image, BitmapScalingMode.Fant);
                image.Stretch = Stretch.Uniform;
                image.Height = 16;
                pnlRating.Children.Add(image);
            }
        }
    }
}