using System;
using UnityEngine.Events;
namespace UnityEngine.XR.Content.Interaction
{
    /// 
    /// Calls functionality when a physics collision occurs
    /// 
    public class OnCollision : MonoBehaviour
    {
        [Serializable] public class CollisionEvent : UnityEvent { }
        [SerializeField]
        [Tooltip("If set, this collision will only fire if the other gameobject has this tag.")]
        string m_RequiredTag = string.Empty;
        [SerializeField]
        [Tooltip("Events to fire when a matcing object collides with this one.")]
        CollisionEvent m_OnEnter = new CollisionEvent();
        [SerializeField]
        [Tooltip("Events to fire when a matching object stops colliding with this one.")]
        CollisionEvent m_OnExit = new CollisionEvent();
        /// 
        /// If set, this collision will only fire if the other gameobject has this tag.
        /// 
        public string requiredTag => m_RequiredTag;
        /// 
        /// Events to fire when a matching object collides with this one.
        /// 
        public CollisionEvent onEnter => m_OnEnter;
        /// 
        /// Events to fire when a matching object stops colliding with this one.
        /// 
        public CollisionEvent onExit => m_OnExit;
        void OnCollisionEnter(Collision collision)
        {
            if (CanInvoke(collision.gameObject))
                m_OnEnter?.Invoke(collision);
        }
        void OnCollisionExit(Collision collision)
        {
            if (CanInvoke(collision.gameObject))
                m_OnExit?.Invoke(collision);
        }
        bool CanInvoke(GameObject otherGameObject)
        {
            return string.IsNullOrEmpty(m_RequiredTag) || otherGameObject.CompareTag(m_RequiredTag);
        }
    }
}