using Admin.Core.Common;
using Admin.Core.IService.ISys;
using Admin.Core.Model.Sys;
using Quartz;
using System;
using System.Diagnostics;
using System.Threading.Tasks;

namespace Admin.Core.Tasks
{
    public class JobBase
    {
        public ISysTasksQzService _SysTasksQzService;
        public ISysJobLogService _sysJobLogService;
        /// <summary>
        /// 执行指定任务
        /// </summary>
        /// <param name="context"></param>
        /// <param name="action"></param>
        public async Task<string> ExecuteJob(IJobExecutionContext context, Func<Task> func)
        {
            //记录Job时间
            Stopwatch stopwatch = new Stopwatch();
            //JOBID
            int jobid = context.JobDetail.Key.Name.ObjToInt();
            //JOB组名
            string groupName = context.JobDetail.Key.Group;
            //日志
            string jobHistory = $"【{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}】【执行开始】【Id:{jobid},组别:{groupName}】";
            //耗时
            double taskSeconds = 0;
            //任务执行日志
            SysJobLog jobLog = new SysJobLog()
            {
                JobID = jobid,
                RunTimeStart = DateTime.Now,
            };
            try
            {
                stopwatch.Start();
                await func();//执行任务
                stopwatch.Stop();
                jobHistory += $",【{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}】【执行成功】";
                jobLog.RunTimeEnd = DateTime.Now;
                jobLog.Status = SysConst.SUCCESS;
                jobLog.Remark = "执行成功";
            }
            catch (Exception ex)
            {
                JobExecutionException e2 = new JobExecutionException(ex);
                //true  是立即重新执行任务 
                e2.RefireImmediately = true;
                jobHistory += $",【{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}】【执行失败:{ex.Message}】";
                jobLog.Status = SysConst.FAIL;
                jobLog.Remark = $"执行失败:{ex.Message}";
            }
            finally
            {
                taskSeconds = Math.Round(stopwatch.Elapsed.TotalSeconds, 3);
                jobHistory += $",【{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}】【执行结束】(耗时:{taskSeconds}秒)";
                if (_SysTasksQzService != null)
                {
                    var model = await _SysTasksQzService.QueryByIdAsync(jobid);
                    if (model != null)
                    {
                        model.RunTimes += 1;
                        var separator = "<br>";
                        // 这里注意数据库字段的长度问题,超过限制,会造成数据库remark不更新问题。
                        model.Remark =
                            $"{jobHistory}{separator}" + string.Join(separator, StringHelper.GetTopDataBySeparator(model.Remark, separator, 9));
                        await _SysTasksQzService.UpdateAsync(model);

                        jobLog.RunTimer = taskSeconds.ToString();
                        await _sysJobLogService.AddAsync(jobLog);
                    }
                }
            }

            return jobHistory;
        }
    }

}