package tonius.simplyjetpacks.client;

import java.util.Random;

import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.GuiErrorScreen;
import net.minecraft.client.settings.GameSettings;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
import tonius.simplyjetpacks.CommonProxy;
import tonius.simplyjetpacks.client.handler.ClientTickHandler;
import tonius.simplyjetpacks.client.handler.HUDTickHandler;
import tonius.simplyjetpacks.client.handler.KeyHandler;
import tonius.simplyjetpacks.client.util.ParticleUtils;
import tonius.simplyjetpacks.setup.ParticleType;
import cofh.lib.util.helpers.MathHelper;
import cpw.mods.fml.client.CustomModLoadingErrorDisplayException;
import cpw.mods.fml.common.FMLCommonHandler;

public class ClientProxy extends CommonProxy {
    
    private static final Minecraft mc = Minecraft.getMinecraft();
    
    @Override
    public void registerHandlers() {
        super.registerHandlers();
        
        FMLCommonHandler.instance().bus().register(new ClientTickHandler());
        FMLCommonHandler.instance().bus().register(new KeyHandler());
        FMLCommonHandler.instance().bus().register(new HUDTickHandler());
    }
    
    @Override
    public void showJetpackParticles(World world, EntityLivingBase wearer, ParticleType particle) {
        if (mc.gameSettings.particleSetting == 0 || mc.gameSettings.particleSetting == 1 && mc.theWorld.getTotalWorldTime() % 4L == 0) {
            Vec3 userPos = Vec3.createVectorHelper(wearer.posX, wearer.posY, wearer.posZ);
            
            if (!wearer.equals(mc.thePlayer)) {
                userPos = userPos.addVector(0, 1.6D, 0);
            }
            
            Random rand = MathHelper.RANDOM;
            
            Vec3 vLeft = Vec3.createVectorHelper(-0.28D, -0.95D, -0.38D);
            vLeft.rotateAroundY((float) Math.toRadians(-wearer.renderYawOffset));
            
            Vec3 vRight = Vec3.createVectorHelper(0.28D, -0.95D, -0.38D);
            vRight.rotateAroundY((float) Math.toRadians(-wearer.renderYawOffset));
            
            Vec3 vCenter = Vec3.createVectorHelper((rand.nextFloat() - 0.5F) * 0.25F, -0.95D, -0.38D);
            vCenter.rotateAroundY((float) Math.toRadians(-wearer.renderYawOffset));
            
            vLeft = vLeft.addVector(-wearer.motionX * 0.2D, -wearer.motionY * 0.2D, -wearer.motionZ * 0.2D);
            vRight = vRight.addVector(-wearer.motionX * 0.2D, -wearer.motionY * 0.2D, -wearer.motionZ * 0.2D);
            vCenter = vCenter.addVector(-wearer.motionX * 0.2D, -wearer.motionY * 0.2D, -wearer.motionZ * 0.2D);
            
            Vec3 v = userPos.addVector(vLeft.xCoord, vLeft.yCoord, vLeft.zCoord);
            ParticleUtils.spawnParticle(particle, world, v.xCoord, v.yCoord, v.zCoord, rand.nextDouble() * 0.05D - 0.025D, -0.2D, rand.nextDouble() * 0.05D - 0.025D);
            
            v = userPos.addVector(vRight.xCoord, vRight.yCoord, vRight.zCoord);
            ParticleUtils.spawnParticle(particle, world, v.xCoord, v.yCoord, v.zCoord, rand.nextDouble() * 0.05D - 0.025D, -0.2D, rand.nextDouble() * 0.05D - 0.025D);
            
            v = userPos.addVector(vCenter.xCoord, vCenter.yCoord, vCenter.zCoord);
            ParticleUtils.spawnParticle(particle, world, v.xCoord, v.yCoord, v.zCoord, rand.nextDouble() * 0.05D - 0.025D, -0.2D, rand.nextDouble() * 0.05D - 0.025D);
        }
    }
    
    @Override
    public void updateCustomKeybinds(String flyKeyName, String descendKeyName) {
        KeyHandler.updateCustomKeybinds(flyKeyName, descendKeyName);
    }
    
    @Override
    public String getPackGUIKey() {
        int keyCode = KeyHandler.keyOpenPackGUI.getKeyCode();
        if (keyCode == 0) {
            return null;
        }
        return GameSettings.getKeyDisplayString(keyCode);
    }
    
    @Override
    @SuppressWarnings("serial")
    public void throwCoFHLibException() {
        throw new CustomModLoadingErrorDisplayException() {
            
            @Override
            public void initGui(GuiErrorScreen errorScreen, FontRenderer fontRenderer) {
            }
            
            @Override
            public void drawScreen(GuiErrorScreen gui, FontRenderer fontRenderer, int mouseRelX, int mouseRelY, float tickTime) {
                gui.drawDefaultBackground();
                gui.drawCenteredString(fontRenderer, "Simply Jetpacks Error - CoFHLib Not Found", gui.width / 2, 85, 0xFF5555);
                
                gui.drawCenteredString(fontRenderer, "CoFHLib is not installed or not up to date.", gui.width / 2, 100, 0xFFFFFF);
                gui.drawCenteredString(fontRenderer, "Please install CoFH Core 3.0.2 or newer, or CoFHLib standalone 1.0.2 or newer.", gui.width / 2, 110, 0xFFFFFF);
            }
            
        };
    }
    
}