using System;
using System.Diagnostics.CodeAnalysis;
using Assets.Scripts;
using Assets.Scripts.Objects.Electrical;
using HarmonyLib;
using JetBrains.Annotations;

namespace RemoteControl.Patches
{
    [HarmonyPatch(typeof(LogicStack), nameof(LogicStack.LogicStackTick))]
    [SuppressMessage("ReSharper", "InconsistentNaming")]
    // ReSharper disable once InconsistentNaming
    public class LogicStack_LogicStackTick
    {
        private struct State
        {
            internal object LockObj;
            internal bool Taken;
        }
        
        [UsedImplicitly]
        private static void Prefix(out State __state)
        {
            __state = new State
            {
                LockObj = SubscriptionManager.Lock,
                Taken = false
            };
            if (!GameManager.RunSimulation) return;
            // System.Threading.Monitor.Enter(__state.LockObj, ref __state.Taken);
            try
            {
                RemoteControl.Log("logic stack tick: start prefix");
                SubscriptionManager.ApplyUpdates();
                RemoteControl.Log("logic stack tick: end prefix");
            }
            catch (Exception e)
            {
                RemoteControl.Log($"prefix: Exception {e}:\n {e.StackTrace}");
            }
        }

        [UsedImplicitly]
        private static void Postfix(State __state)
        {
            try
            {
                if (!GameManager.RunSimulation) return;
                SubscriptionManager.RescanNetworks();
            }
            catch (Exception e)
            {
                RemoteControl.Log("logic stack tick: start postfix");
                RemoteControl.Log($"postfix: Exception {e}: \n{e.StackTrace}");
                RemoteControl.Log("logic stack tick: end postfix");
            }
            finally
            {
                // if (__state.Taken)
                // {
                //     System.Threading.Monitor.Exit(__state.LockObj);
                // }
            }
            
        }
    }
    
    
}