using Common;
using System;

namespace DeviceLib.Model.AGV
{
    public abstract class Job
    {
       public static LogBean Log = new LogBean(Setting_Str.JobLog);
        public Job(JobParam jobParam)
        {
            JobParam = jobParam;
        }
        public Job() { }
        /// <summary>
        /// 任务名字
        /// </summary>
        public string JobName { get; set; }
        public JobParam JobParam { get; set; }

        public JobStep<RunStep> JobRunStep = new JobStep<RunStep>(RunStep.None);
        public void ToNextStep(RunStep next, string msg)
        {
            JobRunStep.StepFinish();
            Log.Info(getRunInfo());
            JobRunStep.ToNextStep(next, msg);
        }
        string getRunInfo()
        {
            return $"【{getRobot(JobParam?.RobotIp)?.name??""}】【{JobParam?.OrderId ?? ""}】【{JobName}】【{JobRunStep?.CurStepStr}】【{JobRunStep?.Msg}】" +
                $"【{JobParam?.CurDstNode?.Name??""}】【{JobParam?.MissionState?.mission?.alias??""}】【{JobParam?.MissionState?.run_id}】";
        }
        protected void SetWarnMsg(string warn)
        {
            JobRunStep.WarnMsg = warn;
        }
        /// <summary>
        /// 重新计时
        /// </summary>
        protected void ReTime()
        {
            JobRunStep.StartTime = DateTime.Now;
        }
        protected abstract ClientNode GetClientNode(NodeJobState nodeState);
        protected abstract Robot getRobot(string robotIp);

        /// <summary>
        /// 根据任务状态继续执行任务
        /// </summary>
        public Job Execute(Robot agv)
        {
            return Run(agv);
        }
        public abstract Job Run(Robot agv);

        /// <summary>
        /// 开始时间
        /// </summary>
        public DateTime StartTime { get; set; } = DateTime.Now;
        public DateTime EndTime { get; set; } = DateTime.Now;
        public string RunTime { get { return FormUtil.GetSpanStr(StartTime - EndTime); } }
        public virtual void ReSendMission(Robot robot, bool force = false)
        {
            if (JobParam.MissionState == null) return;
            if (force)
            {
                SendMission(robot, JobParam.MissionState.mission);
            }
            else
            {
                if (robot.mission_state.run_id != JobParam?.MissionState?.run_id)
                {
                    SendMission(robot, JobParam.MissionState.mission);
                }
            }
            JobParam.MissionState = robot.mission_state;
        }
        protected virtual void SendMission(Robot robot, Mission mission)
        {
            JobParam.MissionState.state = "";
            robot.operation.Add_Mission(mission);
            JobParam.MissionState.mission= robot.mission_state.mission;
            JobParam.MissionState.run_id = robot.mission_state.run_id;
            JobParam.MissionState.node_name = robot.mission_state.node_name;
            JobParam.MissionState.description = robot.mission_state.description;
            Log.Info($"{robot.name} 自动模式任务:{mission}");
        }
    }
}