using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;

namespace MoreMountains.Tools
{
	/// <summary>
	/// A simple helper class you can use to trigger methods on Unity's pointer events
	/// Typically used on a UI Image
	/// </summary>
	public class MMOnPointer : MonoBehaviour, IPointerDownHandler, IPointerEnterHandler, IPointerUpHandler, IPointerExitHandler, IPointerClickHandler
	{
		[Header("Pointer movement")]
		/// an event to trigger when the pointer enters the associated game object
		[Tooltip("an event to trigger when the pointer enters the associated game object")]
		public UnityEvent PointerEnter;
		/// an event to trigger when the pointer exits the associated game object
		[Tooltip("an event to trigger when the pointer exits the associated game object")]
		public UnityEvent PointerExit;
		
		[Header("Clicks")]
		/// an event to trigger when the pointer is pressed down on the associated game object
		[Tooltip("an event to trigger when the pointer is pressed down on the associated game object")]
		public UnityEvent PointerDown;
		/// an event to trigger when the pointer is pressed up on the associated game object
		[Tooltip("an event to trigger when the pointer is pressed up on the associated game object")]
		public UnityEvent PointerUp;
		/// an event to trigger when the pointer is clicked on the associated game object
		[Tooltip("an event to trigger when the pointer is clicked on the associated game object")]
		public UnityEvent PointerClick;
		
		/// <summary>
		/// IPointerEnterHandler implementation
		/// </summary>
		/// <param name="eventData"></param>
		public void OnPointerEnter(PointerEventData eventData)
		{
			PointerEnter?.Invoke();
		}

		/// <summary>
		/// IPointerExitHandler implementation
		/// </summary>
		/// <param name="eventData"></param>
		public void OnPointerExit(PointerEventData eventData)
		{
			PointerExit?.Invoke();
		}
		
		/// <summary>
		/// IPointerDownHandler implementation
		/// </summary>
		/// <param name="eventData"></param>
		public void OnPointerDown(PointerEventData eventData)
		{
			PointerDown?.Invoke();
		}

		/// <summary>
		/// IPointerUpHandler implementation
		/// </summary>
		/// <param name="eventData"></param>
		public void OnPointerUp(PointerEventData eventData)
		{
			PointerUp?.Invoke();
		}

		/// <summary>
		/// IPointerClickHandler implementation
		/// </summary>
		/// <param name="eventData"></param>
		public void OnPointerClick(PointerEventData eventData)
		{
			PointerClick?.Invoke();
		}
	}
}