namespace Unity.VisualScripting
{
    public struct EventHook
    {
        public readonly string name;

        public readonly object target;

        public readonly object tag;

        public EventHook(string name, object target = null, object tag = null)
        {
            Ensure.That(nameof(name)).IsNotNull(name);

            this.name = name;
            this.target = target;
            this.tag = tag;
        }

        public override bool Equals(object obj)
        {
            if (!(obj is EventHook other))
            {
                return false;
            }

            return Equals(other);
        }

        public bool Equals(EventHook other)
        {
            return name == other.name && Equals(target, other.target) && Equals(tag, other.tag);
        }

        public override int GetHashCode()
        {
            return HashUtility.GetHashCode(name, target, tag);
        }

        public static bool operator ==(EventHook a, EventHook b)
        {
            return a.Equals(b);
        }

        public static bool operator !=(EventHook a, EventHook b)
        {
            return !(a == b);
        }

        public static implicit operator EventHook(string name)
        {
            return new EventHook(name);
        }
    }
}