using UnityEngine;
using UnityEngine.Events;

namespace Genesis.POISystem
{
    public class InteractablePOI : POIBase, IInteractablePOI
    {
        [SerializeField] UnityEvent<IInteractablePOI> onStartPointingEvent;

        public UnityEvent<IInteractablePOI> OnStartPointingEvent => onStartPointingEvent;

        [SerializeField] UnityEvent<IInteractablePOI> onStopPointingEvent;

        public UnityEvent<IInteractablePOI> OnStopPointingEvent => onStopPointingEvent;

        [SerializeField] UnityEvent<IInteractablePOI> onSelectedEvent;

        public UnityEvent<IInteractablePOI> OnSelectedEvent => onSelectedEvent;

        [SerializeField] UnityEvent<IInteractablePOI> onDeselectedEvent;

        public UnityEvent<IInteractablePOI> OnDeselectedEvent => onDeselectedEvent;

        public bool IsSelected { get; private set; }

        public void StartPointing()
        {
            onStartPointingEvent?.Invoke(this);
            OnStartPointing();
        }

        protected virtual void OnStartPointing() { }

        public void StopPointing()
        {
            onStopPointingEvent?.Invoke(this);
            OnStopPointing();
        }

        protected virtual void OnStopPointing() { }

        public void Select()
        {
            onSelectedEvent?.Invoke(this);
            OnSelected();

            IsSelected = true;
        }

        protected virtual void OnSelected() { }

        public void Deselect()
        {
            onDeselectedEvent?.Invoke(this);
            OnDeselected();

            IsSelected = false;
        }

        protected virtual void OnDeselected() { }
    }
}