package net.minecraft.src;

import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.GL11;

/**
 * PowerCraft's core mod class
 * 
 * @author MightyPork
 * @copy (c) 2012
 * 
 */
public class mod_PCcore extends BaseMod implements PCco_IModule{	

	/** instance of this class for easier accessing */
	public static mod_PCcore instance;

	/** version shared by all PC mod classes */
	public static final String VERSION = "3.3 for 1.2.5";

	// property keys
	public static final String pk_Reverse = "key.reversePlacing";
	private static final String pk_NewRec_Recyclation = "opt.newRecipes.recyclation";
	private static final String pk_NewRec_Spawner = "opt.newRecipes.spawner";
	private static final String pk_ID_CraftingTool = "id.item.craftingTool";

	/**
	 * Configuration file
	 */
	public static PCMP conf = new PCMP("/config/PC_CORE.properties", "PowerCraft global setup file\n");

	static {

		conf.put(pk_Reverse, Keyboard.KEY_LCONTROL, PCMPType.KEY);
		conf.put(pk_NewRec_Recyclation, true, PCMPType.BOOL);
		conf.put(pk_NewRec_Spawner, true, PCMPType.BOOL);

		conf.apply();
	}

	@Override
	public String getImgDir() {
		return "/PowerCraft/core/";
	}

	@Override
	public String getTerrainFile() {
		return getImgDir() + "tiles.png";
	}

	@Override
	public String getPriorities() {
		return "before:*";
	}


	@Override
	public String getVersion() {
		return VERSION;
	}

	/** Block with alternative terrain file */
	public static int swapTerrainRenderer = 0;
	/** block with rotated top face (gates and conveyors) */
	public static int rotatedBoxRenderer = 0;
	
	/** gate crafting tool */
	public static Item craftingTool = new PCco_ItemCraftingTool(conf.getInt(pk_ID_CraftingTool)).setItemName("PCloGateCrafter");


	@Override
	public void load() {
		instance = this;
		swapTerrainRenderer = ModLoader.getUniqueBlockModelID(this, true);
		rotatedBoxRenderer = ModLoader.getUniqueBlockModelID(this, true);
		
		
		craftingTool.setIconIndex(ModLoader.addOverride("/gui/items.png", imgDir + "gatecrafter.png"));

		ModLoader.addName(craftingTool, "PowerCraft's Crafting Tool");
		

		ModLoader.addRecipe(
				new ItemStack(craftingTool, 1, 0),
				new Object[] { " r ", "rIr", " r ",
					Character.valueOf('r'), Item.redstone, Character.valueOf('I'), Block.blockSteel });



		if (conf.getBoolean(pk_NewRec_Recyclation)) {
			ModLoader.addShapelessRecipe(new ItemStack(Block.sand, 4), new Object[] { Block.sandStone });
			ModLoader.addShapelessRecipe(new ItemStack(Block.planks, 6), new Object[] { Item.doorWood });
			ModLoader.addShapelessRecipe(new ItemStack(Block.planks, 8), new Object[] { Block.chest });
			ModLoader.addShapelessRecipe(new ItemStack(Block.planks, 4), new Object[] { Block.workbench });
			ModLoader.addShapelessRecipe(new ItemStack(Item.stick, 3), new Object[] { Block.fence });
			ModLoader.addShapelessRecipe(new ItemStack(Item.stick, 2), new Object[] { Block.ladder });
			ModLoader.addShapelessRecipe(new ItemStack(Block.planks, 6), new Object[] { Item.sign });
			ModLoader.addShapelessRecipe(new ItemStack(Item.ingotIron, 6), new Object[] { Item.doorSteel });
			ModLoader.addShapelessRecipe(new ItemStack(Item.ingotIron, 4), new Object[] { Item.compass });
			ModLoader.addShapelessRecipe(new ItemStack(Item.ingotGold, 4), new Object[] { Item.pocketSundial });
			ModLoader.addShapelessRecipe(new ItemStack(Block.cobblestone, 8), new Object[] { Block.stoneOvenIdle });
			ModLoader.addShapelessRecipe(new ItemStack(Block.blockSteel, 1, 0), new Object[] { craftingTool });
		}

		if (conf.getBoolean(pk_NewRec_Spawner)) {
			ModLoader.addRecipe(
					new ItemStack(Block.mobSpawner, 1),
					new Object[] { "SIS", "I I", "SIS",
						Character.valueOf('I'), Item.ingotIron, Character.valueOf('S'), Block.cobblestoneMossy });
		}
	}


	@Override
	public boolean renderWorldBlock(RenderBlocks renderblocks, IBlockAccess blockAccess, int i, int j, int k, Block block, int rtype) {
		
		RenderEngine renderengine = ModLoader.getMinecraftInstance().renderEngine;
		Tessellator tessellator = Tessellator.instance;
		int metaAt = blockAccess.getBlockMetadata(i, j, k);

		/**
		 * Standard block, but with swapped terrain
		 */
		if (rtype == swapTerrainRenderer && block instanceof PCco_ISwapTerrain) {
			tessellator.draw();
			tessellator.startDrawingQuads();
			renderengine.bindTexture(renderengine.getTexture(((PCco_ISwapTerrain) block).getTerrainFile()));

			boolean gf = RenderBlocks.cfgGrassFix;
			RenderBlocks.cfgGrassFix = false;

			block.setBlockBoundsBasedOnState(blockAccess, i, j, k);
			renderblocks.renderStandardBlock(block, i, j, k);

			RenderBlocks.cfgGrassFix = gf;

			tessellator.draw();
			tessellator.startDrawingQuads();
			renderengine.bindTexture(renderengine.getTexture("/terrain.png"));
			return true;
		}

		/**
		 * Rotated box
		 */
		if ((rtype == rotatedBoxRenderer) && block instanceof PCco_IRotatedBox) {

			tessellator.draw();
			tessellator.startDrawingQuads();

			if (block instanceof PCco_ISwapTerrain) renderengine.bindTexture(renderengine.getTexture(((PCco_ISwapTerrain) block).getTerrainFile()));

			block.setBlockBoundsBasedOnState(blockAccess, i, j, k);
			int l = ((PCco_IRotatedBox) block).getRotation(metaAt);
			int i1 = l;
			renderblocks.renderStandardBlock(block, i, j, k);

			tessellator.setBrightness(block.getMixedBrightnessForBlock(blockAccess, i, j, k));
			tessellator.setColorOpaque_F(1.0F, 1.0F, 1.0F);
			tessellator.setNormal(0.0F, 1F, 0.0F);
			int k1 = block.getBlockTexture(blockAccess, i, j, k, 1);
			int l1 = (k1 & 0xf) << 4;
			int i2 = k1 & 0xf0;
			double d5 = l1 / 256F;
			double d6 = (l1 + 15.99F) / 256F;
			double d7 = i2 / 256F;
			double d8 = (i2 + 15.99F) / 256F;
			double d9 = (block.maxY);
			double d10 = i + block.maxX;
			double d11 = i + block.maxX;
			double d12 = i + block.minX;
			double d13 = i + block.minX;
			double d14 = k + block.minZ;
			double d15 = k + block.maxZ;
			double d16 = k + block.maxZ;
			double d17 = k + block.minZ;
			double d18 = j + d9;
			if (i1 == 2) {
				d10 = d11 = i + block.minX;
				d12 = d13 = i + block.maxX;
				d14 = d17 = k + block.maxZ;
				d15 = d16 = k + block.minZ;
			} else if (i1 == 3) {
				d10 = d13 = i + block.minX;
				d11 = d12 = i + block.maxX;
				d14 = d15 = k + block.minZ;
				d16 = d17 = k + block.maxZ;
			} else if (i1 == 1) {
				d10 = d13 = i + block.maxX;
				d11 = d12 = i + block.minX;
				d14 = d15 = k + block.maxZ;
				d16 = d17 = k + block.minZ;
			}

			tessellator.addVertexWithUV(d13, d18, d17, d5, d7);
			tessellator.addVertexWithUV(d12, d18, d16, d5, d8);
			tessellator.addVertexWithUV(d11, d18, d15, d6, d8);
			tessellator.addVertexWithUV(d10, d18, d14, d6, d7);

			tessellator.draw();
			tessellator.startDrawingQuads();
			if (block instanceof PCco_ISwapTerrain) renderengine.bindTexture(renderengine.getTexture("/terrain.png"));

			return true;
		}

		return false;
	}


	@Override
	public void renderInvBlock(RenderBlocks renderblocks, Block block, int i, int rtype) {
		RenderEngine renderengine = ModLoader.getMinecraftInstance().renderEngine;
		Tessellator tessellator = Tessellator.instance;

		/**
		 * Normal block with swapped terrain
		 */
		if (rtype == swapTerrainRenderer && block instanceof PCco_ISwapTerrain) {
			int[] textures = new int[6];
			if (block instanceof PCco_IInvTextures) {
				for (int a = 0; a < 6; a++)
					textures[a] = ((PCco_IInvTextures) block).getInvTexture(a, i);
			} else {
				for (int a = 0; a < 6; a++)
					textures[a] = block.getBlockTextureFromSideAndMetadata(a, i);
			}

			renderengine.bindTexture(renderengine.getTexture(((PCco_ISwapTerrain) block).getTerrainFile()));

			block.setBlockBoundsForItemRender();
			GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
			tessellator.startDrawingQuads();
			tessellator.setNormal(0.0F, -1F, 0.0F);
			renderblocks.renderBottomFace(block, 0.0D, 0.0D, 0.0D, textures[0]);
			tessellator.draw();
			tessellator.startDrawingQuads();
			tessellator.setNormal(0.0F, 1.0F, 0.0F);
			renderblocks.renderTopFace(block, 0.0D, 0.0D, 0.0D, textures[1]);
			tessellator.draw();
			tessellator.startDrawingQuads();
			tessellator.setNormal(0.0F, 0.0F, -1F);
			renderblocks.renderEastFace(block, 0.0D, 0.0D, 0.0D, textures[2]);
			tessellator.draw();
			tessellator.startDrawingQuads();
			tessellator.setNormal(0.0F, 0.0F, 1.0F);
			renderblocks.renderWestFace(block, 0.0D, 0.0D, 0.0D, textures[3]);
			tessellator.draw();
			tessellator.startDrawingQuads();
			tessellator.setNormal(-1F, 0.0F, 0.0F);
			renderblocks.renderNorthFace(block, 0.0D, 0.0D, 0.0D, textures[4]);
			tessellator.draw();
			tessellator.startDrawingQuads();
			tessellator.setNormal(1.0F, 0.0F, 0.0F);
			renderblocks.renderSouthFace(block, 0.0D, 0.0D, 0.0D, textures[5]);
			tessellator.draw();
			GL11.glTranslatef(0.5F, 0.5F, 0.5F);

			renderengine.bindTexture(renderengine.getTexture("/terrain.png"));

			return;
		}

		/**
		 * Rotated box
		 */
		if (rtype == rotatedBoxRenderer && block instanceof PCco_IRotatedBox) {

			if (block instanceof PCco_ISwapTerrain) renderengine.bindTexture(renderengine.getTexture(((PCco_ISwapTerrain) block).getTerrainFile()));

			if (((PCco_IRotatedBox) block).allSidesRotate()) {
				block.setBlockBoundsForItemRender();
				GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
				tessellator.startDrawingQuads();
				tessellator.setNormal(0.0F, -1F, 0.0F);
				renderblocks.renderBottomFace(block, 0.0D, 0.0D, 0.0D, block.getBlockTextureFromSideAndMetadata(0, i));
				tessellator.draw();
				tessellator.startDrawingQuads();
				tessellator.setNormal(0.0F, 1.0F, 0.0F);
				renderblocks.renderTopFace(block, 0.0D, 0.0D, 0.0D, block.getBlockTextureFromSideAndMetadata(1, i));
				tessellator.draw();
				tessellator.startDrawingQuads();
				tessellator.setNormal(0.0F, 0.0F, -1F);
				renderblocks.renderEastFace(block, 0.0D, 0.0D, 0.0D, block.getBlockTextureFromSideAndMetadata(2, i));
				tessellator.draw();
				tessellator.startDrawingQuads();
				tessellator.setNormal(0.0F, 0.0F, 1.0F);
				renderblocks.renderWestFace(block, 0.0D, 0.0D, 0.0D, block.getBlockTextureFromSideAndMetadata(3, i));
				tessellator.draw();
				tessellator.startDrawingQuads();
				tessellator.setNormal(-1F, 0.0F, 0.0F);
				renderblocks.renderNorthFace(block, 0.0D, 0.0D, 0.0D, block.getBlockTextureFromSideAndMetadata(4, i));
				tessellator.draw();
				tessellator.startDrawingQuads();
				tessellator.setNormal(1.0F, 0.0F, 0.0F);
				renderblocks.renderSouthFace(block, 0.0D, 0.0D, 0.0D, block.getBlockTextureFromSideAndMetadata(5, i));
				tessellator.draw();
				GL11.glTranslatef(0.5F, 0.5F, 0.5F);
			} else {

				block.setBlockBounds(-0.1F, -0.1F, 0.4F, 1.1F, 1.1F, 0.6F);

				GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
				tessellator.startDrawingQuads();
				tessellator.setNormal(0.0F, -1F, 0.0F);
				renderblocks.renderBottomFace(block, 0.0D, 0.0D, 0.0D, block.getBlockTextureFromSideAndMetadata(0, i));
				tessellator.draw();
				tessellator.startDrawingQuads();
				tessellator.setNormal(0.0F, 1.0F, 0.0F);
				renderblocks.renderTopFace(block, 0.0D, 0.0D, 0.0D, block.getBlockTextureFromSideAndMetadata(0, i));
				tessellator.draw();
				tessellator.startDrawingQuads();
				tessellator.setNormal(0.0F, 0.0F, -1F);
				renderblocks.renderEastFace(block, 0.0D, 0.0D, 0.0D, block.getBlockTextureFromSideAndMetadata(0, i));
				tessellator.draw();
				tessellator.startDrawingQuads();
				tessellator.setNormal(0.0F, 0.0F, 1.0F);
				renderblocks.renderWestFace(block, 0.0D, 0.0D, 0.0D, block.getBlockTextureFromSideAndMetadata(1, i));
				tessellator.draw();
				tessellator.startDrawingQuads();
				tessellator.setNormal(-1F, 0.0F, 0.0F);
				renderblocks.renderNorthFace(block, 0.0D, 0.0D, 0.0D, block.getBlockTextureFromSideAndMetadata(0, i));
				tessellator.draw();
				tessellator.startDrawingQuads();
				tessellator.setNormal(1.0F, 0.0F, 0.0F);
				renderblocks.renderSouthFace(block, 0.0D, 0.0D, 0.0D, block.getBlockTextureFromSideAndMetadata(0, i));
				tessellator.draw();
				GL11.glTranslatef(0.5F, 0.5F, 0.5F);

			}

			if (block instanceof PCco_ISwapTerrain) renderengine.bindTexture(renderengine.getTexture("/terrain.png"));
			return;
		}
	}

}
