using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace DeviceLibrary
{
    /// <summary>
    /// AGV任务
    /// </summary>
    public class AgvTask
    {
        /// <summary>
        /// 任务ID
        /// </summary>
        public int Id { get; set; } = -1;
        /// <summary>
        /// 任务名称
        /// </summary>
        public string Name { set; get; }
        /// <summary>
        /// 任务别名
        /// </summary>
        public string AliceName { set; get; }
        /// <summary>
        /// 任务guid
        /// </summary>
        public string Guid { set; get; }
        /// <summary>
        /// 任务类型
        /// </summary>
        public TaskType Type { get; set; }
        /// <summary>
        /// 任务
        /// </summary>
        /// <param name="name">任务名称</param>
        /// <param name="aliceName">任务别名</param>
        /// <param name="targetName">目的地名</param>
        /// <param name="targetAliceName">目的地别名</param>
        /// <param name="guid">任务guid</param>
        public AgvTask(string name,string aliceName,string guid,TaskType type= TaskType.Move)
        {
            Name = name;
            AliceName = aliceName;
            Guid = guid;
            Type = type;
        }
        public AgvTask() { }
        public TaskType GetTaskType()
        {
            return Type;
        }
        public override bool Equals(object obj)
        {
            AgvTask task = obj as AgvTask;
            if(task !=null)
            {
               return  this.Guid.Equals(task.Guid);
            }
            return false;
        }
        public AgvTask ToCopy()
        {
            AgvTask task = new AgvTask();
            PropertyInfo[] info1 = this.GetType().GetProperties();
            PropertyInfo[] info2 = task.GetType().GetProperties();
            for (int i = 0; i < info1.Length; i++)
            {
                if (info1[i].Name.Equals("Id"))
                    continue;
                info2[i].SetValue(task, info1[i].GetValue(this));
            }
            return task;
        }
    }
    /// <summary>
    /// AGV任务类型
    /// </summary>
    public enum TaskType
    {
        None,
        /// <summary>
        /// 移动
        /// </summary>
        Move,
        /// <summary>
        /// 停靠
        /// </summary>
        Dock,
        /// <summary>
        /// 进出料
        /// </summary>
        InOut
    }
}