using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Quartz;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Utility.Entity;
using Utility;
using Model.ModelVm;
using Microsoft.AspNetCore.Authorization;

namespace Wms.Controllers
{
    /// <summary>
    /// 任务调度
    /// </summary>
    [Route("api/[controller]/[action]")]
    [ApiController]
    [Authorize]
    [ServiceFilter(typeof(ApiResponseActionFilter))]
    public class JobController : ControllerBase
    {
        private SchedulerCenter scheduler;

        /// <summary>
        /// 任务调度对象
        /// </summary>
        /// <param name="schedulerCenter"></param>
        public JobController(SchedulerCenter schedulerCenter)
        {
            scheduler = schedulerCenter;
        }

        /// <summary>
        /// 添加任务
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<string> AddJob(ScheduleEntity entity)
        {
            if (entity.TriggerType == TriggerTypeEnum.Cron &&
                     entity.Cron == "* * * * * ?")
            {
                return "不允许过频繁执行任务!";
            }
            return await scheduler.AddScheduleJobAsync(entity);
        }

        /// <summary>
        /// 暂停任务
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<string> StopJob(JobVm job)
        {
            return await scheduler.StopOrDelScheduleJobAsync(job.Group, job.Name);
        }

        /// <summary>
        /// 删除任务
        /// </summary> 
        /// <returns></returns>
        [HttpPost]
        public async Task<string> RemoveJob(JobVm job)
        {
            return await scheduler.StopOrDelScheduleJobAsync(job.Group, job.Name, true);
        }

        /// <summary>
        /// 恢复运行暂停的任务
        /// </summary> 
        /// <returns></returns>
        [HttpPost]
        public async Task<string> ResumeJob(JobVm job)
        {
            return await scheduler.ResumeJobAsync(job.Group, job.Name);
        }

        /// <summary>
        /// 查询任务
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<ScheduleEntity> QueryJob(JobVm job)
        {
            return await scheduler.QueryJobAsync(job.Group, job.Name);
        }

        /// <summary>
        /// 修改
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<string> ModifyJob(ModifyJobInput entity)
        {
            var jobKey = new JobKey(entity.OldScheduleEntity.JobName, entity.OldScheduleEntity.JobGroup);
            long runNumber = 0;
            try
            {
                runNumber = await scheduler.GetRunNumberAsync(jobKey);
            }
            catch (Exception)
            {

            }
            await scheduler.StopOrDelScheduleJobAsync(entity.OldScheduleEntity.JobGroup, entity.OldScheduleEntity.JobName, true);
            await scheduler.AddScheduleJobAsync(entity.NewScheduleEntity, runNumber);
            return "修改计划任务成功!";
        }

        /// <summary>
        /// 立即执行
        /// </summary>
        /// <param name="job"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<bool> TriggerJob(JobVm job)
        {
            JobKey modKey = new JobKey(job.Name, job.Group);
            await scheduler.TriggerJobAsync(modKey);
            return true;
        }

        /// <summary>
        /// 获取job日志
        /// </summary>
        /// <param name="jobKey"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<List<string>> GetJobLogs(JobVm job)
        {
            JobKey modKey = new JobKey(job.Name, job.Group);
            var logs = await scheduler.GetJobLogsAsync(modKey);
            logs?.Reverse();
            return logs;
        }

        /// <summary>
        /// 启动调度
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public async Task<bool> StartSchedule()
        {
            return await scheduler.StartScheduleAsync();
        }

        /// <summary>
        /// 停止调度
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public async Task<bool> StopSchedule()
        {
            return await scheduler.StopScheduleAsync();
        }

        /// <summary>
        /// 获取所有任务
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public async Task<List<JobInfo>> GetAllJob()
        {
            var list = await scheduler.GetAllJobAsync();
            var listJob = new List<JobInfo>();
            foreach (var mod in list)
            {
                mod.JobInfoList.ForEach(s => s.GroupName = mod.GroupName);
                listJob.AddRange(mod.JobInfoList);
            }
            return listJob;
        }

        /// <summary>
        /// 获取所有Job信息(简要信息 - 刷新数据的时候使用)
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public async Task<List<JobBriefInfoEntity>> GetAllJobBriefInfo()
        {
            return await scheduler.GetAllJobBriefInfoAsync();
        }

        ///// <summary>
        ///// 移除异常信息
        ///// </summary>
        ///// <param name="jobKey"></param>
        ///// <returns></returns>
        //[HttpPost]
        //public async Task<bool> RemoveErrLog([FromBody] JobKey jobKey)
        //{
        //    return await scheduler.RemoveErrLog(jobKey.Group, jobKey.Name);
        //}
    }
}