using Microsoft.Extensions.Logging;
using Quartz;
using SolarPower.Models;
using SolarPower.Repository.Interface;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace SolarPower.Quartz.Jobs
{
    [DisallowConcurrentExecution]
    public class OperationScheduleJob : IJob
    {
        private readonly ILogger<OperationScheduleJob> logger;
        private IOperationRepository operationRepository;

        public OperationScheduleJob(ILogger<OperationScheduleJob> logger, IOperationRepository operationRepository)
        {
            this.logger = logger;
            this.operationRepository = operationRepository;
        }

        public async Task Execute(IJobExecutionContext context)
        {
            try
            {
                var getTime = await operationRepository.GetOperationSchedules();
                foreach (var a in getTime)
                {
                    DateTime Updatedtime;
                    var useday = a.LastCreateTime;
                    if(a.LastCreateTime == "0001-01-01 00:00:00")
                    {
                        useday = a.StartTime;
                    }


                    if (a.ScheduleType == 0)//日
                    {
                        Updatedtime = Convert.ToDateTime(useday).AddDays(a.ScheduleNum);
                    }
                    else if (a.ScheduleType == 1)//周
                    {
                        Updatedtime = Convert.ToDateTime(useday).AddDays(a.ScheduleNum * 7);
                    }
                    else if (a.ScheduleType == 2)//月
                    {
                        Updatedtime = Convert.ToDateTime(useday).AddMonths(a.ScheduleNum);
                    }
                    else if (a.ScheduleType == 3)//季
                    {
                        Updatedtime = Convert.ToDateTime(useday).AddMonths(a.ScheduleNum * 3);
                    }
                    else // 年
                    {
                        Updatedtime = Convert.ToDateTime(useday).AddYears(a.ScheduleNum);
                    }





                    if (Updatedtime < DateTime.Now)
                    {
                        var now = DateTime.Now.ToString("yyyy-MM-dd");
                        var OperationPlan = new OperationCreatePlan()
                        {
                            Id = a.Id,
                            EmailType = a.EmailType,
                            ScheduleNum = a.ScheduleNum,
                            Description = a.Description,
                            WorkDay = a.WorkDay,
                            ScheduleType = a.ScheduleType,
                            StartTime = a.StartTime,
                            PowerStationId = a.PowerStationId,
                            Type = a.Type,
                            UpdatedBy = a.UpdatedBy,
                            LastCreateTime = Updatedtime.ToString("yyyy-MM-dd")
                        };
                        List<string> properties = new List<string>()
                        {
                            "Id",
                            "EmailType",
                            "ScheduleNum",
                            "Description",
                            "WorkDay",
                            "ScheduleType",
                            "StartTime",
                            "PowerStationId",
                            "Type",
                            "UpdatedBy",
                            "LastCreateTime"
                        };
                        await operationRepository.UpdateOperationPlan(OperationPlan, properties);



                        string endtime = "";
                        switch (a.ScheduleType)
                        {
                            case 0:
                                endtime = (Convert.ToDateTime(Updatedtime.ToString("yyyy-MM-dd")).AddDays(a.ScheduleNum)).ToString("yyyy-MM-dd 00:00:00"); break;
                            case 1:
                                endtime = (Convert.ToDateTime(Updatedtime.ToString("yyyy-MM-dd")).AddDays(a.ScheduleNum * 7)).ToString("yyyy-MM-dd 00:00:00"); break;
                            case 2:
                                endtime = (Convert.ToDateTime(Updatedtime.ToString("yyyy-MM-dd")).AddMonths(a.ScheduleNum)).ToString("yyyy-MM-dd 00:00:00"); break;
                            case 3:
                                endtime = (Convert.ToDateTime(Updatedtime.ToString("yyyy-MM-dd")).AddMonths(a.ScheduleNum * 3)).ToString("yyyy-MM-dd 00:00:00"); break;
                            case 4:
                                endtime = (Convert.ToDateTime(Updatedtime.ToString("yyyy-MM-dd")).AddYears(a.ScheduleNum * 3)).ToString("yyyy-MM-dd 00:00:00"); break;
                        }
                        var record = new PlanToRecord()
                        {
                            WorkType = a.Type,
                            PowerStationId = a.PowerStationId,
                            StartTime = a.StartTime,
                            CreatedBy = a.CreatedBy,
                            EndTime = endtime
                        };
                        List<string> properties2 = new List<string>()
                        {
                            "WorkType",
                            "PowerStationId",
                            "StartTime",
                            "CreatedBy",
                            "EndTime"
                        };

                    }

                }
            }
            catch (Exception exception)
            {
                logger.LogError("【{0}】{1}", nameof(logger), exception.Message);
            }
        }

        /// <summary>
        /// 取得最新的流水號
        /// </summary>
        /// <param name="current">當前的</param>
        /// <param name="pad"></param>
        /// <param name="direction">0: PadLeft；1: PadRight</param>
        /// <returns></returns>
        public string GetLastSerialNumber(string current = "", int pad = 4, byte direction = 0)
        {
            var tempSerialNumber = 0;
            if (!string.IsNullOrEmpty(current))
            {
                tempSerialNumber = Convert.ToInt32(current) + 1;
            }
            else
            {
                tempSerialNumber = 1;
            }

            if (direction == 0)
            {
                return tempSerialNumber.ToString().Trim().PadLeft(pad, '0');
            }
            else
            {
                return tempSerialNumber.ToString().Trim().PadRight(pad, '0');
            }
        }
    }
}
