package net.mcsweatshop.createdecopouches.net;

import net.mcsweatshop.createdecopouches.core.Pouch;
import net.mcsweatshop.createdecopouches.events.ModForgeEvents;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.server.level.ServerPlayer;
import net.minecraftforge.network.NetworkEvent;

import java.util.function.Supplier;

public class MouseReleasedPacket {
    public final int count;

    public MouseReleasedPacket(int count){
        this.count = count;
    }

    public MouseReleasedPacket(FriendlyByteBuf friendlyByteBuf) {
        count=friendlyByteBuf.readInt();
    }

    public void encode(FriendlyByteBuf friendlyByteBuf) {
        friendlyByteBuf.writeInt(count);
    }

    public void handle(Supplier<NetworkEvent.Context> contextSupplier) {
        ServerPlayer sender = contextSupplier.get().getSender();;
        if (sender==null) return;
        if (ModForgeEvents.playersGettingTicked.containsKey(sender.getName().getString())){
            ModForgeEvents.playerQueue.removeIf(b->b.player().getName().getString().equals(sender.getName().getString()));
            ModForgeEvents.PlayerToTick playerToTick = ModForgeEvents.playersGettingTicked.remove(sender.getName().getString());
            System.out.println("player queue length: "+ModForgeEvents.playerQueue.size()+" player ti len: "+ModForgeEvents.playersGettingTicked.size());
            System.out.println("item now: "+playerToTick.itemStackToAddTo.getDisplayName().getString());
            playerToTick.itemStackToAddTo.setCount(count);
            System.out.println("count to be added: "+count);
            System.out.println("item now: "+playerToTick.itemStackToAddTo.getDisplayName().getString());
            Pouch.removeXAmountOfItems(playerToTick.pouch, playerToTick.itemStackToAddTo.serializeNBT(), count);

        }
    }
}
//    public static AtomicBoolean hasTicked =new AtomicBoolean(false);
//    @SubscribeEvent
//    public static void mouseHandling(ScreenEvent.MouseButtonReleased.Pre e){
//
////        boolean button = Minecraft.getInstance().mouseHandler.;
////        Minecraft.getInstance().
////        System.out.println("mouse:  "+button);
////
////        if (e.phase== TickEvent.Phase.START) return;
//        if (itemStackAtomicReference.get()==null) return;
//        if (e.getButton()==1) {
//            System.out.println(itemStackAtomicReference.get()+" is the count");
//            PacketHandler.INSTANCE.sendToServer(new MouseReleasedPacket(itemStackAtomicReference.get().getCount()));
//
//        }
//        itemStackAtomicReference.set(null);
//    }
//    @SubscribeEvent
//    public static void itemStackOnOtherEvent(ItemStackedOnOtherEvent e){
////        if (e.getClickAction()==ClickAction.PRIMARY) return;
////        if (!e.getSlot().getItem().is(CoinPouches.POUCH.get())) return;
////        e.setCanceled(true);
////        e.getSlot().getItem().overrideOtherStackedOnMe(e.getSlot().getItem(),e.getSlot(),e.getClickAction(),e.getPlayer(),e.getCarriedSlotAccess());
//
//    }

    public static List<QueuedPlayer> playerQueue = new ArrayList<>();

    public record QueuedPlayer(Player player, AtomicInteger delayLeft) { }
    public static Map<String, PlayerToTick> playersGettingTicked = new HashMap<>();
    public static class PlayerToTick {
        public final Player player;
        public boolean delayFinished = false;
        public final int delayBetweenPicks;
        public int delaySinceLastPick=0;
        public final ItemStack itemStackToAddTo;
        public final ItemStack pouch;
        public final int originalCount;

        public PlayerToTick(Player player, int delayBetweenPick, ItemStack itemStackToAddTo, ItemStack pouch) {
            this.player = player;
            this.delayBetweenPicks = delayBetweenPick;
            this.itemStackToAddTo = itemStackToAddTo;
            this.pouch = pouch;
            originalCount=itemStackToAddTo.getCount();
        }
    }


    @SubscribeEvent
    public static void tick(TickEvent.ServerTickEvent e){
        if(e.side== LogicalSide.CLIENT) return;
        if (e.phase== TickEvent.Phase.START) return;
        playerQueue.forEach((p)-> {
            p.delayLeft.set(p.delayLeft.get()-1);
            String player = p.player.getName().getString();
            if (p.delayLeft.get()<=0&&playersGettingTicked.containsKey(player)) playersGettingTicked.get(player).delayFinished=true;
        });
        playerQueue.removeIf(p -> p.delayLeft().get()<=0);
//        playersGettingTicked.forEach(ModForgeEvents::tickPlayers);
        AtomicInteger integer=new AtomicInteger();
        playersGettingTicked.forEach((a,b)->tickPlayers(a,b,integer));

    }

    @NotNull
    private static void tickPlayers(String name, PlayerToTick playerToTick,AtomicInteger atomicInteger) {
        if (!playerToTick.delayFinished) return;
        if (playerToTick.delayBetweenPicks > playerToTick.delaySinceLastPick) {
            playerToTick.delaySinceLastPick++;
            atomicInteger.set(atomicInteger.get()+1);
            return;
        }
        playerToTick.delaySinceLastPick=0;
        System.out.println("gettign ran?");
//       verify that we can add more to the stack being carried, i.e the pouch actually has more
        ItemStack itemStackToAddTo = playerToTick.itemStackToAddTo;
        int itemCountWithId = Pouch.getItemCountWithId(playerToTick.pouch, itemStackToAddTo.serializeNBT());
        if (itemCountWithId <= itemStackToAddTo.getCount()) {

            return;
        }
        if (itemStackToAddTo.getCount()+1>=Pouch.getCountItemsInside(playerToTick.pouch)) return;
        if (itemStackToAddTo.getCount() >= itemStackToAddTo.getMaxStackSize()) return;
        itemStackToAddTo.setCount(itemStackToAddTo.getCount() + 1);


    }
        public static boolean OtherStackedOnMe(@NotNull ItemStack pouch, @NotNull ItemStack TheOtherStack, @NotNull Slot slot, @NotNull ClickAction clickAction, @NotNull Player player, @NotNull SlotAccess slotAccess) {
    //        System.out.println("say what...");
    //        if (clickAction==ClickAction.PRIMARY) return false;
    //        if (pouch==TheOtherStack) return false;
    //        if (slot.getItem()!=pouch) return false;
    //        if (TheOtherStack==slot.getItem()) return false;
    //        if (ItemStack.EMPTY.is(TheOtherStack.getItem())) {
    //            //also update #net.mcsweatshop.createdecopouches.events.ModForgeEvents.itemStackOnOtherEvent
    //            ItemStack nextItem = getNextItem(pouch, false);
    //            nextItem.setCount(1);
    //            player.inventoryMenu.setCarried(nextItem);
    //
    //            return false;
    //        };
    //        if(!addItem(pouch,TheOtherStack)) return false;
    //        TheOtherStack.setCount(0);
            return true;
        }

            public static void removeXAmountOfItems(ItemStack pouch, CompoundTag item, int Count){
                decreaseItemCount(pouch,item,Count);
        //        item.remove("Count");
        //        if (getCountItemsInside(pouch)<=0) return;
        //        try {
        //            if(!pouch.getOrCreateTag().contains("items")) pouch.getOrCreateTag().put("items", new ListTag());
        //
        //            ListTag list = pouch.getOrCreateTag().getList("items", Tag.TAG_COMPOUND);
        //            List<Tag> tagsToDelete=new ArrayList<>();
        //            int countDeleted=0;
        //            for (Tag tag : list) {
        //                if (countDeleted>=Count) continue;
        //                Tag copy=tag.copy();
        //                if (!(copy instanceof CompoundTag ct)) continue;
        //                int CountOfCurrentItem=ct.getInt("Count");
        //                ct.remove("Count");
        //                System.out.println("checking: "+ct.getString("id")+" against "+item.getString("id"));
        //                if (!ct.equals(item)) {
        //                    ct.putInt("Count",CountOfCurrentItem);
        //                    continue;
        //                }
        //                System.out.println("it did equal");
        //                countDeleted=countDeleted+CountOfCurrentItem;
        //                tagsToDelete.add(tag);
        //            }
        //            for (Tag tag : tagsToDelete) {
        //                System.out.println("tag removed "+list.remove(tag));
        //            }
        //            int remainder= countDeleted-Count;
        //            //generate remainder
        //            item.putInt("Count",64);
        //            for (int i = 0; i < remainder / 64; i++) {
        //                list.add(item.copy());
        //                System.out.println("ran count "+(remainder/64)+" and iteration "+i);
        //            }
        //            item.putInt("Count",remainder%64);
        //            System.out.println("mod of count: "+(remainder%64)+" id: "+item.getString("id"));
        //            System.out.println("count to be deleted: "+remainder);
        //            if(remainder>0)list.add(item.copy());
        //            decreaseItemCount(pouch,item, Count);
        //            pouch.getOrCreateTag().putInt("itemcount",getCountItemsInside(pouch)-Count);
        //
        //            pouch.getOrCreateTag().put("items",list);
        //
        //        } catch (Exception e) {
        //            System.out.println(e.getMessage());
        //        }
            }