package chylex.bettersprinting.client.gui;
import net.minecraft.client.GameSettings;
import net.minecraft.client.Minecraft;
import net.minecraft.client.settings.KeyBinding;
import net.minecraft.client.util.InputMappings;
import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.client.settings.KeyModifier;
import java.util.function.Consumer;

@OnlyIn(Dist.CLIENT)
public final class GuiButtonInputBinding extends GuiButtonCustomInput{
	private static final GameSettings settings = Minecraft.getInstance().gameSettings;
	
	public final KeyBinding binding;
	private final Consumer<GuiButtonInputBinding> onClick;
	private boolean isSelected;
	
	public GuiButtonInputBinding(int x, int y, KeyBinding binding, Consumer<GuiButtonInputBinding> onClick){
		super(x, y, "", binding == settings.keyBindSprint ? "bs.sprint.hold" : binding.getKeyDescription());
		this.binding = binding;
		this.onClick = onClick;
		updateKeyBindingText();
	}
	
	@Override
	public void onPress(){
		onClick.accept(this);
	}
	
	public void setSelected(boolean isSelected){
		this.isSelected = isSelected;
		updateKeyBindingText();
	}
	
	public boolean isSelected(){
		return isSelected;
	}
	
	public void setBinding(InputMappings.Input input){
		binding.bind(input);
		isSelected = false;
	}
	
	public void setBinding(KeyModifier modifier, InputMappings.Input input){
		binding.setKeyModifierAndCode(modifier, input);
		isSelected &= KeyModifier.isKeyCodeModifier(input) && modifier != KeyModifier.NONE;
	}
	
	public void updateKeyBindingText(){
		boolean hasConflict = false;
		boolean hasOnlyModifierConflict = true;
		
		if (!binding.isInvalid()){
			for(KeyBinding other:settings.keyBindings){
				if (binding != other && binding.conflicts(other)){
					hasConflict = true;
					hasOnlyModifierConflict &= binding.hasKeyCodeModifierConflict(other);
				}
			}
		}
		
		if (isSelected){
			setMessage(TextFormatting.WHITE + "> " + TextFormatting.YELLOW + binding.getLocalizedName() + TextFormatting.WHITE + " <");
		}
		else if (hasConflict){
			setMessage((hasOnlyModifierConflict ? TextFormatting.GOLD : TextFormatting.RED) + binding.getLocalizedName());
		}
		else{
			setMessage(binding.getLocalizedName());
		}
	}
}