﻿using Bolt;
using Ludiq;

namespace InfinityCode.OnlineMapsBolt
{
    [UnitTitle("Subscribe To Map Events")]
    [UnitSubtitle("(arg - none)")]
    public class SubscribeToMapEvents : OnlineMapsBoltEventBase
    {
        [DoNotSerialize]
        [PortLabel("Click")]
        public ValueInput OnClick;

        [DoNotSerialize]
        [PortLabel("Double Click")]
        public ValueInput OnDoubleClick;

        [DoNotSerialize]
        [PortLabel("Drag")]
        public ValueInput OnDrag;

        [DoNotSerialize]
        [PortLabel("Long Press")]
        public ValueInput OnLongPress;

        [DoNotSerialize]
        [PortLabel("Press")]
        public ValueInput OnPress;

        [DoNotSerialize]
        [PortLabel("Release")]
        public ValueInput OnRelease;

        [DoNotSerialize]
        [PortLabel("Map Updated")]
        public ValueInput OnMapUpdated;

        [DoNotSerialize]
        [PortLabel("Position Changed")]
        public ValueInput OnPositionChanged;

        [DoNotSerialize]
        [PortLabel("Zoom Changed")]
        public ValueInput OnZoomChanged;

        protected override void OnDefinition()
        {
            OnClick = ValueInput("OnClick", string.Empty);
            OnDoubleClick = ValueInput("OnDoubleClick", string.Empty);
            OnDrag = ValueInput("OnDrag", string.Empty);
            OnLongPress = ValueInput("OnLongPress", string.Empty);
            OnPress = ValueInput("OnPress", string.Empty);
            OnRelease = ValueInput("OnRelease", string.Empty);
            OnPositionChanged = ValueInput("OnPositionChanged", string.Empty);
            OnZoomChanged = ValueInput("OnZoomChanged", string.Empty);
            OnMapUpdated = ValueInput("OnMapUpdated", string.Empty);
        }

        protected override void OnEnter(Flow flow)
        {
            OnlineMaps map = OnlineMaps.instance;
            OnlineMapsControlBase control = OnlineMapsControlBase.instance;

            SubscribeToEvent(flow, ref control.OnMapClick, OnClick);
            SubscribeToEvent(flow, ref control.OnMapDoubleClick, OnDoubleClick);
            SubscribeToEvent(flow, ref control.OnMapDrag, OnDrag);
            SubscribeToEvent(flow, ref control.OnMapLongPress, OnLongPress);
            SubscribeToEvent(flow, ref control.OnMapPress, OnPress);
            SubscribeToEvent(flow, ref control.OnMapRelease, OnRelease);

            SubscribeToEvent(flow, ref map.OnChangePosition, OnPositionChanged);
            SubscribeToEvent(flow, ref map.OnChangeZoom, OnZoomChanged);
            SubscribeToEvent(flow, ref map.OnMapUpdated, OnMapUpdated);
        }
    }
}
