using Hangfire;
using IRaCIS.Core.Application.Service;
using IRaCIS.Core.Domain.Share;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using NPOI.SS.Formula.Functions;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace IRaCIS.Core.Application.Helper
{
    public static class HangfireJobHelper
    {



        //public static void AddOrUpdateCronJob(string jobId, string queueName, Expression<Action> methodCall, string cron)
        //{
        //    RecurringJob.AddOrUpdate(jobId, queueName, methodCall, cron);         
        //}



        //添加 或者更新定时任务  Id 要唯一标识一个定义任务
        public static void AddOrUpdateCronJob<T>(string jobId, Expression<Action<T>> methodCall, string cron, string queueName = "default")
        {
            RecurringJob.AddOrUpdate<T>(jobId, queueName, methodCall, cron);
        }

        public static void AddOrUpdateInitCronJob<T>(string jobId, Expression<Action<T>> methodCall, string cron)
        {
            RecurringJob.AddOrUpdate<T>(jobId, "sys_init", methodCall, cron);
        }

        public static void RemoveCronJob(string jobId)
        {
            RecurringJob.RemoveIfExists(jobId);

        }



        public static void ImmediatelyOnceOnlyJob(Expression<Action> methodCall)
        {
            BackgroundJob.Enqueue("immediately_once", methodCall);
        }

        public static void ImmediatelyOnceOnlyJob<T>(Expression<Action<T>> methodCall)
        {
            BackgroundJob.Enqueue<T>("immediately_once", methodCall);
        }

        public static void NotImmediatelyOnceOnlyJob(Expression<Action> methodCall, TimeSpan timeSpan)
        {
            BackgroundJob.Schedule("not_immediately_once", methodCall, timeSpan);
        }

        public static void NotImmediatelyOnceOnlyJob<T>(Expression<Action<T>> methodCall, TimeSpan timeSpan)
        {
            BackgroundJob.Schedule<T>("not_immediately_once", methodCall, timeSpan);
        }


        public static void AddOrUpdateTrialCronJob (string jobId, Guid trialId, EmailBusinessScenario businessScenario, string emailCron)
        {

            switch (businessScenario)
            {

                case EmailBusinessScenario.QCTask:
                    HangfireJobHelper.AddOrUpdateCronJob<IEmailSendService>(jobId, t => t.SendTrialImageQCTaskEmailAsync(trialId), emailCron);
                    break;
                case EmailBusinessScenario.QCQuestion:
                    HangfireJobHelper.AddOrUpdateCronJob<IEmailSendService>(jobId, t => t.SendTrialQCQuestionEmailAsync(trialId), emailCron);
                    break;
                case EmailBusinessScenario.ImageQuestion:
                    HangfireJobHelper.AddOrUpdateCronJob<IEmailSendService>(jobId, t => t.SendTrialImageQuestionAsync(trialId), emailCron);
                    break;

                default:
                    break;
            }

        }
    }
}