package de.maxhenkel.highlight;

import de.maxhenkel.highlight.proxy.ClientProxy;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraft.client.particle.EntityFX;
import net.minecraft.client.renderer.Vector3d;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.util.EnumParticleTypes;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraftforge.client.event.TextureStitchEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.InputEvent;

public class Events {

    @SubscribeEvent
    public void onKeyInput(InputEvent.KeyInputEvent event) {
        if (ClientProxy.getPointKey().isPressed()) {
            EntityPlayerSP player = Minecraft.getMinecraft().thePlayer;

            int renderDistance = Minecraft.getMinecraft().gameSettings.renderDistanceChunks * 16 + 1;

            Vec3d posVec = new Vec3d(player.posX, player.posY + player.getEyeHeight(), player.posZ);
            Vec3d lookVec = posVec.add(player.getLookVec().normalize().scale(renderDistance));
            // MovingObjectPosition mop = world.rayTraceBlocks(posVec, lookVec);
            RayTraceResult result = player.worldObj.rayTraceBlocks(posVec, lookVec);

            if (result == null) {
                return;
            }

            BlockPos pos = result.getBlockPos();

            IBlockState state = player.worldObj.getBlockState(pos);

            // double x = player.getLookVec().xCoord;
            // double y = player.getLookVec().yCoord;
            // double z = player.getLookVec().zCoord;

            
            Vec3d vec=Vec3d.ZERO.subtract(player.getLookVec());
            vec=vec.normalize();
            vec=vec.scale(Math.sqrt(2.0)/1.6);
            
            Vec3d blockVec=new Vec3d(pos.getX()+0.5, pos.getY()+0.5, pos.getZ()+0.5);
            
            Vec3d posParticle=blockVec.add(vec);
            /*
            Vec3d posCheck=posParticle.add(vec.scale(0.2));
            */
            BlockPos posPointer=new BlockPos(posParticle.xCoord, posParticle.yCoord, posParticle.zCoord);
            
            if(!player.worldObj.getBlockState(posPointer).equals(Blocks.air.getDefaultState())){
                if(player.getLookVec().yCoord>=0){
                    posParticle=posParticle.subtract(new Vec3d(0.0, 1.0, 0.0));
                }else{
                    posParticle=posParticle.add(new Vec3d(0.0, 1.0, 0.0));
                }
                
            }
            
            EntityFX particlePointer = new EntityParticlePointer(player.worldObj, posParticle.xCoord, posParticle.yCoord, posParticle.zCoord);

            Minecraft.getMinecraft().effectRenderer.addEffect(particlePointer);

            System.out.println("TEst: x:" + pos.getX() + "y:" + pos.getY() + "z:" + pos.getZ() + "   "
                    + state.getBlock().getUnlocalizedName());

        }

    }

    @SubscribeEvent
    public void onStitch(TextureStitchEvent.Pre event) {
        event.getMap().registerSprite(new ResourceLocation(Main.MODID +":items/pointer"));
    }

}
