using AGVControl;
using System;
using System.Collections.Generic;

namespace AGVControl
{
    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 CurTaskName { 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;
            CurTaskName = curTaskName;
            //CurTaskState = SettingString.Wait;
            CurTaskState = Common.GetTakJobState(CurTaskID);
        }
        /// <summary>
        /// 任务重发
        /// </summary>
        /// <returns></returns>
        public bool ResendTask(Agv_Info agv)
        {
            bool rtn = false;
            if (!CurTaskID.Equals(-1) && Common.mir.Get_Task_State(CurTaskID, out string stateStr))
            {
                if (stateStr.Equals(SettingString.Aborted))
                {
                    rtn = Common.mir.Add_Mission_Fleet(agv, Common.agvMission[CurTaskName]);
                    if (rtn)
                    {
                        UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
                        return true;
                    }

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