package moe.nea.firmament.features.debug

import net.minecraft.component.DataComponentTypes
import net.minecraft.entity.Entity
import moe.nea.firmament.annotations.Subscribe
import moe.nea.firmament.commands.thenExecute
import moe.nea.firmament.commands.thenLiteral
import moe.nea.firmament.events.CommandEvent
import moe.nea.firmament.events.EntityUpdateEvent
import moe.nea.firmament.util.MC
import moe.nea.firmament.util.skyBlockId
import moe.nea.firmament.util.tr

object AnimatedClothingScanner {

	var observedEntity: Entity? = null

	@OptIn(ExperimentalStdlibApi::class)
	@Subscribe
	fun onUpdate(event: EntityUpdateEvent) {
		if (event.entity != observedEntity) return
		if (event is EntityUpdateEvent.EquipmentUpdate) {
			event.newEquipment.forEach {
				val id = it.second.skyBlockId?.neuItem
				val colour = it.second.get(DataComponentTypes.DYED_COLOR)
					?.rgb?.toHexString(HexFormat.UpperCase)
					?.let { " #$it" } ?: ""
				MC.sendChat(tr("firmament.fitstealer.update",
				               "[FIT CHECK][${MC.currentTick}] ${it.first.asString()} => ${id}${colour}"))
			}
		}
	}

	@Subscribe
	fun onSubCommand(event: CommandEvent.SubCommand) {
		event.subcommand("dev") {
			thenLiteral("stealthisfit") {
				thenExecute {
					observedEntity =
						if (observedEntity == null) MC.instance.targetedEntity else null

					MC.sendChat(
						observedEntity?.let {
							tr("firmament.fitstealer.targeted", "Observing the equipment of ${it.name}.")
						} ?: tr("firmament.fitstealer.targetlost", "No longer logging equipment."),
					)
				}
			}
		}
	}
}