package ehacks.mod.modulesystem.classes.mods.projectred;

import ehacks.mod.api.ModStatus;
import ehacks.mod.api.Module;
import ehacks.mod.modulesystem.classes.keybinds.GiveKeybind;
import ehacks.mod.util.InteropUtils;
import ehacks.mod.wrapper.ModuleCategory;
import ehacks.mod.wrapper.Statics;
import ehacks.mod.wrapper.Wrapper;
import net.minecraft.item.ItemStack;
import org.lwjgl.input.Keyboard;

public class RedHack
        extends Module {

    public RedHack() {
        super(ModuleCategory.EHACKS);
    }

    @Override
    public String getName() {
        return "RedHack";
    }

    @Override
    public String getDescription() {
        return "Allows you to give any ItemStack to your hand\nUsage:\n  Numpad0 - Gives an item";
    }

    @Override
    public void onModuleEnabled() {
        try {
            Class.forName("mrtjp.projectred.transportation.TransportationSPH$");
            Class.forName("codechicken.lib.packet.PacketCustom");
        } catch (Exception ex) {
            this.off();
        }
    }

    @Override
    public ModStatus getModStatus() {
        try {
            Class.forName("mrtjp.projectred.transportation.TransportationSPH$");
            Class.forName("codechicken.lib.packet.PacketCustom");
            return ModStatus.WORKING;
        } catch (Exception e) {
            return ModStatus.NOTWORKING;
        }
    }

    @Override
    public void onModuleDisabled() {

    }

    private boolean prevState = false;

    @Override
    public void onTicks() {
        boolean newState = Keyboard.isKeyDown(GiveKeybind.getKey());
        if (newState && !prevState) {
            prevState = newState;
            int slotId = Wrapper.INSTANCE.player().inventory.currentItem;
            if (Statics.STATIC_ITEMSTACK == null) {
                return;
            }
            setRed(Statics.STATIC_ITEMSTACK, slotId);
            InteropUtils.log("Set", this);
        }
        prevState = newState;
    }

    //Only works with project red mechanical
    public void setRed(ItemStack item, int slotId) {
        try {
            Object packetInstance = Class.forName("codechicken.lib.packet.PacketCustom").getConstructor(Object.class, Integer.TYPE).newInstance("PR|Transp", 4);
            Class.forName("codechicken.lib.packet.PacketCustom").getMethod("writeByte", Byte.TYPE).invoke(packetInstance, (byte) slotId);
            Class.forName("codechicken.lib.packet.PacketCustom").getMethod("writeItemStack", ItemStack.class).invoke(packetInstance, item);
            Class.forName("codechicken.lib.packet.PacketCustom").getMethod("sendToServer").invoke(packetInstance);
        } catch (Exception ex) {
        }
    }

    @Override
    public String getModName() {
        return "Project Red";
    }
}