#if USING_XRI

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

namespace SimplifyXR
{
    public enum XRInteractorEvent
    {
        HoverEntered,
        HoverExited,
        SelectEntered,
        SelectExited
    }

    public abstract class XRBaseInteractorInitiator : 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(XRBaseInteractor interactor, XRInteractorEvent interactorEvent, bool register = true)
        {
            if (interactor != null)
            {
                switch (interactorEvent)
                {
                    case XRInteractorEvent.HoverEntered:
                        if (register) interactor.hoverEntered.AddListener(SingleTypeInitiate);
                        if (!register) interactor.hoverEntered.RemoveListener(SingleTypeInitiate);
                        break;
                    case XRInteractorEvent.HoverExited:
                        if (register) interactor.hoverExited.AddListener(SingleTypeInitiate);
                        if (!register) interactor.hoverExited.RemoveListener(SingleTypeInitiate);
                        break;
                    case XRInteractorEvent.SelectEntered:
                        if (register) interactor.selectEntered.AddListener(SingleTypeInitiate);
                        if (!register) interactor.selectEntered.RemoveListener(SingleTypeInitiate);
                        break;
                    case XRInteractorEvent.SelectExited:
                        if (register) interactor.selectExited.AddListener(SingleTypeInitiate);
                        if (!register) interactor.selectExited.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
