using System;

using Unity.Jobs;
using RobocraftX.SimulationModeState;
using RobocraftX.StateSync;
using Svelto.ECS;

using GamecraftModdingAPI.Utility;

namespace GamecraftModdingAPI.Events
{
    /// <summary>
    /// Event emitter engine for switching to simulation mode.
    /// </summary>
	public class GameStateSimulationEmitterEngine : IEventEmitterEngine, IUnorderedInitializeOnTimeRunningModeEntered
	{
		public string Name { get; } = "GamecraftModdingAPIGameStateSimulationEventEmitter" ;

		public EntitiesDB entitiesDB { set; private get; }

		public int type { get; } = (int)EventType.SimulationSwitchedTo;

		public bool isRemovable { get; } = false;

		public IEntityFactory Factory { set; private get; }

		public void Dispose() { }

		public void Emit()
		{
			Logging.Log("Dispatching Simulation Switched To event");
			if (Factory == null) { return; }
			Factory.BuildEntity<ModEventEntityDescriptor>(ApiExclusiveGroups.eventID++, ApiExclusiveGroups.eventsExclusiveGroup)
			       .Init(new ModEventEntityStruct { type = type });
		}

		public void EmitIfSimMode()
        {
			if (entitiesDB.QueryUniqueEntity<SimulationModeStateEntityStruct>(SimulationModeStateExclusiveGroups.GAME_STATE_GROUP).nextSimulationMode == SimulationMode.TimeRunning)
            {
                Emit();
            }
        }

		public JobHandle OnInitializeTimeRunningMode()
		{
			Emit();
			return default(JobHandle);
		}

		public void Ready() { }
	}
}