package chylex.bettersprinting.client;
import chylex.bettersprinting.BetterSprintingMod;
import chylex.bettersprinting.BetterSprintingProxy;
import chylex.bettersprinting.client.input.SprintKeyMode;
import chylex.bettersprinting.system.PacketPipeline;
import net.minecraft.client.GameSettings;
import net.minecraft.client.Minecraft;
import net.minecraft.client.settings.KeyBinding;
import net.minecraftforge.common.ForgeConfigSpec.BooleanValue;
import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.tuple.Triple;
import java.util.List;

public final class ClientProxy extends BetterSprintingProxy{
	@Override
	public void onConstructed(ModLoadingContext ctx){
		ClientSettings.register(ctx);
		PacketPipeline.initialize(new ClientNetwork());
	}
	
	@Override
	public void onLoaded(FMLLoadCompleteEvent e){
		Minecraft mc = Minecraft.getInstance();
		
		mc.execute(() -> {
			GameSettings settings = mc.gameSettings;
			
			settings.keyBindings = ArrayUtils.addAll(settings.keyBindings,
				ClientModManager.keyBindSprintToggle,
				ClientModManager.keyBindSneakToggle,
				ClientModManager.keyBindOptionsMenu
			);
			
			if (BetterSprintingMod.config.isNew()){
				ClientSettings.firstTimeSetup();
			}
			
			// this should work whether it's called before or after Forge's post-load GameSettings.loadOptions call
			ClientSettings.keyInfoSprintHold.writeInto(ClientModManager.keyBindSprintHold);
			ClientSettings.keyInfoSprintToggle.writeInto(ClientModManager.keyBindSprintToggle);
			ClientSettings.keyInfoSneakToggle.writeInto(ClientModManager.keyBindSneakToggle);
			ClientSettings.keyInfoOptionsMenu.writeInto(ClientModManager.keyBindOptionsMenu);
			KeyBinding.resetKeyBindingArrayAndHash();
		});
	}
	
	@Override
	public void migrateConfig(List<Triple<Character, String, String>> oldConfig){
		for(Triple<Character, String, String> entry:oldConfig){
			if (entry.getLeft() == 'B'){
				BooleanValue value;
				
				switch(entry.getMiddle()){
					case "disableMod":      value = ClientSettings.disableMod; break;
					case "enableDoubleTap": value = ClientSettings.enableDoubleTap; break;
					case "enableAllDirs":   value = ClientSettings.enableAllDirs; break;
					case "flyOnGround":     value = ClientSettings.flyOnGround; break;
					default: continue;
				}
				
				BetterSprintingMod.config.set(value, entry.getRight().equalsIgnoreCase("true"));
			}
			else if (entry.getLeft() == 'I' && entry.getMiddle().equals("flySpeedBoost")){
				BetterSprintingMod.config.set(ClientSettings.flySpeedBoost, Integer.parseInt(entry.getRight()));
			}
			else if (entry.getLeft() == 'S' && entry.getMiddle().equals("sprintKeyMode") && entry.getRight().equals("HOLD")){
				BetterSprintingMod.config.set(ClientSettings.sprintKeyMode, SprintKeyMode.HOLD);
			}
		}
	}
}