/// <summary>
        /// Get the cron expression from the recurring options
        /// </summary>
        /// <param name="recurringOptions"></param>
        /// <returns></returns>
        private string GetCronExpression(RecurringOption recurringOptions)
        {
            var cronExpression = string.Empty;

            recurringOptions.Day = recurringOptions.Day == 0 ? 1 : recurringOptions.Day;

            switch (recurringOptions.Recurrence)
            {
            case Recurrence.Daily:
                cronExpression = Cron.Daily(recurringOptions.Hour, recurringOptions.Minute);
                break;

            case Recurrence.Hourly:
                cronExpression = Cron.Hourly(recurringOptions.Minute);
                break;

            case Recurrence.Minutely:
                cronExpression = Cron.Minutely();
                break;

            case Recurrence.Monthly:
                cronExpression = Cron.Monthly(recurringOptions.Day, recurringOptions.Hour, recurringOptions.Minute);
                break;

            case Recurrence.Weekly:
                cronExpression = Cron.Weekly(recurringOptions.DayOfWeek, recurringOptions.Hour, recurringOptions.Minute);
                break;

            case Recurrence.Yearly:
                cronExpression = Cron.Yearly(recurringOptions.Month, recurringOptions.Day, recurringOptions.Hour, recurringOptions.Minute);
                break;
            }

            return(cronExpression);
        }
 /// <summary>
 /// TODO https://github.com/AndcultureCode/AndcultureCode.CSharp.Core/issues/39
 /// </summary>
 /// <param name="id"></param>
 /// <param name="methodCall"></param>
 /// <param name="recurringOptions"></param>
 /// <typeparam name="T"></typeparam>
 public abstract void Recur <T>(string id, Expression <Action <T> > methodCall, RecurringOption recurringOptions);
        // TODO: Not using so commenting out for now to reduce dependencies.
        // public override Result<IJobDetails> GetJob(string id)
        // {
        //     var result = new Result<IJobDetails>();

        //     try
        //     {
        //         var monitor = JobStorage.Current.GetMonitoringApi();
        //         var details = monitor.JobDetails(id);
        //         if (details == null)
        //         {
        //             result.AddError(ErrorType.Error, "GetJob", $"Job id '{id}' does not exist");
        //             return result;
        //         }

        //         result.ResultObject = new JobDetails
        //         {
        //             CreatedAt  = details.CreatedAt,
        //             ExpireAt   = details.ExpireAt,
        //             Properties = details.Properties
        //         };
        //     }
        //     catch (Exception ex)
        //     {
        //         result.AddError(ErrorType.Error, "GetJob", ex.Message);
        //     }

        //     return result;
        // }

        // TODO: Not using so commenting out for now to reduce dependencies.
        // public override Result<IRecurringJobDetails> GetRecurringJob(string id)
        // {
        //     var result = new Result<IRecurringJobDetails>();

        //     try
        //     {
        //         using (var connection = JobStorage.Current.GetConnection())
        //         {
        //             var job = connection.GetRecurringJobs().FirstOrDefault(p => p.Id == id);
        //             if (job == null)
        //             {
        //                 result.AddError(ErrorType.Error, "GetRecurringJob", $"Job id '{id}' does not exist");
        //                 return result;
        //             }

        //             result.ResultObject = new RecurringJobDetails
        //             {
        //                 Chron         = job.Cron,
        //                 Id            = job.Id,
        //                 Job           = job.Job,
        //                 LastExecution = job.LastExecution,
        //                 LastJobId     = job.LastJobId,
        //                 LastJobState  = job.LastJobState,
        //                 LoadException = job.LoadException,
        //                 NextExecution = job.NextExecution,
        //                 Removed       = job.Removed,
        //                 TimeZoneId    = job.TimeZoneId
        //             };
        //         }
        //     }
        //     catch (Exception ex)
        //     {
        //         result.AddError(ErrorType.Error, "GetRecurringJob", ex.Message);
        //     }

        //     return result;
        // }

        public override void Recur(string id, Expression <Action> methodCall, RecurringOption recurringOptions) => RecurringJob.AddOrUpdate(id, methodCall, GetCronExpression(recurringOptions), TimeZoneInfo.Local);