using Common;
using System;

namespace DeviceLibrary
{
    public abstract class Job
    {
        /// <summary>
        /// 是否任务正在执行,防止任务执行时间过长产生多线程问题
        /// </summary>
        public bool IsProcess { get; set; }

        /// <summary>
        /// 运行信息
        /// </summary>
        public abstract string RunInfo { get; }
        public string runInfo = "";
        /// <summary>
        /// 根据任务状态继续执行任务
        /// </summary>
        public abstract Job Execute(Agv_Info agv);

        public long CurTaskID { get; set; } = -1;
        /// <summary>
        /// 当前的任务名称(与任务GUID对应)
        /// </summary>
        public string CurTaskName { get; set; } = "";
        /// <summary>
        /// 当前任务的执行状态
        /// </summary>
        public string CurTaskState { get; set; } = "Wait";
        /// <summary>
        /// Job开始时间
        /// </summary>
        public DateTime StartJobTime { get; set; } = DateTime.Now;
        /// <summary>
        /// Job名称
        /// </summary>
        public string JobName { get; set; } = "";

        protected void RecordRunLog(Agv_Info agv,string JobStep,string runInfo,string targetPlace)
        {
           CommonVar.RunLogInfo(new RunInfo(agv.Name.PadLeft(4, '0'), JobName, targetPlace, JobStep, runInfo, StartJobTime));
        }
        /// <summary>
        /// 更新任务信息
        /// </summary>
        /// <param name="curTaskName"></param>
        /// <param name="curTaskId"></param>
        protected void UpdateJobTaskInfo(Agv_Info agv)
        {
            CurTaskID = agv.CurTaskID;
            CurTaskName = agv.CurTaskName;
            //CurTaskState = SettingString.Wait;
            CurTaskState = CommonVar.GetTakJobState(agv);
        }


        /// <summary>
        /// 任务重发
        /// </summary>
        /// <returns></returns>
        public bool ResendTask(Agv_Info agv)
        {
            bool rtn = false;
            if (!CurTaskID.Equals(-1) && MiR_API.Get_Task_State(agv, out string stateStr))
            {
                if (stateStr.Equals(SettingString.Aborted) || stateStr.Equals(SettingString.Invalid))
                {
                    rtn = agv.AssignTask(CurTaskName);
                    if (rtn)
                    {
                        UpdateJobTaskInfo(agv);
                        return true;
                    }

                }
            }
            else if (!CurTaskName.Equals("") && !CommonVar.agvMission[CurTaskName].Equals(agv.CurTaskGUID))//Job的当前任务与agv最新任务不一致
            {
                rtn = agv.AssignTask(CurTaskName);
                if (rtn)
                {
                    UpdateJobTaskInfo(agv);
                    return true;
                }
            }
            else if (CurTaskID.Equals(-1))//任务发送失败,重新发送
            {
                rtn = agv.AssignTask(CurTaskName);
                if (rtn)
                {
                    UpdateJobTaskInfo(agv);
                    return true;
                }
            }
            return false;
        }
    }
}