using System;
using System.Reflection;

namespace AGVLib
{
    /// <summary>
    /// 节点
    /// </summary>
    public class Node
    {
        /// <summary>
        /// 节点改变事件
        /// </summary>
        /// <param name="nodeIndex"></param>
        public delegate void NodeChangedEvent(Node node);
        ///// <summary>
        ///// 节点改变
        ///// </summary>
        //public event NodeChangedEvent NodeChanged;
        ///// <summary>
        ///// 节点在线
        ///// </summary>
        //public event NodeChangedEvent NodeOnline;

        static readonly LogBean log = new LogBean(MethodBase.GetCurrentMethod()?.DeclaringType.FullName);
        /// <summary>
        /// 节点编号,唯一
        /// 编号0,一个客户端只能有一个节点
        /// </summary>
        public int id { get; set; } = 0;
        /// <summary>
        /// 节点名称
        /// </summary>
        public string name { get; set; }
        /// <summary>
        /// 客户端是否屏蔽
        /// </summary>
        public bool shielded { get; set; } = false;
        /// <summary>
        /// 料架号
        /// </summary>
        public string shelf_id { set; get; } = "";
        /// <summary>
        /// 备注
        /// id=0时,用于存储IP
        /// </summary>
        public string remark { set; get; } = "";
        /// <summary>
        /// 节点状态
        /// </summary>
        public NodeStatus status { get; set; } = NodeStatus.None;
        /// <summary>
        /// 节点优先级
        /// </summary>
        public NodeLevel level { get; set; } = NodeLevel.None;

        public Node() { }
        /// <summary>
        /// 节点
        /// </summary>
        /// <param name="name"></param>
        public Node(int id, string name)
        {
            this.id = id;
            this.name = name;
        }
        public void SetState(NodeStatus nodeStatus, NodeLevel nodelevel = NodeLevel.None, string shelfId = "", string remark = "",bool shielded=false)
        {
            this.level = nodelevel;
            this.status = nodeStatus;
            this.shelf_id = shelfId;
            this.remark = remark;
            this.shielded = shielded;
        }
        /// <summary>
        /// 节点副本
        /// </summary>
        /// <returns></returns>
        public Node ToCopy()
        {
            PropertyInfo[] infos = this.GetType().GetProperties();
            Node node = new Node();
            PropertyInfo[] infos2 = node.GetType().GetProperties();
            for (int i = 0; i < infos2.Length; i++)
            {
                infos2[i].SetValue(node, Convert.ChangeType(infos[i].GetValue(this), infos[i].PropertyType));
            }
            return node;
        }
        public string ToText()
        {
            return JsonHelper.SerializeObject(this);
        }
        public bool IsSameNode(Node node)
        {
            if (node == null) return false;
            return this.id.Equals(node.id) && this.name.Equals(node.name);
        }
        public override bool Equals(object obj)
        {
            if (obj == null)
                return false;
            Node node = obj as Node;
            if (node == null)
                return false;
            if (this.id.Equals(node.id) && this.name.Equals(node.name))
            {
                if (this.level.Equals(node.level) && this.status.Equals(node.status) && this.shielded == node.shielded)
                {
                    if ((shelf_id ?? "").Equals(node.shelf_id??"") && (remark ?? "").Equals(node.remark ?? ""))
                    {
                        return true;
                    }

                }
            }

            return false;
        }

    }
}