using System;
using System.Web.Hosting;
using Hangfire;
using Microsoft.Owin;
using MileageTraker.Web;
using MileageTraker.Web.Email;
using Owin;

[assembly: OwinStartup(typeof (Startup))]

namespace MileageTraker.Web
{
	public class Startup
	{
		public void Configuration(IAppBuilder app)
		{
			app.UseHangfireDashboard();

			SetupRecurringJobs();
		}

		private void SetupRecurringJobs()
		{
			RecurringJob.AddOrUpdate<ServiceReminderEmailService>(
				"serviceReminderJob", s => s.SendAllNotificationEmails(), Cron.Weekly(DayOfWeek.Monday, 6));
		}
	}

	// http://docs.hangfire.io/en/latest/deployment-to-production/making-aspnet-app-always-running.html
	public class ApplicationPreload : IProcessHostPreloadClient
	{
		public void Preload(string[] parameters)
		{
			HangfireBootstrapper.Instance.Start();
		}
	}

	public class HangfireBootstrapper : IRegisteredObject
	{
		public static readonly HangfireBootstrapper Instance = new HangfireBootstrapper();

		private readonly object _lockObject = new object();
		private bool _started;

		private BackgroundJobServer _backgroundJobServer;

		private HangfireBootstrapper()
		{
		}

		public void Start()
		{
			lock (_lockObject)
			{
				if (_started) return;
				_started = true;

				HostingEnvironment.RegisterObject(this);

				GlobalConfiguration.Configuration
								   .UseSqlServerStorage("MileageTrakerContext");
				// Specify other options here

				_backgroundJobServer = new BackgroundJobServer();
			}
		}

		public void Stop()
		{
			lock (_lockObject)
			{
				if (_backgroundJobServer != null)
				{
					_backgroundJobServer.Dispose();
				}

				HostingEnvironment.UnregisterObject(this);
			}
		}

		void IRegisteredObject.Stop(bool immediate)
		{
			Stop();
		}
	}
}