public class CaseMonitor 
{
	private readonly HostSettings _settings;
	private readonly ILogger _logger;
	private readonly ISystemTime _systemTime;
	private readonly IModelBuilder<RecentCaseModel> _caseModelBuilder;
	private DateTime _lastPolled;
	private TimeSpan _interval;
	private Timer _timer;
	private IDisposable _loggingContext;

	public CaseMonitor(HostSettings settings,  ILogger logger, ISystemTime systemTime, IModelBuilder<RecentCaseModel> caseModelBuilder)
	{
		_settings = settings;
		_logger = logger;
		_systemTime = systemTime;
		_caseModelBuilder = caseModelBuilder;
		_interval = TimeSpan.FromSeconds(15);
		_lastPolled = systemTime.Now.Subtract(_interval);
	}

	public bool Start()
	{
		//The logging context will have the instance of this windows service just in case there are multiple services. 
		//This is done just to show a scenario for consuming the host settings object we get from Topshelf.
		_loggingContext = _logger.Push(_settings.InstanceName);

		//create a timer in charge of doing the recurreing polling for open cases
		_timer = new Timer(_interval.TotalMilliseconds);
		_timer.Elapsed += pollForOpenCases;
		_timer.Start();

		return true;
	}
		
	private void pollForOpenCases(object sender, ElapsedEventArgs elapsedEventArgs)
	{
		var from = _lastPolled;
		var to = _systemTime.Now;

		//using a ModelMap to project cases created between the last poll and now
		var cases = _caseModelBuilder.Get(f => f.Between("creation_time", from, to));
			
		_logger.LogInfo("{0} cases were created in the last {1} seconds", cases.Length, to.Subtract(from).TotalSeconds);

		foreach (var kase in cases)
		{
			//the debug log will have more details
			_logger.LogDebug(kase.ToString());
		}

		_lastPolled = to;
	}

	public bool Stop()
	{
		_timer.Stop();
		_loggingContext.Dispose();
		return true;
	}
}