package com.xfestudio.mydimensionlord.item;

import com.xfestudio.mydimensionlord.equipment.EquipmentPowers;
import com.xfestudio.mydimensionlord.equipment.EquipmentRules;
import com.xfestudio.mydimensionlord.platform.EquipmentCombat;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResultHolder;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.*;
import net.minecraft.world.level.Level;

public final class DimensionBladeItem extends SwordItem {
    @Override public void initializeClient(java.util.function.Consumer<net.minecraftforge.client.extensions.common.IClientItemExtensions> consumer) {
        com.xfestudio.mydimensionlord.client.gear.EquipmentClientExtensions.initialize(consumer);
    }
    public DimensionBladeItem(Tier tier, Item.Properties properties) { super(tier, properties.attributes(SwordItem.createAttributes(tier, EquipmentRules.BLADE_ATTACK_BONUS, -2.6F))); }
    @Override public InteractionResultHolder<ItemStack> use(Level level, Player player, InteractionHand hand) {
        if (hand != InteractionHand.MAIN_HAND) return super.use(level, player, hand);
        ItemStack stack = player.getItemInHand(hand);
        if (EquipmentCombat.cooling(player, stack)) return InteractionResultHolder.fail(stack);
        player.startUsingItem(hand);
        return InteractionResultHolder.consume(stack);
    }
    @Override public int getUseDuration(ItemStack stack, LivingEntity entity) { return EquipmentRules.BLADE_USE_DURATION; }
    @Override public UseAnim getUseAnimation(ItemStack stack) { return UseAnim.NONE; }
    @Override public boolean useOnRelease(ItemStack stack) { return true; }
    @Override public void onUseTick(Level level, LivingEntity entity, ItemStack stack, int remaining) {
        if (!level.isClientSide() && entity instanceof Player player) {
            int ticks = EquipmentRules.BLADE_USE_DURATION - remaining;
            if (ticks % 5 == 0) player.displayClientMessage(net.minecraft.network.chat.Component.translatable(
                    "message.mydimension_lord.blade.charge", (int)(100 * EquipmentRules.chargeFraction(ticks))), true);
            if (ticks == EquipmentRules.BLADE_CHARGE_TICKS) level.playSound(null, player.blockPosition(),
                    net.minecraft.sounds.SoundEvents.AMETHYST_BLOCK_RESONATE, net.minecraft.sounds.SoundSource.PLAYERS, .65F, 1.5F);
        }
    }
    @Override public void releaseUsing(ItemStack stack, Level level, LivingEntity entity, int remaining) {
        boolean released = entity instanceof Player player && player.getUsedItemHand() == InteractionHand.MAIN_HAND
                && player.getMainHandItem() == stack && !EquipmentCombat.cooling(player, stack);
        if (released && !level.isClientSide()) {
            Player player = (Player)entity;
            EquipmentPowers.slash(player, stack, InteractionHand.MAIN_HAND, EquipmentRules.BLADE_USE_DURATION - remaining);
            player.displayClientMessage(net.minecraft.network.chat.Component.empty(), true);
        }
    }
}
