#if USING_XRI

using System.Collections;
using System.Collections.Generic;
using System;
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;

namespace SimplifyXR
{
    public enum XRInteractableEvent
    {
        HoverEntered,
        HoverExited,
        SelectEntered,
        SelectExited,
        Activated,
        Deactivated,
        FirstHoverEntered,
        LastHoverExited,
        FirstSelectEntered,
        LastSelectExited
    }

    public abstract class XRBaseInteractableInitiator : EventInitiator
    {
        [HideInInspector]
        public string eventFieldInfoName;

        [Tooltip("Listen to multiple interactions")]
        public bool listenToMultiple;


        public override List<KnobKeywords> ReceiveKeywords()
        {
            return new List<KnobKeywords>();
        }

        public override List<KnobKeywords> SendKeywords()
        {
            return new List<KnobKeywords>() { new KnobKeywords("BaseInteractionEvent", typeof(BaseInteractionEventArgs)) };
        }

        public void SingleTypeInitiate(BaseInteractionEventArgs args)
        {
            //If we are listening, go ahead and process the event
            SendData(args);
            base.Initiate();
        }

        protected virtual void RegisterEvents(bool register) { }

        #region interactor event handlers

        protected void RegisterEventHandler(XRBaseInteractable interactable, XRInteractableEvent interactableEvent, bool register = true)
        {
            if (interactable != null)
            {
                switch (interactableEvent)
                {
                    case XRInteractableEvent.HoverEntered:
                        if (register) interactable.hoverEntered.AddListener(SingleTypeInitiate);
                        if (!register) interactable.hoverEntered.RemoveListener(SingleTypeInitiate);
                        break;
                    case XRInteractableEvent.HoverExited:
                        if (register) interactable.hoverExited.AddListener(SingleTypeInitiate);
                        if (!register) interactable.hoverExited.RemoveListener(SingleTypeInitiate);
                        break;
                    case XRInteractableEvent.SelectEntered:
                        if (register) interactable.selectEntered.AddListener(SingleTypeInitiate);
                        if (!register) interactable.selectEntered.RemoveListener(SingleTypeInitiate);
                        break;
                    case XRInteractableEvent.SelectExited:
                        if (register) interactable.selectExited.AddListener(SingleTypeInitiate);
                        if (!register) interactable.selectExited.RemoveListener(SingleTypeInitiate);
                        break;
                    case XRInteractableEvent.Activated:
                        if (register) interactable.activated.AddListener(SingleTypeInitiate);
                        if (!register) interactable.activated.RemoveListener(SingleTypeInitiate);
                        break;
                    case XRInteractableEvent.Deactivated:
                        if (register) interactable.deactivated.AddListener(SingleTypeInitiate);
                        if (!register) interactable.deactivated.RemoveListener(SingleTypeInitiate);
                        break;
                    case XRInteractableEvent.FirstHoverEntered:
                        if (register) interactable.firstHoverEntered.AddListener(SingleTypeInitiate);
                        if (!register) interactable.firstHoverEntered.RemoveListener(SingleTypeInitiate);
                        break;
                    case XRInteractableEvent.LastHoverExited:
                        if (register) interactable.lastHoverExited.AddListener(SingleTypeInitiate);
                        if (!register) interactable.lastHoverExited.RemoveListener(SingleTypeInitiate);
                        break;
                    case XRInteractableEvent.FirstSelectEntered:
                        if (register) interactable.firstSelectEntered.AddListener(SingleTypeInitiate);
                        if (!register) interactable.firstSelectEntered.RemoveListener(SingleTypeInitiate);
                        break;
                    case XRInteractableEvent.LastSelectExited:
                        if (register) interactable.lastSelectExited.AddListener(SingleTypeInitiate);
                        if (!register) interactable.lastSelectExited.RemoveListener(SingleTypeInitiate);
                        break;
                }
            }
        }
        #endregion

        protected new void Awake()
        {
            base.Awake();
            if (enabled) RegisterEvents(true);
        }
        protected new void OnDestroy()
        {
            base.OnDestroy();
            RegisterEvents(false);
        }

        protected void SendData(BaseInteractionEventArgs args)
        {
            // Debug.Log("[" + this.name + "]: " + "SendData -> " + args.interactorObject.transform.name + "," + args.interactableObject.transform.name + ")");
            AddPassableData(new List<string> { "BaseInteractionEvent" }, new List<object> { args });
        }
    }
}
#endif
