package nova.core.wrapper.mc.forge.v1_11_2.wrapper.block.forward;

import net.minecraft.block.SoundType;
import net.minecraft.init.SoundEvents;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.SoundEvent;
import nova.core.block.component.BlockProperty;

/**
 * @author winsock, soniex2, ExE Boss
 */
public class FWBlockSound extends SoundType {
	private final BlockProperty.BlockSound blockSound;

	/**
	 * Construct a new FWBlockSound
	 * @param blockSound The BlockSound to use.
	 */
	public FWBlockSound(BlockProperty.BlockSound blockSound) {
		super(1f, 1f, SoundEvents.BLOCK_STONE_BREAK, SoundEvents.BLOCK_STONE_STEP, SoundEvents.BLOCK_STONE_PLACE, SoundEvents.BLOCK_STONE_HIT, SoundEvents.BLOCK_STONE_FALL);
		this.blockSound = blockSound;
	}

	@Override
	public SoundEvent getBreakSound() {
		return blockSound.getSound(BlockProperty.BlockSound.BlockSoundTrigger.BREAK)
			.map(sound -> (sound.domain.isEmpty() && !sound.name.contains(".")) ? "dig." + sound.name : sound.getID())
			.map(soundID -> SoundEvent.REGISTRY.getObject(new ResourceLocation(soundID)))
			.orElseGet(super::getBreakSound);
	}

	@Override
	public SoundEvent getStepSound() {
		return blockSound.getSound(BlockProperty.BlockSound.BlockSoundTrigger.WALK)
			.map(sound -> (sound.domain.isEmpty() && !sound.name.contains(".")) ? "step." + sound.name : sound.getID())
			.map(soundID -> SoundEvent.REGISTRY.getObject(new ResourceLocation(soundID)))
			.orElseGet(super::getBreakSound);
	}

	@Override
	public SoundEvent getPlaceSound() {
		return blockSound.getSound(BlockProperty.BlockSound.BlockSoundTrigger.PLACE)
			.map(sound -> sound.domain.isEmpty() ? "step." + sound.name : sound.getID())
			.map(soundID -> SoundEvent.REGISTRY.getObject(new ResourceLocation(soundID)))
			.orElseGet(super::getPlaceSound);
	}
}