using OnlineMaps;
using UnityEngine;

namespace HutongGames.PlayMaker.Actions
{
    [ActionCategory(OnlineMapsCategories.MARKERS)]
    [RequireComponent(typeof(ControlBase3D))]
    [Tooltip("Create a new 3D marker on the map.")]
    public class Create3DMarker : FsmStateAction
    {
        [RequiredField]
        [Tooltip("Marker coordinates. X - Longituge. Y - Latitude.")]
        public FsmVector2 coordinates = Vector2.zero;

        [RequiredField]
        [Tooltip("Marker prefab.")]
        public FsmGameObject prefab;

        [Tooltip("Marker tooltip.")]
        public FsmString tooltip;

        [UIHint(UIHint.Variable)]
        [Tooltip("Instance of marker.")]
        public FsmObject storeInstance;

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

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

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

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

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

        [Tooltip("Marker OnRollOver event.")]
        public FsmEvent OnRollOver;

        [Tooltip("Marker OnRollOut event.")]
        public FsmEvent OnRollOut;

        [Tooltip("Marker OnLocationChanged event.")]
        public FsmEvent OnLocationChanged;

        public override void Reset()
        {
            coordinates = null;
            prefab = null;
            tooltip = null;
            storeInstance = null;
            OnClick = null;
            OnDoubleClick = null;
            OnLongPress = null;
            OnPress = null;
            OnRelease = null;
            OnRollOver = null;
            OnRollOut = null;
            OnLocationChanged = null;
        }

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

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

            Marker3D marker = Marker3DManager.CreateItem(coordinates.Value, prefab.Value);
            if (!tooltip.IsNone) marker.label = tooltip.Value;
            MarkerWrapper markerWrapper = new MarkerWrapper(marker);
            storeInstance.Value = markerWrapper;

            if (OnClick != null)
            {
                marker.OnClick += delegate
                {
                    MarkerWrapper.activeMarker = markerWrapper;
                    Fsm.Event(OnClick);
                };
            }
            if (OnDoubleClick != null)
            {
                marker.OnDoubleClick += delegate
                {
                    MarkerWrapper.activeMarker = markerWrapper;
                    Fsm.Event(OnDoubleClick);
                };
            }
            if (OnPress != null)
            {
                marker.OnPress += delegate
                {
                    MarkerWrapper.activeMarker = markerWrapper;
                    Fsm.Event(OnPress);
                };
            }
            if (OnRelease != null)
            {
                marker.OnRelease += delegate
                {
                    MarkerWrapper.activeMarker = markerWrapper;
                    Fsm.Event(OnRelease);
                };
            }
            if (OnRollOver != null)
            {
                marker.OnRollOver += delegate
                {
                    MarkerWrapper.activeMarker = markerWrapper;
                    Fsm.Event(OnRollOver);
                };
            }
            if (OnRollOut != null)
            {
                marker.OnRollOut += delegate
                {
                    MarkerWrapper.activeMarker = markerWrapper;
                    Fsm.Event(OnRollOut);
                };
            }
            if (OnLocationChanged != null)
            {
                marker.OnLocationChanged += delegate
                {
                    MarkerWrapper.activeMarker = markerWrapper;
                    Fsm.Event(OnLocationChanged);
                };
            }
            if (OnLongPress != null)
            {
                marker.OnLongPress += delegate
                {
                    MarkerWrapper.activeMarker = markerWrapper;
                    Fsm.Event(OnLongPress);
                };
            }
        }
    }
}