using Quartz.Impl;
using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Entity.DomainModels;
using WIDESEA_WCS.WCSClient;
using WIDESEA_Core.DBManage;
using Quartz.Impl.Matchers;
namespace WIDESEA_WCS.Services.WCS.Partial.Scheduler
{
    public class SchedulerCenter
    {
        /// 
        /// 调度中心
        /// 
        private static IScheduler _scheduler = StdSchedulerFactory.GetDefaultScheduler().Result;
        public SchedulerCenter()
        {
        }
        public IScheduler center { get => _scheduler; }
        public bool IsRun()
        {
            return !_scheduler.IsShutdown && _scheduler.IsStarted;
        }
        /// 
        /// 添加作业
        /// 
        /// 
        public async void AddJob(VV_Dispatch jobparms)
        {
            IJobDetail job = JobBuilder.Create(Type.GetType(jobparms.AssemblyName + "." + jobparms.ClassName))
                 .WithIdentity(jobparms.JobName, jobparms.JobGroup)
                 .Build();
            //添加携带信息
            job.JobDataMap.Add("JobParams", PLCClient.Clients.FirstOrDefault(t => t.PLCName == jobparms.JobName));
            ITrigger trigger = TriggerBuilder.Create()
                            .WithDescription(jobparms.Remark)
            .WithIdentity(jobparms.JobName, jobparms.JobGroup)
                            .StartNow()
                            .WithSimpleSchedule(x => x.WithIntervalInSeconds(jobparms.IntervalSecond)
                                                      .RepeatForever()
                                                )
                            .Build();
            await _scheduler.ScheduleJob(job, trigger);
        }
        /// 
        /// 获取job
        /// 
        /// 
        /// 
        public JobKey? GetJobByJobName(string jobName)
        {
            var job = _scheduler.GetJobKeys(GroupMatcher.AnyGroup()).Result.FirstOrDefault(t => t.Name == jobName);
            return job;
        }
        public bool RemoveJob(JobKey job)
        {
            return _scheduler.DeleteJob(job).Result;
        }
        public void Start()
        {
            _scheduler.Start();
        }
        public void Shutdown()
        {
            _scheduler.Shutdown(false);//是否等待调度执行完成
            _scheduler.Clear();
            _scheduler = StdSchedulerFactory.GetDefaultScheduler().Result;
        }
    }
}