using Common;
using DeviceLibrary.bean;
using DeviceLibrary.manager;
using System;

namespace DeviceLibrary
{
    public abstract class Job
    {
        public Job(JobParam jobParam) { 
            JobParam = jobParam;
            WarehouseSigManager.Reset();
        }
        public JobParam JobParam { get; private set; }

        public JobStep<RunStep> JobRunStep = new JobStep<RunStep>(RunStep.NONE);
        /// <summary>
        /// Job里的agv任务信息
        /// </summary>
        public AgvTask Task { get; set; }
        /// <summary>
        /// 运行信息
        /// </summary>
        public string RunInfo { get { return $"{JobName}{TaskStateInfo}{FixInfo}:{runInfo}"; } }
        /// <summary>
        /// agv任务状态信息
        /// </summary>
        public string TaskStateInfo = "";
        public string FixInfo = "";
        public string runInfo = "";
        /// <summary>
        /// 根据任务状态继续执行任务
        /// </summary>
        public Job Execute(Agv_Info agv)
        {
            SetRunInfo(agv);

            return Run(agv);
        }
        public abstract Job Run(Agv_Info agv);
        /// <summary>
        /// 设置相关运行信息
        /// </summary>
        /// <param name="agv"></param>
        public void SetRunInfo(Agv_Info agv)
        {
            JobRunStep.StepRunInfo.SetInfo(agv.Name.PadLeft(4, '0'), JobName, agv.Place.AliceName, JobRunStep.CurStep(), runInfo, StartJobTime, DateTime.Now);
            TaskStateInfo = agv.TaskRunState.ToTaskInfo();
            FixInfo = JobParam.FixMissionInfo != null ? JobParam.FixMissionInfo.ToTxt():"";
            StartJobTime = JobRunStep.startTime;
        }
        /// <summary>
        /// Job开始时间
        /// </summary>
        public DateTime StartJobTime { get; set; } = DateTime.Now;
        /// <summary>
        /// Job名称
        /// </summary>
        public string JobName { get; set; } = "";

        protected void AllocateTask(Agv_Info agv, string taskName)
        {
            Task = AgvTaskManager.GetTaskByName(taskName);
            AgvTaskManager.AssignMission(agv, taskName);
        }
        protected void AdjustWidth(Agv_Info agv,manager.FixType fixType)
        {
            int val = (int)fixType;
            int times = 0;
            while(!MiR_API.Set_Register(agv, 50, val))
            {
                if (times > 5)
                    break;
            }
            AllocateTask(agv, SettingString.Adjust);
        }
        /// <summary>
        /// 设置PLC值
        /// </summary>
        /// <param name="agv"></param>
        /// <param name="port"></param>
        /// <param name="val"></param>
        protected void SetPlc(Agv_Info agv,int port,int val)
        {
            int times = 0;
            while (!MiR_API.Set_Register(agv, port, val))
            {
                if (times > 5)
                    break;
            }
        }
        /// <summary>
        /// 入库类型-1
        /// </summary>
        /// <param name="agv"></param>
        protected void SetPlcWithToInstore(Agv_Info agv)
        {
            SetPlc(agv, 51, 1);
        }
        /// <summary>
        /// 出库类型-2
        /// </summary>
        /// <param name="agv"></param>
        protected void SetPlcWithToOutstore(Agv_Info agv)
        {
            SetPlc(agv, 51, 2);
        }

        protected void CloseSound(Agv_Info agv)
        {
            SetPlc(agv, 51, 0);
        }
        /// <summary>
        /// 任务重发
        /// </summary>
        /// <returns></returns>
        public bool ResendTask(Agv_Info agv)
        {
            bool rtn = false;
            if (!agv.TaskRunState.Task.Equals(Task))//agv运行的任务与Job任务不同
            {
                rtn = AgvTaskManager.AssignMission(agv, Task.Name);
                if (rtn)
                {
                    return true;
                }
            }
            else if (!agv.TaskRunState.TaskID.Equals(-1))
            {
                if (agv.TaskRunState.TaskState.Equals(SettingString.Aborted) || agv.TaskRunState.TaskState.Equals(SettingString.Invalid))
                {
                    rtn = AgvTaskManager.AssignMission(agv, Task.Name);
                    if (rtn)
                    {
                        return true;
                    }

                }
            }
            else if (agv.TaskRunState.TaskID.Equals(-1))//任务发送失败,重新发送
            {
                rtn = AgvTaskManager.AssignMission(agv, Task.Name);
                if (rtn)
                {
                    return true;
                }
            }
            return false;
        }
    }
}