namespace DeviceLibrary
{
    public abstract class Node
    {

        /// <summary>
        /// 节点名称
        /// </summary>
        public string Name { get; }

        /// <summary>
        /// 在线状态
        /// </summary>
        public bool Online { get; set; }
        /// <summary>
        /// 是否可调用
        /// </summary>
        public bool IsUse { set; get; }
        /// <summary>
        /// 节点状态
        /// </summary>
        protected eNodeStatus nodeStatus;
        /// <summary>
        /// 看板信息
        /// </summary>
        protected DisplayBoard displayBoard;
        public Node(string name, bool isUse = false)
        {
            Name = name;
            Online = false;
            IsUse = isUse;
            nodeStatus = eNodeStatus.None;
            displayBoard = new DisplayBoard();
        }

        public Node(string name)
        {
            Name = name;
        }

        public bool StateEquals(eNodeStatus obj)
        {
            return nodeStatus.Equals(obj);
        }

        /// <summary>
        /// 获取当前状态
        /// </summary>
        /// <returns></returns>
        public eNodeStatus GetState()
        {
            return nodeStatus;
        }
        /// <summary>
        /// 更新节点状态
        /// </summary>
        /// <param name="status"></param>
        public void UpdateNodeStatus(eNodeStatus status)
        {
            nodeStatus = status;
        }

        public virtual Job GetNewJob(Agv_Info currentAgvBean)
        {
            return null;
        }
    }
    /// <summary>
    /// 节点状态
    /// </summary>
    public enum eNodeStatus : byte
    {
        /// <summary>
        /// 没有动作
        /// </summary>
        None = 0,
        /// <summary>
        /// 关门(仅包装料仓)
        /// </summary>
        CloseDoor = 1,
        /// <summary>
        /// 可以进入料架(仅包装料仓)
        /// </summary>
        MayEnter = 2,
        /// <summary>
        /// 可以出去料架(仅包装料仓)
        /// </summary>
        MayLeave = 3,
        /// <summary>
        /// 需要进入料架
        /// </summary>
        NeedEnter = 4,
        /// <summary>
        /// 需要出去料架
        /// </summary>
        NeedLeave = 5,
        /// <summary>
        /// 完成进入料架
        /// </summary>
        FinishEnter = 6,
        /// <summary>
        /// 完成出去料架
        /// </summary>
        FinishLeave = 7,
        /// <summary>
        /// 小车到达
        /// </summary>
        Arrive = 8,
        /// <summary>
        /// 小车已准备好
        /// </summary>
        Ready = 9,
        /// <summary>
        /// 只能入料不能出料(仅包装料仓)
        /// </summary>
        EnterShelf = 10,
        /// <summary>
        /// 不允许
        /// </summary>
        MayNot = 11
    }

    /// <summary>
    /// 客户端的优先级
    /// </summary>
    public enum ClientLevel : byte
    {
        /// <summary>
        /// 低
        /// </summary>
        Low = 0,
        /// <summary>
        /// 中等
        /// </summary>
        Middle = 1,
        /// <summary>
        /// 高
        /// </summary>
        High = 2
    }
}