package ru.dbotthepony.mc.otm.data.condition

import net.minecraft.world.entity.OwnableEntity
import net.minecraft.world.level.storage.loot.LootContext
import net.minecraft.world.level.storage.loot.parameters.LootContextParams
import net.minecraft.world.level.storage.loot.predicates.InvertedLootItemCondition
import net.minecraft.world.level.storage.loot.predicates.LootItemCondition
import net.minecraft.world.level.storage.loot.predicates.LootItemConditionType
import net.neoforged.neoforge.common.util.FakePlayer
import ru.dbotthepony.mc.otm.NULLABLE_MINECRAFT_SERVER
import ru.dbotthepony.mc.otm.data.get
import ru.dbotthepony.mc.otm.registry.data.MLootItemConditions

object KilledByRealPlayerOrIndirectly : LootItemCondition, LootItemCondition.Builder {
	override fun test(t: LootContext): Boolean {
		if (t.hasParam(LootContextParams.LAST_DAMAGE_PLAYER) && t[LootContextParams.LAST_DAMAGE_PLAYER] !is FakePlayer) {
			return true
		}

		if (t.hasParam(LootContextParams.ATTACKING_ENTITY)) {
			val killer = t[LootContextParams.ATTACKING_ENTITY] as? OwnableEntity

			if (killer != null) {
				val owner = killer.owner

				if (owner != null && owner !is FakePlayer) {
					return true
				}

				val ply = NULLABLE_MINECRAFT_SERVER?.playerList?.getPlayer(killer.ownerUUID ?: return false)
				return ply != null && ply !is FakePlayer
			}
		}

		return false
	}

	override fun getType(): LootItemConditionType {
		return MLootItemConditions.KILLED_BY_REAL_PLAYER_OR_INDIRECTLY
	}

	override fun build(): LootItemCondition {
		return this
	}

	val INVERTED: LootItemCondition = InvertedLootItemCondition.invert(this).build()
}
