package com.r3944realms.leashedplayer;

import com.mojang.brigadier.CommandDispatcher;
import com.r3944realms.leashedplayer.content.commands.*;
import com.r3944realms.leashedplayer.content.effects.ModPotionRegister;
import com.r3944realms.leashedplayer.content.entities.LittlePlayer;
import com.r3944realms.leashedplayer.content.entities.ModEntityRegister;
import com.r3944realms.leashedplayer.content.gamerules.GameruleRegistry;
import com.r3944realms.leashedplayer.content.gamerules.Server.OpenTOPNeededModeWhenScreenIsNotNull;
import com.r3944realms.leashedplayer.content.items.ModItemRegister;
import com.r3944realms.leashedplayer.content.misc.LeadBreakItemBehavior;
import com.r3944realms.leashedplayer.network.client.BooleanGameRuleValueChangeData;
import com.r3944realms.leashedplayer.utils.Logger;
import com.r3944realms.leashedplayer.utils.Util;
import io.github.kunosayo.nestle.init.ModCreativeTab;
import net.minecraft.ChatFormatting;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.core.component.DataComponents;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.tags.ItemTags;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.animal.Fox;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.alchemy.PotionBrewing;
import net.minecraft.world.item.alchemy.Potions;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.DispenserBlock;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent;
import net.neoforged.neoforge.event.AnvilUpdateEvent;
import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent;
import net.neoforged.neoforge.event.RegisterCommandsEvent;
import net.neoforged.neoforge.event.brewing.RegisterBrewingRecipesEvent;
import net.neoforged.neoforge.event.entity.EntityAttributeCreationEvent;
import net.neoforged.neoforge.event.entity.player.PlayerEvent;
import net.neoforged.neoforge.event.tick.EntityTickEvent;
import net.neoforged.neoforge.network.PacketDistributor;


public class CommonEventHandler {
    @EventBusSubscriber(modid = LeashedPlayer.MOD_ID)
    public static class Game extends CommonEventHandler {
        @SubscribeEvent
        public static void onRegisterCommander(RegisterCommandsEvent event) {
            CommandDispatcher<CommandSourceStack> dispatcher = event.getDispatcher();
            LeashCommand.register(dispatcher);
            MotionCommand.register(dispatcher);
            ChatCommand.register(dispatcher);
            TickCommand.register(dispatcher);
            DebugCommand.register(dispatcher);
        }

        @SubscribeEvent
        public static void onJoinServer(PlayerEvent.PlayerLoggedInEvent event) {
            PacketDistributor.sendToPlayer((ServerPlayer) event.getEntity(),
                    new BooleanGameRuleValueChangeData(
                            OpenTOPNeededModeWhenScreenIsNotNull.ID,
                            GameruleRegistry.getGameruleBoolValue(
                                    event.getEntity().level(),
                                    OpenTOPNeededModeWhenScreenIsNotNull.ID)
                    )
            );
        }


        @SubscribeEvent
        public static void OnRegisterPotionBrewing(RegisterBrewingRecipesEvent event) {
            PotionBrewing.Builder builder = event.getBuilder();
            builder.addMix(Potions.WATER, Items.SLIME_BALL, ModPotionRegister.NO_LEASH);
        }

        @SubscribeEvent
        public static void OnAnvilUpdated(AnvilUpdateEvent event) {
            String name = event.getName();
            ItemStack left = event.getLeft();
            if (left.is(Items.ANVIL) && name != null && name.equals("NeoForge")) {
                event.setCost(1);
               event.setOutput(ModItemRegister.NEOFORGE.get().getDefaultInstance());
            } else if (left.is(ModItemRegister.NEOFORGE.get().asItem()) && name != null && name.equals("Forge")) {
                ItemStack instance = Items.ANVIL.getDefaultInstance();
                instance.set(DataComponents.CUSTOM_NAME, Component.literal("Forge").withStyle(ChatFormatting.BOLD).withStyle(ChatFormatting.AQUA));
                event.setOutput(instance);
                event.setCost(1);
            }
        }

        @SubscribeEvent
        public static void OnLivingTickEvent(EntityTickEvent.Post event) {
            Entity entity = event.getEntity();
            Level level = entity.level();
            if (level.isClientSide()) {
                return;
            }
                if (entity instanceof Fox fox) {
                    if (fox.getMainHandItem().is(ItemTags.ANVIL)) {
                        fox.setItemSlot(EquipmentSlot.MAINHAND, ItemStack.EMPTY);
                        Util.throwItemTowardsLook(fox, ModItemRegister.NEOFORGE.get(), 0.3f, 0.1f);
                        fox.playSound(fox.getEatingSound(ItemStack.EMPTY));
                    } else if (fox.getMainHandItem().is(ModItemRegister.NEOFORGE.get())) {
                        // 繞圈參數
                        float rotationSpeed = 10.0f;  // 每 tick 旋轉的角度
                        // 計算新的旋轉角度
                        fox.yBodyRot += rotationSpeed;     // 身體旋轉
                        fox.yHeadRot += rotationSpeed;     // 頭部旋轉
                        fox.yRotO += rotationSpeed;        // 當前旋轉角度
                        fox.yHeadRotO += rotationSpeed;    // 頭部的當前旋轉角度

                        // 確保旋轉角度不超出 360 度，重置為 0 以便持續旋轉
                        if (fox.yBodyRot >= 360) fox.yBodyRot -= 360;
                        if (fox.yHeadRot >= 360) fox.yHeadRot -= 360;

                    }
                }
            }
        }

        @EventBusSubscriber(modid = LeashedPlayer.MOD_ID, bus = EventBusSubscriber.Bus.MOD)
        public static class Mod extends CommonEventHandler {
            @SubscribeEvent
            public static void onCommonSetup(FMLCommonSetupEvent event) {
                event.enqueueWork(() -> {
                    if (LeashedPlayer.IS_NESTLE_LOADED) {
                        Logger.logger.info("[LeashedPlayer] Hello, Nestle");
                        DispenserBlock.registerProjectileBehavior(ModItemRegister.NESTLE_ROPE_ARROW.get());
                    }
                    DispenserBlock.registerProjectileBehavior(ModItemRegister.LEASH_ROPE_ARROW.get());
                    DispenserBlock.registerProjectileBehavior(ModItemRegister.TIPPED_LEASH_ROPE_ARROW.get());
                    DispenserBlock.registerProjectileBehavior(ModItemRegister.SPECTRAL_LEASH_ROPE_ARROW.get());
                    DispenserBlock.registerBehavior(ModItemRegister.AMETHYST_SHEARS.get(), new LeadBreakItemBehavior());
                });
            }

            @SubscribeEvent
            public static void onEntityAttributeEvent(EntityAttributeCreationEvent event) {
                event.put(ModEntityRegister.KID.get(), LittlePlayer.createAttributes().build());
            }

            @SubscribeEvent
            public static void onBuiltCreativeModeTabContents(BuildCreativeModeTabContentsEvent event) {
                if (LeashedPlayer.IS_NESTLE_LOADED){
                    CreativeModeTab tab = event.getTab();
                    if (tab == ModCreativeTab.MAIN_TABS.get()) {
                        event.accept(ModItemRegister.NESTLE_ROPE_ARROW.get());
                    }
                }
            }

        }

}


