using Lidgren.Network;
using System;

namespace Barotrauma.Networking
{
    abstract class NetEntityEvent
    {
        public enum Type
        {
            Invalid,
            ComponentState, 
            InventoryState,
            Status,
            Treatment,
            ApplyStatusEffect,
            ChangeProperty,
            Control,
            UpdateSkills
        }

        public readonly Entity Entity;
        public readonly UInt16 ID;

        //arbitrary extra data that will be passed to the Write method of the serializable entity
        //(the index of an itemcomponent for example)
        protected object[] Data;

        protected NetEntityEvent(INetSerializable entity, UInt16 id)
        {
            this.ID = id;
            this.Entity = entity as Entity;
        }

        public void SetData(object[] data)
        {
            this.Data = data;
        }

        public bool IsDuplicate(NetEntityEvent other)
        {
            if (other.Entity != this.Entity) return false;

            if (Data != null && other.Data != null)
            {
                if (Data.Length != other.Data.Length) return false;
                
                for (int i = 0; i < Data.Length; i++)
                {
                    if (Data[i] == null)
                    {
                        if (other.Data[i] != null) return false;
                    }
                    else
                    {
                        if (other.Data[i] == null) return false;
                        if (!Data[i].Equals(other.Data[i])) return false;
                    }
                }
                return true;
            }

            return Data == other.Data;
        }
    }
}
