using System.Linq;
using System;
using System.Diagnostics;
using System.Threading;
using NLog;
using NzbDrone.Common;

namespace NzbDrone
{
    public class PriorityMonitor
    {
        private readonly IProcessProvider _processProvider;
        private readonly Logger _logger;

        private Timer _processPriorityCheckTimer;

        public PriorityMonitor(IProcessProvider processProvider, Logger logger)
        {
            _processProvider = processProvider;
            _logger = logger;
        }

        public void Start()
        {
            _processPriorityCheckTimer = new Timer(EnsurePriority);
            _processPriorityCheckTimer.Change(TimeSpan.FromSeconds(15), TimeSpan.FromMinutes(30));

        }

        public virtual void EnsurePriority(object sender)
        {
            try
            {
                var currentProcess = _processProvider.GetCurrentProcess();
                if (currentProcess.Priority != ProcessPriorityClass.Normal)
                {
                    _processProvider.SetPriority(currentProcess.Id, ProcessPriorityClass.Normal);
                }

                var iisProcess = _processProvider.GetProcessById(_processProvider.GetCurrentProcess().Id);
                if (iisProcess != null && iisProcess.Priority != ProcessPriorityClass.Normal &&
                    iisProcess.Priority != ProcessPriorityClass.AboveNormal)
                {
                    _processProvider.SetPriority(iisProcess.Id, ProcessPriorityClass.Normal);
                }
            }
            catch (Exception e)
            {
                _logger.WarnException("Unable to verify priority", e);
            }
        }
    }
}