using System.Diagnostics;
using System.Reflection;
using EFT;
using EFT.HealthSystem;
using EFT.UI;
using LootValueEX.Extensions;
using SPT.Reflection.Patching;
// ReSharper disable InconsistentNaming

namespace LootValueEX.Patches.Screens
{
    internal class InventoryScreenPatch : ModulePatch
    {
        protected override MethodBase GetTargetMethod() => typeof(InventoryScreen).GetMethods().SingleOrDefault(method => method.Name == "Show" && method.GetParameters()[0].ParameterType == typeof(IHealthController));

        [PatchPostfix]
        private static void PatchPostfix(ref Profile ___profile_0, ref LootItemClass ___lootItemClass)
        {
            Profile profile = ___profile_0;

            TaskCompletionSource<bool> tcsInventory = new();
            CancellationTokenSource ctsInventory = new CancellationTokenSource(5000);
            Task<bool> taskInventory = tcsInventory.Task;
            Task.Factory.StartNew(async () =>
            {
                Stopwatch sw = Stopwatch.StartNew();
                foreach(EFT.InventoryLogic.Item item in profile.Inventory.GetPlayerItems(EFT.InventoryLogic.EPlayerItems.Equipment))
                {
                    //Plugin.Log.LogDebug($"Equip Process: {item.LocalizedName()} ({item.TemplateId}): {await item.GetCustomHashAsync()}");
                    continue;
                }
                sw.Stop();
                Plugin.Log.LogDebug($"Equipment processing finished in {sw.ElapsedMilliseconds}ms");
                tcsInventory.SetResult(true);
            }, ctsInventory.Token);

            if(___lootItemClass != null)
            {
                LootItemClass lootItemClass = ___lootItemClass;
                TaskCompletionSource<bool> tcsLoot = new();
                CancellationTokenSource ctsLoot = new CancellationTokenSource(5000);
                Task<bool> taskLoot = tcsLoot.Task;
                Task.Factory.StartNew(async () =>
                {
                    Stopwatch sw = Stopwatch.StartNew();
                    foreach (EFT.InventoryLogic.Item item in lootItemClass.GetAllItems())
                    {
                        //Plugin.Log.LogDebug($"LootItemClass process: {item.LocalizedName()} ({item.TemplateId}): {await item.GetCustomHashAsync()}");
                        continue;
                    }
                    Plugin.Log.LogDebug($"LootItemClass processing finished in {sw.ElapsedMilliseconds}ms");
                    tcsLoot.SetResult(true);
                }, ctsLoot.Token);
            }
        }
    }
}
