package net.minecraft.world.entity.ai.attributes;

import net.minecraft.nbt.NBTTagList;

import com.bergerkiller.bukkit.common.nbt.CommonTagList;
import com.bergerkiller.bukkit.common.wrappers.Holder;

import com.bergerkiller.generated.net.minecraft.world.entity.ai.attributes.AttributeBaseHandle;
import com.bergerkiller.generated.net.minecraft.world.entity.ai.attributes.AttributeMapBaseHandle;
import com.bergerkiller.generated.net.minecraft.world.entity.ai.attributes.AttributeModifiableHandle;

class AttributeModifiable {
#if forge_nms_obfuscated
    public abstract void setValue:a(double value);
    public abstract double getValue:e();
#elseif version >= 1.18
    public abstract void setValue:setBaseValue(double value);
    public abstract double getValue:getBaseValue();
#else
    public abstract void setValue(double value);
    public abstract double getValue();
#endif
}

class AttributeMapBase {
#if version >= 1.18
    public (Set<AttributeModifiableHandle>) Set<AttributeModifiable> getAttributes:getDirtyAttributes();
    public (Collection<AttributeModifiableHandle>) Collection<AttributeModifiable> getSynchronizedAttributes:getSyncableAttributes();
#elseif version >= 1.16
    public (Set<AttributeModifiableHandle>) Set<AttributeModifiable> getAttributes();
    public (Collection<AttributeModifiableHandle>) Collection<AttributeModifiable> getSynchronizedAttributes:b();
#else
    public (Set<AttributeModifiableHandle>) Set<AttributeModifiable> getAttributes() {
        return ((AttributeMapServer) instance).getAttributes();
    }

    public (Collection<AttributeModifiableHandle>) Collection<AttributeModifiable> getSynchronizedAttributes() {
        return ((AttributeMapServer) instance).c();
    }
#endif

#if version >= 1.18
    public void loadFromNBT:load((CommonTagList) NBTTagList nbttaglist);
    public (CommonTagList) NBTTagList saveToNBT:save();
#elseif version >= 1.16
    public void loadFromNBT:a((CommonTagList) NBTTagList nbttaglist);
    public (CommonTagList) NBTTagList saveToNBT:c();
#else
    public void loadFromNBT((CommonTagList) NBTTagList nbttaglist) {
        GenericAttributes.a(instance, nbttaglist);
    }
    public (CommonTagList) NBTTagList saveToNBT() {
        return GenericAttributes.a(instance);
    }
#endif
}

// Note: on very old versions it also uses IAttribute, but thats always AttributeBase anyway
class AttributeBase {
#if version >= 1.18
    public String getDescriptionId();
#else
    public String getDescriptionId:getName();
#endif
}

class GenericAttributes {
    #bootstrap com.bergerkiller.bukkit.common.internal.CommonBootstrap.initServer();

#if version >= 1.20.5
    public static final (Holder<AttributeBaseHandle>) net.minecraft.core.Holder<AttributeBase> FOLLOW_RANGE;
    public static final (Holder<AttributeBaseHandle>) net.minecraft.core.Holder<AttributeBase> MOVEMENT_SPEED;
#elseif version >= 1.16
    public static final (Holder<AttributeBaseHandle>) AttributeBase FOLLOW_RANGE;
    public static final (Holder<AttributeBaseHandle>) AttributeBase MOVEMENT_SPEED;
#elseif version >= 1.8.4
    public static final (Holder<AttributeBaseHandle>) IAttribute FOLLOW_RANGE;
    public static final (Holder<AttributeBaseHandle>) IAttribute MOVEMENT_SPEED;
#else
    public static final (Holder<AttributeBaseHandle>) IAttribute FOLLOW_RANGE:b;
    public static final (Holder<AttributeBaseHandle>) IAttribute MOVEMENT_SPEED:d;
#endif
}
