// UltEvents // Copyright 2020 Kybernetik //

using UnityEngine;

namespace UltEvents
{
    /// <summary>
    /// An event that takes a single <see cref="Collision"/> parameter.
    /// </summary>
    [System.Serializable]
    public sealed class CollisionEvent3D : UltEvent<Collision> { }

    /************************************************************************************************************************/

    /// <summary>
    /// Holds <see cref="UltEvent"/>s which are called by various <see cref="MonoBehaviour"/> collision events:
    /// <see cref="OnCollisionEnter"/>, <see cref="OnCollisionStay"/>, and <see cref="OnCollisionExit"/>.
    /// </summary>
    [AddComponentMenu(UltEventUtils.ComponentMenuPrefix + "Collision Events 3D")]
    [HelpURL(UltEventUtils.APIDocumentationURL + "/CollisionEvents3D")]
    [DisallowMultipleComponent]
    [RequireComponent(typeof(Collider))]
    public class CollisionEvents3D : MonoBehaviour
    {
        /************************************************************************************************************************/

        [SerializeField]
        private CollisionEvent3D _CollisionEnterEvent;

        /// <summary>Invoked by <see cref="OnCollisionEnter"/>.</summary>
        public CollisionEvent3D CollisionEnterEvent
        {
            get
            {
                if (_CollisionEnterEvent == null)
                    _CollisionEnterEvent = new CollisionEvent3D();
                return _CollisionEnterEvent;
            }
            set { _CollisionEnterEvent = value; }
        }

        /// <summary>Invokes <see cref="CollisionEnterEvent"/>.</summary>
        public virtual void OnCollisionEnter(Collision collision)
        {
            if (_CollisionEnterEvent != null)
                _CollisionEnterEvent.Invoke(collision);
        }

        /************************************************************************************************************************/

        [SerializeField]
        private CollisionEvent3D _CollisionStayEvent;

        /// <summary>Invoked by <see cref="OnCollisionStay"/>.</summary>
        public CollisionEvent3D CollisionStayEvent
        {
            get
            {
                if (_CollisionStayEvent == null)
                    _CollisionStayEvent = new CollisionEvent3D();
                return _CollisionStayEvent;
            }
            set { _CollisionStayEvent = value; }
        }

        /// <summary>Invokes <see cref="CollisionStayEvent"/>.</summary>
        public virtual void OnCollisionStay(Collision collision)
        {
            if (_CollisionStayEvent != null)
                _CollisionStayEvent.Invoke(collision);
        }

        /************************************************************************************************************************/

        [SerializeField]
        private CollisionEvent3D _CollisionExitEvent;

        /// <summary>Invoked by <see cref="OnCollisionExit"/>.</summary>
        public CollisionEvent3D CollisionExitEvent
        {
            get
            {
                if (_CollisionExitEvent == null)
                    _CollisionExitEvent = new CollisionEvent3D();
                return _CollisionExitEvent;
            }
            set { _CollisionExitEvent = value; }
        }

        /// <summary>Invokes <see cref="CollisionExitEvent"/>.</summary>
        public virtual void OnCollisionExit(Collision collision)
        {
            if (_CollisionExitEvent != null)
                _CollisionExitEvent.Invoke(collision);
        }

        /************************************************************************************************************************/
    }
}