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

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

        public int CurTaskID { get; set; } = -1;

        /// <summary>
        /// 当前的任务目的地(与任务GUID对应)
        /// </summary>
        public string CurTarName { get; set; } = "";
        /// <summary>
        /// 当前任务的执行状态
        /// </summary>
        public string CurTaskState { get; set; } = "Wait";

        /// <summary>
        /// 更新任务信息
        /// </summary>
        /// <param name="curTaskName"></param>
        /// <param name="curTaskId"></param>
        protected void UpdateJobTaskInfo(string curTaskName, int curTaskId)
        {
            CurTaskID = curTaskId;
            CurTarName = curTaskName;
            CurTaskState = MissionSys.GetTakJobState(CurTaskID);
        }
        /// <summary>
        /// 任务重发
        /// </summary>
        /// <returns></returns>
        public bool ResendTask(Agv_Info agv)
        {
            bool rtn = false;
            if (!CurTaskID.Equals(-1) && MiR_API.Get_Task_State(CurTaskID, out string stateStr))
            {
                if (stateStr.Equals(SettingString.Aborted) || stateStr.Equals(SettingString.Invalid))
                {
                    rtn = MissionSys.AssignMission(agv, CurTarName);
                    if (rtn)
                    {
                        UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
                        return true;
                    }

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