using MediaBrowser.Common.Implementations.Logging;
using MediaBrowser.Model.Logging;
using NLog;
using NLog.Config;
using NLog.Targets;
using System.ComponentModel;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
namespace MediaBrowser.ServerApplication.Logging
{
    /// 
    /// Interaction logic for LogWindow.xaml
    /// 
    public partial class LogWindow : Window
    {
        /// 
        /// The _ui thread
        /// 
        private readonly TaskScheduler _uiThread;
        private readonly ILogManager _logManager;
        /// 
        /// Initializes a new instance of the  class.
        /// 
        /// The kernel.
        public LogWindow(ILogManager logManager)
        {
            InitializeComponent();
            _uiThread = TaskScheduler.FromCurrentSynchronizationContext();
            _logManager = logManager;
            Loaded += LogWindow_Loaded;
        }
        /// 
        /// Handles the Loaded event of the LogWindow control.
        /// 
        /// The source of the event.
        /// The  instance containing the event data.
        void LogWindow_Loaded(object sender, RoutedEventArgs e)
        {
            ((NlogManager)_logManager).RemoveTarget("LogWindowTraceTarget");
            ((NlogManager)_logManager).AddLogTarget(new TraceTarget
            {
                Layout = "${longdate}, ${level}, ${logger}, ${message}",
                Name = "LogWindowTraceTarget"
            }, LogSeverity.Debug);
        }
        /// 
        /// Raises the  event.
        /// 
        /// A  that contains the event data.
        protected override void OnClosing(CancelEventArgs e)
        {
            base.OnClosing(e);
            ((NlogManager) _logManager).RemoveTarget("LogWindowTraceTarget");
        }
        /// 
        /// Logs the message.
        /// 
        /// The MSG.
        public async void LogMessage(string msg)
        {
            await Task.Factory.StartNew(() =>
                                            {
                                                if (lbxLogData.Items.Count > 10000)
                                                {
                                                    //I think the quickest and safest thing to do here is just clear it out
                                                    lbxLogData.Items.Clear();
                                                }
                                                lbxLogData.Items.Insert(0, msg.TrimEnd('\n'));
                                            }, CancellationToken.None, TaskCreationOptions.None, _uiThread);
        }
        /// 
        /// The log layout
        /// 
        /// The log layout.
        public string LogLayout
        {
            get { return "${longdate}, ${level}, ${logger}, ${message}"; }
        }
        /// 
        /// Adds the log target.
        /// 
        /// The target.
        /// The name.
        private void AddLogTarget(Target target, string name)
        {
            var config = NLog.LogManager.Configuration;
            target.Name = name;
            config.AddTarget(name, target);
            var level = LogLevel.Debug;
            var rule = new LoggingRule("*", level, target);
            config.LoggingRules.Add(rule);
            NLog.LogManager.Configuration = config;
        }
        
        /// 
        /// Shuts down.
        /// 
        public async void ShutDown()
        {
            await Task.Factory.StartNew(Close, CancellationToken.None, TaskCreationOptions.None, _uiThread);
        }
    }
}