using Bolt;
using Ludiq;

namespace InfinityCode.OnlineMapsBolt
{
    [UnitTitle("Reset Tile Events")]
    public class ResetTileEvents : OnlineMapsBoltEventBase
    {
        [DoNotSerialize]
        public ValueInput tile { get; private set; }

        [DoNotSerialize]
        [PortLabel("Start Download Tile")]
        public ValueInput OnStartDownloadTile;

        [DoNotSerialize]
        [PortLabel("Tile Downloaded")]
        public ValueInput OnTileDownloaded;

        [DoNotSerialize]
        [PortLabel("All Tiles Loaded")]
        public ValueInput OnAllTilesLoaded;

        [DoNotSerialize]
        [PortLabel("Disposed")]
        public ValueInput OnDisposed;

        protected override void OnDefinition()
        {
            tile = ValueInput("tile", (OnlineMapsTile)null);
            OnStartDownloadTile = ValueInput("OnStartDownloadTile", false);
            OnTileDownloaded = ValueInput("OnTileDownloaded", false);
            OnAllTilesLoaded = ValueInput("OnAllTilesLoaded", false);
            OnDisposed = ValueInput("OnDisposed", false);
        }

        protected override void OnEnter(Flow flow)
        {
            if (flow.GetValue<bool>(OnStartDownloadTile)) OnlineMapsTileManager.OnStartDownloadTile = null;
            if (flow.GetValue<bool>(OnAllTilesLoaded)) OnlineMapsTile.OnAllTilesLoaded = null;
            if (flow.GetValue<bool>(OnTileDownloaded)) OnlineMapsTile.OnTileDownloaded = null;

            SubscribeToEvent(flow, ref OnlineMapsTile.OnAllTilesLoaded, OnAllTilesLoaded);
            SubscribeToEvent(flow, ref OnlineMapsTile.OnTileDownloaded, OnTileDownloaded);

            if (flow.GetValue<bool>(OnDisposed))
            {
                OnlineMapsTile t = flow.GetValue<OnlineMapsTile>(tile);
                if (t != null) t.OnDisposed = null;
            }
        }
    }
}