using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

using HarmonyLib;
using RobocraftX;
using Svelto.ECS;

using GamecraftModdingAPI.Utility;
using RobocraftX.CR.MainGame;

namespace GamecraftModdingAPI.Events
{
    /// <summary>
    /// Patch of RobocraftX.FullGameCompositionRoot.ActivateGame()
    /// </summary>
	[HarmonyPatch]
    class GameActivatedComposePatch
    {
		public static bool IsGameSwitching = false;

		public static bool IsGameReloading = false;

        public static void Postfix(ref object contextHolder, ref EnginesRoot enginesRoot)
        {
            // register custom game engines
			GameEngineManager.RegisterEngines(enginesRoot);
            // A new EnginesRoot is always created when ActivateGame is called
            // so all event emitters and handlers must be re-registered.
			EventManager.RegisterEngines(enginesRoot);
            Logging.Log("Dispatching Game Activated event");
            EventManager.GetEventEmitter("GamecraftModdingAPIGameActivatedEventEmitter").Emit();
			if (IsGameSwitching)
			{
				IsGameSwitching = false;
                Logging.Log("Dispatching Game Switched To event");
                EventManager.GetEventEmitter("GamecraftModdingAPIGameSwitchedToEventEmitter").Emit();
			}
			if (IsGameReloading)
			{
				IsGameReloading = false;
				Logging.Log("Dispatching Game Reloaded event");
                EventManager.GetEventEmitter("GamecraftModdingAPIGameReloadedEventEmitter").Emit();
			}
        }

        public static MethodBase TargetMethod()
        {
            return typeof(MainGameCompositionRoot).GetMethods().First(m => m.Name == "Compose")
                .MakeGenericMethod(typeof(object));
        }
    }
}