using OnlineMaps;
using UnityEngine;

namespace HutongGames.PlayMaker.Actions
{
    [ActionCategory(OnlineMapsCategories.GENERAL)]
    [Tooltip("Handle map events.")]
    public class HandleMapEvents : FsmStateAction
    {
        [Tooltip("Map OnChangePosition event.")]
        public FsmEvent OnChangePosition;

        [Tooltip("Map OnChangeZoom event.")]
        public FsmEvent OnChangeZoom;

        [Tooltip("Map OnUpdateBefore event.")]
        public FsmEvent OnUpdateBefore;

        [Tooltip("Map OnUpdateLate event.")]
        public FsmEvent OnUpdateLate;

        [Tooltip("Map OnClick event.")]
        public FsmEvent OnClick;

        [Tooltip("Map OnDoubleClick event.")]
        public FsmEvent OnDoubleClick;

        [Tooltip("Map OnDrag event.")]
        public FsmEvent OnDrag;

        [Tooltip("Map OnLongPress event.")]
        public FsmEvent OnLongPress;

        [Tooltip("Map OnPress event.")]
        public FsmEvent OnPress;

        [Tooltip("Map OnRelease event.")]
        public FsmEvent OnRelease;

        public override void Reset()
        {
            OnChangePosition = null;
            OnChangeZoom = null;
            OnUpdateBefore = null;
            OnUpdateLate = null;
            OnClick = null;
            OnDoubleClick = null;
            OnDrag = null;
            OnLongPress = null;
            OnPress = null;
            OnRelease = null;
        }

        public override void OnEnter()
        {
            DoEnter();
            Finish();
        }

        private void DoEnter()
        {
            if (!Map.instance)
            {
                Debug.LogError("Online Maps not found.");
                return;
            }

            Map map = Map.instance;
            ControlBase control = map.control;
            if (OnChangePosition != null) map.view.OnLocationChanged += () => Fsm.Event(OnChangePosition);
            if (OnChangeZoom != null) map.view.OnZoomChanged += () => Fsm.Event(OnChangeZoom);
            if (OnUpdateBefore != null) map.OnUpdateBefore += () => Fsm.Event(OnUpdateBefore);
            if (OnUpdateLate != null) map.OnUpdateLate += () => Fsm.Event(OnUpdateLate);

            if (OnClick != null) control.OnClick += () => Fsm.Event(OnClick);
            if (OnDoubleClick != null) control.OnDoubleClick += () => Fsm.Event(OnDoubleClick);
            if (OnDrag != null) control.OnDrag += () => Fsm.Event(OnDrag);
            if (OnLongPress != null) control.OnLongPress += () => Fsm.Event(OnLongPress);
            if (OnPress != null) control.OnPress += () => Fsm.Event(OnPress);
            if (OnRelease != null) control.OnRelease += () => Fsm.Event(OnRelease);
        }
    }
}