package pers.neige.neigeitems.ref.damagesource;

import org.inksnow.ankhinvoke.comments.HandleBy;
import org.jetbrains.annotations.Nullable;
import pers.neige.neigeitems.ref.chat.RefComponent;
import pers.neige.neigeitems.ref.entity.RefEntity;
import pers.neige.neigeitems.ref.entity.RefEntityLiving;
import pers.neige.neigeitems.ref.registry.RefHolder;
import pers.neige.neigeitems.ref.tags.RefTagKey;
import pers.neige.neigeitems.ref.world.RefVec3;

@HandleBy(reference = "net/minecraft/world/damagesource/DamageSource", predicates = "craftbukkit_version:[v1_17_R1,)")
public class RefDamageSource {
    @HandleBy(reference = "Lnet/minecraft/world/damagesource/DamageSource;<init>(Lnet/minecraft/core/Holder;Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/phys/Vec3;)V", useAccessor = true, predicates = "craftbukkit_version:[v1_17_R1,)")
    public RefDamageSource(RefHolder<RefDamageType> type, @Nullable RefEntity source, @Nullable RefEntity attacker, @Nullable RefVec3 position) {
        throw new UnsupportedOperationException();
    }

    @HandleBy(reference = "Lnet/minecraft/world/damagesource/DamageSource;<init>(Lnet/minecraft/core/Holder;Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/entity/Entity;)V", predicates = "craftbukkit_version:[v1_17_R1,)")
    public RefDamageSource(RefHolder<RefDamageType> type, @Nullable RefEntity source, @Nullable RefEntity attacker) {
        throw new UnsupportedOperationException();
    }

    @HandleBy(reference = "Lnet/minecraft/world/damagesource/DamageSource;<init>(Lnet/minecraft/core/Holder;Lnet/minecraft/world/phys/Vec3;)V", predicates = "craftbukkit_version:[v1_17_R1,)")
    public RefDamageSource(RefHolder<RefDamageType> type, RefVec3 position) {
        throw new UnsupportedOperationException();
    }

    @HandleBy(reference = "Lnet/minecraft/world/damagesource/DamageSource;<init>(Lnet/minecraft/core/Holder;Lnet/minecraft/world/entity/Entity;)V", predicates = "craftbukkit_version:[v1_17_R1,)")
    public RefDamageSource(RefHolder<RefDamageType> type, RefEntity attacker) {
        throw new UnsupportedOperationException();
    }

    @HandleBy(reference = "Lnet/minecraft/world/damagesource/DamageSource;<init>(Lnet/minecraft/core/Holder;)V", predicates = "craftbukkit_version:[v1_17_R1,)")
    public RefDamageSource(RefHolder<RefDamageType> type) {
        throw new UnsupportedOperationException();
    }

    @HandleBy(reference = "Lnet/minecraft/world/damagesource/DamageSource;isSweep()Z", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native boolean isSweep();

    @HandleBy(reference = "Lnet/minecraft/world/damagesource/DamageSource;sweep()Lnet/minecraft/world/damagesource/DamageSource;", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native RefDamageSource sweep();

    @HandleBy(reference = "Lnet/minecraft/world/damagesource/DamageSource;isMelting()Z", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native boolean isMelting();

    @HandleBy(reference = "Lnet/minecraft/world/damagesource/DamageSource;melting()Lnet/minecraft/world/damagesource/DamageSource;", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native RefDamageSource melting();

    @HandleBy(reference = "Lnet/minecraft/world/damagesource/DamageSource;isPoison()Z", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native boolean isPoison();

    @HandleBy(reference = "Lnet/minecraft/world/damagesource/DamageSource;poison()Lnet/minecraft/world/damagesource/DamageSource;", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native RefDamageSource poison();

    @HandleBy(reference = "Lnet/minecraft/world/damagesource/DamageSource;getFoodExhaustion()F", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native float getFoodExhaustion();

    @HandleBy(reference = "Lnet/minecraft/world/damagesource/DamageSource;isIndirect()Z", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native boolean isIndirect();

    @HandleBy(reference = "Lnet/minecraft/world/damagesource/DamageSource;getDirectEntity()Lnet/minecraft/world/entity/Entity;", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native RefEntity getDirectEntity();

    @HandleBy(reference = "Lnet/minecraft/world/damagesource/DamageSource;getEntity()Lnet/minecraft/world/entity/Entity;", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native RefEntity getEntity();

    @HandleBy(reference = "Lnet/minecraft/world/damagesource/DamageSource;getLocalizedDeathMessage(Lnet/minecraft/world/entity/LivingEntity;)Lnet/minecraft/network/chat/Component;", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native RefComponent getLocalizedDeathMessage(RefEntityLiving killed);

    @HandleBy(reference = "Lnet/minecraft/world/damagesource/DamageSource;getMsgId()Ljava/lang/String;", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native String getMsgId();

    @HandleBy(reference = "Lnet/minecraft/world/damagesource/DamageSource;scalesWithDifficulty()Z", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native boolean scalesWithDifficulty();

    @HandleBy(reference = "Lnet/minecraft/world/damagesource/DamageSource;isCreativePlayer()Z", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native boolean isCreativePlayer();

    @HandleBy(reference = "Lnet/minecraft/world/damagesource/DamageSource;getSourcePosition()Lnet/minecraft/world/phys/Vec3;", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native RefVec3 getSourcePosition();

    @HandleBy(reference = "Lnet/minecraft/world/damagesource/DamageSource;sourcePositionRaw()Lnet/minecraft/world/phys/Vec3;", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native RefVec3 sourcePositionRaw();

    @HandleBy(reference = "Lnet/minecraft/world/damagesource/DamageSource;is(Lnet/minecraft/tags/TagKey;)Z", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native boolean is(RefTagKey<RefDamageType> tag);

    @HandleBy(reference = "Lnet/minecraft/world/damagesource/DamageSource;type()Lnet/minecraft/world/damagesource/DamageType;", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native RefDamageType type();

    @HandleBy(reference = "Lnet/minecraft/world/damagesource/DamageSource;typeHolder()Lnet/minecraft/core/Holder;", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native RefHolder<RefDamageType> typeHolder();

    // critical相关判断为paper独有
//    @HandleBy(reference = "Lnet/minecraft/world/damagesource/DamageSource;isCritical()Z", predicates = "craftbukkit_version:[v1_17_R1,)")
//    public native boolean isCritical();
//
//    @HandleBy(reference = "Lnet/minecraft/world/damagesource/DamageSource;critical()Lnet/minecraft/world/damagesource/DamageSource;", predicates = "craftbukkit_version:[v1_17_R1,)")
//    public native RefDamageSource critical();
//
//    @HandleBy(reference = "Lnet/minecraft/world/damagesource/DamageSource;critical(Z)Lnet/minecraft/world/damagesource/DamageSource;", predicates = "craftbukkit_version:[v1_17_R1,)")
//    public native RefDamageSource critical(boolean critical);
}
