using System;
using LeafWeb.Core.Entities;
using LeafWeb.Core.Remote;
using LeafWeb.WebCms.App_Start;

namespace LeafWeb.WebCms.Services.PiscalQueue
{
	public abstract class PiscalQueueWorker : PiscalQueueBase
	{
		public void DoWork(int leafInputId)
		{
			LeafInput leafInput = null;
			try
			{
				leafInput = DataService.GetLeafInput(leafInputId);
				DoWorkInternal(leafInput);
			}
			catch (PiscalClientException ex)
			{
				PiscalExceptionHandler(ex, leafInput);

				// signal to process next item
				HangfireStartup.TriggerPiscalProcessQueue();
			}
			catch (Exception ex)
			{
				var errorMessage = FormatException(ex);
				Logger.Error(errorMessage);
				throw; // this will retry via HangFire
			}
		}

		protected abstract void DoWorkInternal(LeafInput leafInputId);
	}
}